Hi All

 Sorry to bother you.The happiest thing is  studying the Lucene source
codes,thank you for all the  great works .


  About the BooleanQuery.I am encountered by a question about the execution
of BooleanQuery:although,BooleanQuery#rewrite has done some  works to
remove duplicate FILTER,SHOULD clauses.however still the same term query
can been executed the several times.

  I copied the test code in the TestBooleanQuery to confirm my assumption.

  Unit Test Code as follows:



BooleanQuery.Builder qBuilder = new BooleanQuery.Builder();

qBuilder = new BooleanQuery.Builder();

qBuilder.add(new TermQuery(new Term("field", "b")), Occur.*FILTER*);

qBuilder.add(new TermQuery(new Term("field", "a")), Occur.*SHOULD*);

qBuilder.add(new TermQuery(new Term("field", "d")), Occur.*SHOULD*);

BooleanQuery.Builder nestQuery  = new BooleanQuery.Builder();

nestQuery.add(new TermQuery(new Term("field", "b")), Occur.*FILTER*);

nestQuery.add(new TermQuery(new Term("field", "a")), Occur.*SHOULD*);

nestQuery.add(new TermQuery(new Term("field", "d")), Occur.*SHOULD*);

qBuilder.add(nestQuery.build(),Occur.*SHOULD*);

qBuilder.setMinimumNumberShouldMatch(1);

BooleanQuery q = qBuilder.build();

q = qBuilder.build();

assertSameScoresWithoutFilters(searcher, q);


In this test, the top boolean query(qBuilder) contains 4 clauses(3 simple
term-query ,1 nested boolean query that contains the same 3 term-query).

The underlying execution is that all the 6 term query were executed(see
TermQuery.Termweight#getTermsEnum()).

Apparently and theoretically,  the executions can be merged to increase the
time,right?.


So,is it possible or necessary  that Lucene merge the execution to optimize
the query performance, even though I know the optimization may be difficult.

Reply via email to