Uploaded image for project: 'Lucene - Core'
  1. Lucene - Core
  2. LUCENE-158

[PATCH] MultiFieldQueryParser, can't change default search operator

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.2
    • Fix Version/s: 1.9
    • Component/s: core/queryparser
    • Labels:
      None
    • Environment:

      Operating System: Linux
      Platform: Other

    • Bugzilla Id:
      24265

      Description

      Bug detected by Bernhard, submitted via Christoph

      bug occured with 1.3 rc2

      just played around with the MultiFieldQueryParser and didn't find a working way
      to change the "operator" value.

      The problem is that MultiFieldQueryParser is implementing two public static
      methods "parse" only. Calling one of those, in the extended superclass, the
      static method implementation for "parse" is called. Due to the fact that the
      QueryParser class creates a new Instance for each call thru the static method,
      the "operator" flag is simply ignored.

      There would be a simple fix within MultiFieldQueryParser class without touching
      the rest of the system. One have to add a new non static method "parse" which
      could look like this:

      /***********************************************************/
      public Query parse(String query, String[] fields) throws ParseException {
      BooleanQuery bQuery = new BooleanQuery();

      for (int i = 0; i < fields.length; i++)

      { QueryParser parser = new QueryParser(fields[i], analyzer); parser.setOperator(getOperator()); Query q = parser.parse(query); bQuery.add(q, false, false); }

      return bQuery;
      }
      /***********************************************************/

      To test the new implementation, following code fragment can be used:

      /***********************************************************/
      Directory directory = FSDirectory.getDirectory("/tmp/idx-test", false);
      Analyzer analyzer = new SimpleAnalyzer();
      Searcher searcher = new IndexSearcher(directory);
      Hits hits = null;
      String[] fields =

      { "contents", "title" }

      ;
      MultiFieldQueryParser parser = new MultiFieldQueryParser("britney
      spears", analyzer);
      parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);
      Query query = parser.parse("britney spears", fields);
      System.out.println("Query: " + query.toString());
      hits = searcher.search(query);

      System.out.println ("Results: " + hits.length());
      searcher.close();
      /***********************************************************/

      best regards

      Bernhard

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              goller@detego-software.de Christoph Goller
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: