- status: open --> open-duplicate
Synopsis: Cannot execute a BooleanQuery on a
MultiSearcher or ParallelMultiSearcher
Applies to: 1.9.0.0 and 1.4.3.4 (for different reasons)
Submitted by: Andy Twidle (andy@justis.com)
Both versions throw exceptions in Query Rewrite(Query
original) when Query is a BooleanQuery,
which is called as "Step 1 in Distributed query processing"
1.4.3.4
Throws a System.NotSupportedException from
virtual Query Combine(Query[] queries) and BooleanQuery
does not override this method.
1.9.0.0
Throws a System.ArgumentException from
public static MergeBooleanQueries(Query[] queries)
This is because the clauses from each query (one for
each ISearchable), are all added into a hash table
using the Hashtable.Add method. (And since the queries
are (always?usually) exactly the same, the hashtable
keys are not unique)
If in no circumstances is not desirable to see this
exception when merging boolean queries with duplicate
clauses, then this can be solved by changing:
public static MergeBooleanQueries(Query[] queries)
{
...
** allClauses.Add([clauses[j], clauses[j]); -->
allClauses[clauses[j]] = clauses[j];
...
}
in QUERY.CS
-------
Sample code to illustrate this issue
try
{
Query original = QueryParser.Parse("Jack AND
Jill","Title", new StandardAnalyzer());
Console.WriteLine(original.GetType());
MultiSearcher ms = new ParallelMultiSearcher(
new Searchable[]{ new IndexSearcher(@"e:\idx1"),
new IndexSearcher(@"e:\idx2")
});
Query rewrittenQuery = ms.Rewrite(original);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}