Lucene: Multifield searches



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


Read full article from Lucene: Multifield searches


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts