|
Re: Is this query possible? SOLVED: msg#00030lucene-net-dev.incubator.apache.org
In case anyone is interested and has a similar requirement, here's how I solved this problem (source below): Usage: var parser = new QueryParser("fulltext", new StandardAnalyzer()); parser.SetDefaultOperator(QueryParser.Operator.AND); var searchQuery = parser.Parse("car"); var softBooleanQuery = new SoftBooleanQuery(); var visibleQuery = new SoftTermQuery(new Term("visible", "1")); softBooleanQuery.Add(searchQuery, BooleanClause.Occur.MUST); softBooleanQuery.Add(visibleQuery, BooleanClause.Occur.MUST); ... search with softBooleanQuery ... Helper classes: public class SoftBooleanQuery : BooleanQuery { public override Query Rewrite(IndexReader reader) { restart: foreach (BooleanClause clause in Clauses()) { var softQuery = clause.GetQuery() as SoftTermQuery; if (softQuery != null) { if (softQuery.Rewrite(reader) == null) { // rewritten query is null, remove it from the clauses (see SoftTermQuery.Rewrite) Clauses().Remove(clause); goto restart; } } } return base.Rewrite(reader); } } public class SoftTermQuery : TermQuery { public SoftTermQuery(Term t) : base(t) { } public static bool IsTermIndexed(IndexReader reader, Term t) { return reader.Terms(t).Term().Field() == t.Field(); } public override Query Rewrite(IndexReader reader) { Term t = GetTerm(); // if the term does not exist in this IndexReader, return null return IsTermIndexed(reader, t) ? base.Rewrite(reader) : null; } public override string ToString(string field) { return base.ToString(field); } } Andrew C. Smith wrote: Maybe you can perform the OR clause with the MultiSearcher and use a custom
|
|
||||||||||||||||||||||||||
|
|
|
| News | Mail Home | sitemap | FAQ | advertise |