Запросник Lucene с "/" в критериях запроса

Когда я пытаюсь найти что-то типа "обходной путь / исправление" в Lucene, он выдает эту ошибку:

org.apache.lucene.queryparser.classic.ParseException: Cannot parse 'workaround/fix': Lexical error at line 1, column 15.  Encountered: <EOF> after : "/fix"
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:131)
    at pi.lucengine.LucIndex.main(LucIndex.java:112)
Caused by: org.apache.lucene.queryparser.classic.TokenMgrError: Lexical error at line 1, column 15.  Encountered: <EOF> after : "/fix"
    at org.apache.lucene.queryparser.classic.QueryParserTokenManager.getNextToken(QueryParserTokenManager.java:1133)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_scan_token(QueryParser.java:599)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_3R_2(QueryParser.java:482)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_3_1(QueryParser.java:489)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_2_1(QueryParser.java:475)
    at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:226)
    at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:181)
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:170)
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:121)

Это мои строки 111 и 112:

QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);
Query query = parser.parse(newLine);

Что мне нужно сделать, чтобы он мог разобрать символ "/"?

3 ответа

Анализатор запросов интерпретирует косые черты как начало / конец или запрос регулярного выражения (начиная с 4.0, см. Документацию здесь).

Таким образом, чтобы включить косые черты в запрос, вам нужно избежать их, добавив обратную косую черту (\) до них.

Вы можете справиться с побегом QueryParser.escape(String),

Я столкнулся с подобной проблемой при использовании символа '/' в запросах lucene, отправленных с панели управления эластичного поиска kibana. Я избегал символов '/', как указано в документации, и все еще не добился успеха. Я думаю, что это связано с ошибкой шаблона, описанной здесь: https://github.com/elastic/kibana/issues/789. Пока не уверен, будет обновляться при обновлении компонентов logstash

У меня был случай, когда при использовании прямой косой черты с подстановочным знаком он просто не дал бы никакого результата, даже если избежал его:

+(*16/17*)
+(*16\/17*)

Решением было добавить двойную кавычку:

+("*16/17*")
+("*16\/17*")
Другие вопросы по тегам