Lucene queryparser在查询条件中带有“/”

时间:2013-07-22 22:08:58

标签: lucene query-parser

当我尝试在Lucene中搜索诸如“workaround / fix”之类的内容时,会抛出此错误:

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 个答案:

答案 0 :(得分:17)

查询解析器将斜杠解释为开始/结束或正则表达式查询(从4.0开始,请参阅documentation here)。

因此,要在查询中加入斜杠,您需要escape them在它们之前添加反斜杠(\)。

您可以使用QueryParser.escape(String)来处理转义。

答案 1 :(得分:2)

使用&#39; /&#39;时遇到了类似的问题。在弹性搜索kibana仪表板发出的lucene查询中。我正在逃避&#39; /&#39;文档中指出的字符仍然没有取得任何成功。我认为这与此处报告的模板错误有关:https://github.com/elastic/kibana/issues/789。尚不确定,我们在更新logstash组件时会更新

答案 2 :(得分:1)

我有一个案例,当使用带有通配符的正斜杠时,即使转义它也不会返回任何结果:

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

解决方案是添加双引号:

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