查询条件中带有“/”的 Lucene 查询解析器

Posted

技术标签:

【中文标题】查询条件中带有“/”的 Lucene 查询解析器【英文标题】:Lucene queryparser with "/" in query criteria 【发布时间】:2013-07-21 19:42:18 【问题描述】:

当我尝试在 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);

我需要做什么才能让它解析“/”?

【问题讨论】:

【参考方案1】:

我遇到过这样一种情况,当使用带有通配符的正斜杠时,即使转义它也不会返回任何结果:

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

解决方案是添加双引号:

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

【讨论】:

它对我有用。 "xxxxtestxxxx" 最终查询 query = queryParser.parse("\"*/test*\"");【参考方案2】:

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

因此,要将斜杠合并到查询中,您需要在 escape them 之前添加一个反斜杠 (\)。

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

【讨论】:

【参考方案3】:

在弹性搜索 kibana 仪表板发出的 lucene 查询中使用“/”时,我遇到了类似的问题。如文档中所示,我正在转义“/”字符,但仍未取得任何成功。我认为这与此处报告的模板错误有关:https://github.com/elastic/kibana/issues/789。还不确定,更新logstash组件时会更新

【讨论】:

以上是关于查询条件中带有“/”的 Lucene 查询解析器的主要内容,如果未能解决你的问题,请参考以下文章

实体框架中带有 OR 条件的动态查询

条件字符串中带有符号的 Codeigniter 查询

解析没有路径但在查询中带有斜杠的 URL

lucene+1

lucene查询解析器语法

Hive 中带有 Join 或 Where 子句的条件