Lucene'imumNumberShouldMatch 'не в состоянии разбора - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю простой логический запрос с 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

Я также пытался выполнить этот запрос с Люком, но получил ту же ошибку там.

Скажите, пожалуйста, почему этот запрос не может быть проанализирован, хотя он был построен с использованием соответствующего инструмента.

1 Ответ

1 голос
/ 03 апреля 2019

Query.toString() не является сериализацией, нет гарантии, что переданный запрос будет проанализирован QueryParser.Он предназначен для передачи чего-то разумно читаемого человеком для целей отладки.

Я не уверен, чего вы здесь пытаетесь достичь, поскольку вы уже создали совершенно приемлемый BooleanQuery, но вам следует Никогда не делайте что-то вроде этого: QueryParser.parse(query.toString())

QueryParser не поддерживает минимальный номер_символа.Поиск с вашим BooleanQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...