【问题标题】:Keyword (OR, AND) search in LuceneLucene 中的关键字(OR、AND)搜索
【发布时间】:2009-08-21 11:00:06
【问题描述】:

我在我的门户(基于 J2EE)中使用 Lucene 来提供索引和搜索服务。

问题在于 Lucene 的关键字。当您在搜索查询中使用其中一个时,您会收到错误消息。

例如:

searchTerms = "ik OR jij"

这很好用,因为它会搜索"ik""jij"

searchTerms = "ik AND jij"

这很好用,它会搜索 "ik""jij"

但是当你搜索时:

searchTerms = "OR"
searchTerms = "AND"
searchTerms = "ik OR"
searchTerms = "OR ik"

等等,会失败并报错:

组件名称:STSE_RESULTS 类:org.apache.lucene.queryParser.ParseException 消息:无法解析“OR jij”:在第 1 行第 0 列遇到“OR”。 期待其中之一: ...

这是有道理的,因为这些词是 Lucene 的关键字,可能是保留的,并将充当关键字。

在荷兰语中,“OR”这个词很重要,因为它具有“Ondernemings Raad”的含义。它在许多文本中使用,需要找到它。例如,“或”确实有效,但不返回与“或”一词匹配的文本。如何使其可搜索?

如何转义关键字“或”?或者我如何告诉 Lucene 将“或”视为搜索词而不是关键字。

【问题讨论】:

  • Lucene 的哪个版本? AFAIk,布尔查询适用于 BooleanClause.Occur.SHOULD |必须 |必须不(或 | 和 | 不)分别。
  • 在 Luke 中进行搜索 ==> getopt.org/luke

标签: java lucene


【解决方案1】:

我想您尝试过将“OR”放在双引号中?

如果这不起作用,我认为您可能不得不更改 Lucene 源代码,然后重新编译整个东西,因为运算符“OR”深埋在代码中。实际上,编译可能还不够:您必须更改源包中用作 JavaCC 输入的文件 QueryParser.jj,然后运行 ​​JavaCC,然后重新编译整个东西。

不过,好消息是只有一行需要更改:

| <OR: ("OR" | "||") >

变成

| <OR: ("||") >

这样,您将只有“||”作为逻辑或运算符。有一个build.xml,里面也包含了JavaCC的调用,不过要自己下载that tool。恐怕我现在不能自己尝试。

这对于 Lucene 开发人员邮件列表来说可能是一个很好的问题,但是如果你这样做了,请告诉我们,他们会提出一个更简单的解决方案 ;-)

【讨论】:

    【解决方案2】:

    ORNOTAND 是保留关键字。就在 2 天前,我通过将用户搜索词中的这 3 个单词小写,然后将其输入 lucene 查询解析器来解决了这个问题。请注意,如果您搜索和替换这些关键字,请确保使用单词边界 (\b),以免最终更改 ANDROID 和 ORDER 等单词。

    然后我让用户使用 - 和 + 指定 NOTAND,就像 Google 一样。

    【讨论】:

      【解决方案3】:

      用双引号转义 OR 和 AND 对我有用。所以尝试使用像

      这样的Java字符串

      String query = "field:\"AND\"";

      【讨论】:

        【解决方案4】:

        你的问题我已经看了很多遍了! =[

        请看这些建议

        您的索引是如何存储的?

        包含存储字段的文档可以存储为

        1) 存储 2) 标记化 3) 索引 4) 向量

        它可以成为一个重要的difference

        请使用Luke,它可以告诉你索引是如何存储的(实际上)

        如果您正在使用 lucene,Luke 是一个必须,因为它可以让您真正了解索引的存储方式,它还提供搜索,请尝试使用它让我们知道您的更新!

        【讨论】:

          【解决方案5】:

          您在构建查询时可能做错了什么。我将支持 Narayan 关于获取 Luke 的建议(如 cmets 中所发布)并尝试使用它运行您的查询。自从我使用 Lucene 已经有一段时间了,但我不记得曾经遇到过 OR 和 AND 的问题。

          除此之外,您可以尝试使用 QueryParser.escape(userQuery) 转义输入字符串

          More On Escaping

          【讨论】:

            【解决方案6】:

            当它是搜索词时,您可以转义“OR”,或者为不同的语法编写自己的查询解析器。除了解析器之外,Lucene 还提供了广泛的查询 API,您可以通过它轻松地支持自己的查询语法。

            【讨论】:

              猜你喜欢
              • 2020-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-21
              • 1970-01-01
              • 2011-01-07
              • 1970-01-01
              相关资源
              最近更新 更多