Thanks for this example. I am uncertain about one detail: How do I achieve a search for multiple keywords. Not just "green tree" but also "short road", "sky", "bird"? Is there a chance to add those keywords to the "Query q = qp.parse("\"green tree\"");" command?
Shai Erera wrote: > > How about using MultiFieldQueryParser. Here is a short main I wrote: > > Directory dir = new RAMDirectory(); > Analyzer analyzer = new StandardAnalyzer(); > IndexWriter writer = new IndexWriter(dir, analyzer); > Document doc = new Document(); > doc.add(new Field("field1", "green tree", Store.NO, > Index.TOKENIZED > )); > writer.addDocument(doc); > doc = new Document(); > doc.add(new Field("field2", "green tree", Store.NO, > Index.TOKENIZED > )); > writer.addDocument(doc); > writer.close(); > > IndexSearcher searcher = new IndexSearcher(dir); > MultiFieldQueryParser qp = new MultiFieldQueryParser(new String[] > { > "field1", "field2" }, analyzer); > Query q = qp.parse("\"green tree\""); > if (q instanceof BooleanQuery /* Basically this should almost > always > be true */) { > BooleanClause[] clauses = ((BooleanQuery) q).getClauses(); > for (int i = 0; i < clauses.length; i++) { > clauses[i].setOccur(Occur.SHOULD); /* This is their > setting > by default though */ > } > } > Hits hits = searcher.search(q); > System.out.println(hits.length()); /* Should print 2. */ > searcher.close(); > > > On Nov 22, 2007 3:26 PM, Erick Erickson <[EMAIL PROTECTED]> wrote: > >> The semantics of the phrase query you're constructing probably aren't >> what you think. As best I can infer, you are trying to do something >> like >> >> "green tree" in field1 >> or >> "green tree" in field 2 >> >> but that's not even close to what you're constructing. >> >> It would help a show what the query you want is in some form >> like that above before trying to code it, because the actual >> query you're making is something like asking for the phrase >> "word1 in field1 word1 in field2 word2 in field1 word2 in field2" >> >> Actually, I can't render the semantics of what you're doing int English. >> And Lucene can't parse it either. >> >> I suspect you want something like >> PhraseQuery pq1 >> PhraseQuery pq2 >> for (String word : words) { >> pq1.add(...); >> pq2.add(...) >> } >> BooleanQuery bq(). >> bq.add(p1, .... SHOULD); >> bq.add(p2, ... SHOULD); >> >> Index.search(bq); >> >> Best >> Erick >> >> On Nov 22, 2007 7:17 AM, Rapthor <[EMAIL PROTECTED]> wrote: >> >> > >> > There is no option to provide an Occur.SHOULD to the PhraseQuery. So >> where >> > does it go? I changed the source to look like this: >> > >> > PhraseQuery pq = new PhraseQuery(); >> > for (String word : words) { >> > for (String field : fields) { >> > pq.add(new Term(field, word)); >> > } >> > } >> > Hits hits = indexSearcher.search(pq); >> > >> > However, I get an exception: >> > java.lang.IllegalArgumentException: All phrase terms must be in the >> same >> > field: description:green tree >> > >> > I don't understand how to a) search for combinations of words like >> "green >> > tree", b) search in multiple fields (description, text, ...) and c) >> search >> > by a SHOULD restriction. >> > -- >> > View this message in context: >> > http://www.nabble.com/AND-query-in-SHOULD-tf4855719.html#a13895700 >> > Sent from the Lucene - Java Users mailing list archive at Nabble.com. >> > >> > >> > --------------------------------------------------------------------- >> > To unsubscribe, e-mail: [EMAIL PROTECTED] >> > For additional commands, e-mail: [EMAIL PROTECTED] >> > >> > >> > > > > -- > Regards, > > Shai Erera > > -- View this message in context: http://www.nabble.com/AND-query-in-SHOULD-tf4855719.html#a13923009 Sent from the Lucene - Java Users mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]