Запросник 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*")