Я создаю простой логический запрос с org.apache.lucene.search.BooleanQuery.Builder
.
Я также хочу использовать здесь minimalNumberShouldMatch, чтобы указать минимальное число необязательных логических выражений, которые должны быть выполнены:
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD);
builder.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD);
builder.add(new TermQuery(new Term("field", "value3")), BooleanClause.Occur.SHOULD);
builder.setMinimumNumberShouldMatch(2);
String queryString = builder.build().toString();
System.out.println(queryString);
В результате я получаю строку запроса:
(field:value1 field:value2 field:value3)~2
Я хочу, чтобы этот запрос возвращал документы, если удовлетворяют хотя бы два условия.
Но при разборе этого запроса я столкнулся с проблемой:
new QueryParser(Version.LUCENE_7_7_1.toString(), new ClassicAnalyzer()).parse(queryString);
выдает следующее исключение:
Exception in thread "main" org.apache.lucene.queryparser.classic.ParseException: Cannot parse '(field:value1 field:value2 field:value3)~2': Encountered " <FUZZY_SLOP> "~2 "" at line 1, column 40.
Was expecting one of:
<EOF>
<AND> ...
<OR> ...
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:114)
at ....lucene.common.BaseLuceneConnection.main(BaseLuceneConnection.java:101)
Caused by: org.apache.lucene.queryparser.classic.ParseException: Encountered " <FUZZY_SLOP> "~2 "" at line 1, column 40.
Was expecting one of:
<EOF>
<AND> ...
<OR> ...
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:931)
at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:813)
at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:216)
at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:109)
... 1 more
Я также пытался выполнить этот запрос с Люком, но получил ту же ошибку там.
Скажите, пожалуйста, почему этот запрос не может быть проанализирован, хотя он был построен с использованием соответствующего инструмента.