We can run multifield searches in Lucene using either the BooleanQuery API or using the MultiFieldQueryParser for parsing the query text. For e.g. If a index has 2 fields FirstName and LastName and if you need to search for "John" in the FirstName field and "Travis" in the LastName field one can use a Boolean Query as such:
1: BooleanQuery bq = new BooleanQuery();
2: Query qf = new TermQuery(new Lucene.Net.Index.Term("FirstName", "John"));
3: Query ql = new TermQuery(new Lucene.Net.Index.Term("LastName", "Travis"));
4: bq.Add(qf, BooleanClause.Occur.MUST);
5: bq.Add(ql, BooleanClause.Occur.MUST);
6: IndexSearcher srchr = new IndexSearcher(@"C:\indexDir");
7: srchr.Search(bq);
Now if we need to search a single term across either of the FirstName and LastName fields then we can use the MultiFieldQueryParser as follows:
1: Query query = MultiFieldQueryParser.parse("commonName", new String[] { "FirstName", "LastName" },new SimpleAnalyzer());
2: srchr.Search(query);
1: Query query = MultiFieldQueryParser.Parse("commonName",
2: new String[] { "FirstName", "LastName" },
3: new BooleanClause.Occur[] { BooleanClause.Occur.MUST,BooleanClause.Occur.MUST},
4: new SimpleAnalyzer());
5: srchr.Search(query);
Finally if you don’t want a term to occur in one of the Fields (say FirstName) then use:
1:
2: Query query = MultiFieldQueryParser.Parse("commonName",
3: new String[] { "FirstName", "LastName" },
4: new BooleanClause.Occur[] { BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.MUST},
5: new SimpleAnalyzer());
6: srchr.Search(query);
so if you need to search a single term across multiple fields then use MultiFieldQueryParser, if you need to search different terms in different fields then use the BooleanQuery as shown first
Read full article from Lucene: Multifield searches
No comments:
Post a Comment