Rohit Gupta

Engaging talk on Microsoft Technologies ....My Resume

  Home  |   Contact  |   Syndication    |   Login
  39 Posts | 0 Stories | 52 Comments | 0 Trackbacks

News



Twitter












Archives

Image Galleries

Personal

Wednesday, January 07, 2009 #

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);
Now if you need to search the term that must exist in both the fields then we use the following:
   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

  • Share This Post:
  • Share on Twitter
  • Share on Facebook
  • Share on Technorati