(title:foo^4 OR abstract:foo^2 OR content:foo) AND
  (title:bar^4 OR abstract:bar^2 OR content:bar)

That's not the way MultiFieldQueryParser will rewrite your query.

You are right - what happens is this:

  (title:foo OR title:bar) OR
  (abstract:foo OR abstract:bar) OR
  (content:foo OR content:bar) OR

Looks like a dead end... On the other hand I just realize I could subclass the QueryParser, e.g.:

import java.util.Vector;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.Query;

public class CustomQueryParser
  extends QueryParser
{
  private String[] fields;

  public CustomQueryParser(String[] fields, Analyzer analyzer)
  {
    super(null, analyzer);
    this.fields = fields;
  }


protected Query getFieldQuery(String field, Analyzer analyzer, String queryText)
throws ParseException
{
if (field == null)
{
Vector clauses = new Vector();
for (int i = 0; i < fields.length; i++)
clauses.add(new BooleanClause(super.getFieldQuery(fields[i], analyzer, queryText), false, false));
return getBooleanQuery(clauses);
}


    return super.getFieldQuery(field, analyzer, queryText);
  }
}

Now:

String[] fields = new String[] { "title", "abstract", "content" };
QueryParser parser = new CustomQueryParser(fields, new SimpleAnalyzer());
parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);
Query query = parser.parse("foo -bar (baz OR title:bla)");
System.out.println("? " + query);

Produces:

? +(title:foo abstract:foo content:foo) -(title:bar abstract:bar content:bar) +((title:baz abstract:baz content:baz) title:bla)

Perfect!

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to