-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 7:41 am 
Beginner
Beginner

Joined: Tue Sep 28, 2010 5:14 am
Posts: 25
Hi,

I am trying to combine an existing multiFieldQuery with another boolean query to form an AND clause. If I just use the luceneQuery argument the results returned matches perfectly with what is returned in Luke. However with the code below, if I append/merge another query to the MultiFieldQueryParser string, the result size is zero though Luke returns back few record. Just want to know if we can merge a multiFieldQuery with another query. If yes, is this the proper way or I am missing out something.

Code:

public List<?> genericTPEmployeesSearch(String searchQuery, String clause, SearchBean bean){
      
      String[] searchFields = getSearchFields();

      FullTextSession ftSession = SessionUtil.getFullTextSessionInstance();
      
      //Parser meant for  using all the fields used for search
      MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(
            searchFields, ftSession.getSearchFactory().getAnalyzer(TP_Employee.class));
      
      if(clause.equals(and)){
         multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
      } else {
         multiQueryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
      }   
      
      try {
          BooleanQuery luceneQuery = (BooleanQuery)multiQueryParser.parse(makeGenericQueryString(searchQuery));

          org.apache.lucene.search.Query query1 = new TermQuery(new Term("busDivision", "Corporate center"));
          BooleanQuery booleanQuery1 = new BooleanQuery();
          booleanQuery1.add(query1, BooleanClause.Occur.SHOULD);
         
          BooleanQuery[] booleanQueries = {booleanQuery1, luceneQuery};
         
         
          //Returns results from index rather than database with fields as arg
          List<Object[]> results = ftSession.createFullTextQuery(BooleanQuery.mergeBooleanQueries(booleanQueries), TP_Employee.class)                                      .setProjection("emplid",
                                                    "busFirstName",
                                                    "busLastName",
                                                    "busEmailAdd",
                                                    "busPhone",
                                                    "lineManager",
                                                    "busDivision",
                                                    "busUnit",
                                                  "busArea",
                                                  "busSector",
                                                  "busSegment",
                                                  "location",
                                                  "country",
                                                  "city",
                                                  "state",
                                                  "busTitle",
                                                    "rankDesc",
                                                  "latestHireDate",
                                                  "profileUpdateDate",
                                                  "isHrbpHrm",
                                                  "education.description",
                                                  "education.accomplishmentCat",
                                                  "education.accomplishment",
                                                  FullTextQuery.SCORE)
                                      .list();
         
          return results;
             
      } catch (ParseException e) {
         e.printStackTrace();
      }
      
      return null;
      
   }


--Manoj


Top
 Profile  
 
 Post subject: Re: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 10:32 am 
Hibernate Team
Hibernate Team

Joined: Thu Apr 05, 2007 5:52 am
Posts: 1689
Location: Sweden
Have you tried something like this

Quote:
Code:
...
                                  BooleanQuery booleanQuery = new BooleanQuery();
                              Query luceneQuery = multiQueryParser.parse(makeGenericQueryString(searchQuery));
                                  booleanQuery.add(luceneQuery, BooleanClause.Occur.MUST);

          org.apache.lucene.search.Query termQuery = new TermQuery(new Term("busDivision", "Corporate center"));
                                   booleanQuery.add(termQuery, BooleanClause.Occur.MUST);

         
         
          //Returns results from index rather than database with fields as arg
          List<Object[]> results = ftSession.createFullTextQuery(booleanQuery), TP_Employee.class)                                      .setProjection("emplid",
                                                    "busFirstName",
                                                    "busLastName",
                                                    "busEmailAdd",
                                                    "busPhone",
                                                    "lineManager",
                                                    "busDivision",
                                                    "busUnit",
                                                  "busArea",
                                                  "busSector",
                                                  "busSegment",
                                                  "location",
                                                  "country",
                                                  "city",
                                                  "state",
                                                  "busTitle",
                                                    "rankDesc",
                                                  "latestHireDate",
                                                  "profileUpdateDate",
                                                  "isHrbpHrm",
                                                  "education.description",
                                                  "education.accomplishmentCat",
                                                  "education.accomplishment",
                                                  FullTextQuery.SCORE)
                                      .list();
...         



Top
 Profile  
 
 Post subject: Re: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 11:20 am 
Beginner
Beginner

Joined: Tue Sep 28, 2010 5:14 am
Posts: 25
Hi Hardy,

Yes, I did test with that code. The query is perfectly fine and it returns me proper results when I run the query in Luke. The problem is when I run that in application.

Code:
List<Object[]> results = ftSession.createFullTextQuery(booleanQuery, TP_Employee.class)
                                      .setProjection("emplid",
                                                    "busFirstName",
                                                    "busLastName",
                                                    "busEmailAdd",
                                                    "busPhone",
                                                    "lineManager",
                                                    "busDivision",
                                                    "busUnit",
                                                  "busArea",
                                                  "busSector",
                                                  "busSegment",
                                                  "location",
                                                  "country",
                                                  "city",
                                                  "state",
                                                  "busTitle",
                                                    "rankDesc",
                                                  "latestHireDate",
                                                  "profileUpdateDate",
                                                  "isHrbpHrm",
                                                  "education.description",
                                                  "education.accomplishmentCat",
                                                  "education.accomplishment",
                                                  FullTextQuery.SCORE)
                                      .list();



Ideally, I should be expecting the same number of records in both luke and the API call. But, it doesn't.


Top
 Profile  
 
 Post subject: Re: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 11:26 am 
Hibernate Team
Hibernate Team

Joined: Thu Apr 05, 2007 5:52 am
Posts: 1689
Location: Sweden
In your code you are using a custom analyzer when creating the MultiFieldQueryParser. Are you using the same analyzer in Luke? That could explain different result sets.


Top
 Profile  
 
 Post subject: Re: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 12:24 pm 
Beginner
Beginner

Joined: Tue Sep 28, 2010 5:14 am
Posts: 25
Tried making change to the analyser as well to be same as that in Luke but no luck. Still same issue.

Here is the updated code snippet:

Code:
public List<?> genericTPEmployeesSearch(String searchQuery, String clause, SearchBean bean){
      
      
      String[] searchFields = getSearchFields();

      FullTextSession ftSession = SessionUtil.getFullTextSessionInstance();
      
      //Parser meant for  using all the fields used for search
      MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(searchFields, new StandardAnalyzer());
      
      if(clause.equals(and)){
         multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
      } else {
         multiQueryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
      }   
      
      try {
          //BooleanQuery luceneQuery = (BooleanQuery)multiQueryParser.parse(makeGenericQueryString(searchQuery));

         BooleanQuery booleanQuery = new BooleanQuery();   
         org.apache.lucene.search.Query luceneQuery = multiQueryParser.parse(searchQuery);
         booleanQuery.add(luceneQuery, BooleanClause.Occur.SHOULD);

         FullTextQuery fullTextQuery = ftSession.createFullTextQuery(booleanQuery, TP_Employee.class);
         
         org.apache.lucene.search.Query termQuery = new TermQuery(new Term("busDivision", "Corporate"));
            booleanQuery.add(termQuery, BooleanClause.Occur.MUST);

             //Returns results from index rather than database with fields as arg
         
          List<Object[]> results = ftSession.createFullTextQuery(booleanQuery, TP_Employee.class)
                                     .setProjection("emplid",
                                                    "busFirstName",
                                                    "busLastName",
                                                    "busEmailAdd",
                                                    "busPhone",
                                                    "lineManager",
                                                    "busDivision",
                                                    "busUnit",
                                                  "busArea",
                                                  "busSector",
                                                  "busSegment",
                                                  "location",
                                                  "country",
                                                  "city",
                                                  "state",
                                                  "busTitle",
                                                    "rankDesc",
                                                  "latestHireDate",
                                                  "profileUpdateDate",
                                                  "isHrbpHrm",
                                                  "education.description",
                                                  "education.accomplishmentCat",
                                                  "education.accomplishment",
                                                  FullTextQuery.SCORE)
                                      .list();
         
          return results;
             
      } catch (ParseException e) {
         e.printStackTrace();
      }


Top
 Profile  
 
 Post subject: Re: Combining MultiFieldQuery with another boolean query
PostPosted: Tue Dec 07, 2010 12:27 pm 
Hibernate Team
Hibernate Team

Joined: Thu Apr 05, 2007 5:52 am
Posts: 1689
Location: Sweden
Which branch is your code executing in this code:
Code:
     if(clause.equals(and)){
         multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
      } else {
         multiQueryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
      }

The default would be OR. Depending on your code you might use a different setting in your code compared to Luke.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
cron
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.