【问题标题】:How to properly escape OR and AND in lucene query?如何在 lucene 查询中正确转义 OR 和 AND?
【发布时间】:2020-07-30 03:41:45
【问题描述】:

当我传入查询“state:OR”时,lucene 给出了一个错误,因为它认为“OR”是 布尔子句的关键字,但这里我实际上是俄勒冈州的缩写。

我已经看到引用 OR 使查询变为 'state:"OR"' 使其工作。

但这听起来不是一个很好的方法,因为我必须对 lucene 使用的每个关键字进行字符串替换:AND OR NOT 和其他?我不知道有多少

我尝试直接构造查询,而不是做queryParser.parse(),但似乎这并没有通过分析器,这是一个大问题。

【问题讨论】:

  • 您可以在手动构建查询之前分析该术语

标签: lucene analyzer


【解决方案1】:

有很多方法可以避免这种情况,更简洁的方法是用反斜杠转义 AND、OR 和 & NOT,例如:

\\AND \\OR \\NOT

或者,代码解析器不会将它们的小写等效项解析为运算符

【讨论】:

  • 所以我正在做类似searchTerm.replaceAll("\\b(AND|OR|NOT)\\b", "\\\\\\\\$1"); 的操作来转义在用户输入的搜索框中使用的文字 AND,最终在 solr 查询中结束 - 我发现通过 pre- 转义 AND挂起 \\ 的工作原理是不再有解析异常,但它实际上并不搜索文字字符串。在 Solr 中,当查询中的参数 name:\\AND 应该返回名称为“Jim and john”的条目时,它没有找到任何结果。小写可能是要走的路,至少在 solr 中!
【解决方案2】:

Lucene query syntax 中只有 3 个独立的关键字——AND、OR 和 NOT。 (也使用了“TO”,但只能在范围查询内识别。)

您的引用代码只需要识别在您的应用程序中实际用作术语的 Lucene 关键字(如您示例中的上述“OR”)可能会有所帮助。

【讨论】:

    【解决方案3】:

    只是为了制作一份简历,在寻找这个问题的答案时可能会帮助其他人。

    应该是正确的答案是icyitscold提供的评论

    我们需要在小写(and、or、to)中使用保留字(OR、AND、NOT),这样不会出错并正确进行搜索。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2014-02-23
      • 2015-03-25
      相关资源
      最近更新 更多