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.
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.