【问题标题】:Complex search query in lucene (querying fields which are indexed as numeric, analyzed or not-analyzed using a simple analyzer)lucene 中的复杂搜索查询(使用简单分析器查询索引为数字、已分析或未分析的字段)
【发布时间】:2010-08-31 19:28:09
【问题描述】:

您好,我正在使用 lucene 构建一个搜索应用程序。我的一些查询很复杂。例如,我的文档包含字段位置和人口,其中位置是未分析的字段,人口是数字字段。现在我需要返回位置为“san-francisco”且人口在 10000 到 20000 之间的所有文档。如果我结合这两个字段并构建这样的查询:

位置:旧金山和人口:[10000 到 20000],我没有得到正确的结果。关于为什么会发生这种情况以及我能做什么的任何建议。

此外,在构建复杂查询时,我包含的某些字段会被分析,而其他字段则不会被分析。例如 location 字段没有被分析并且包含诸如芝加哥、旧金山等术语。在分析摘要字段时,它通常包含一个描述性段落。

考虑这个查询:

location:san-francisco AND 摘要:“很棒的餐厅”

现在,如果我在搜索时使用 StandardAnalyzer,当位置字段包含诸如 san-francisco 或 los-angeles 之类的术语时(即它无法处理中间的连字符),但如果我使用关键字分析器,我不会得到正确的结果对于查询,我也没有得到正确的结果,因为它无法在摘要字段中搜索短语“great restaurant”。

【问题讨论】:

    标签: search indexing lucene


    【解决方案1】:

    首先,我建议一次解决这个问题。根据我对您帖子的阅读,听起来您有多个问题:

    1. 您不确定特定查询的原因 没有返回任何结果。

    2. 您不确定为什么某些字段没有被分析。

    3. 您在处理内置分析器时遇到问题 连字符。

    这就是您的帖子的阅读方式。如果这是正确的,我建议您分别发布每个问题。如果问题是准确的,你会得到更好的答案。尝试以当前格式回答您的问题令人不知所措。

    现在,让我在你的一些问题上一探究竟:

    对于您的第一个问题,如果您在 Lucene 中处理非常复杂的查询,请问问自己在此处而不是在适当的数据库中执行这些查询是否有意义。对于更通用的答案,我会尝试通过删除部分查询来隔离问题,直到您获得结果。一旦您找出查询的哪一部分导致没有结果,我们就可以进一步调试。

    对于第二个问题,检查您要添加到 Lucene 的文档。 Lucene 提供了存储数据但不索引数据的选项。确保在向文档中添加字段时指定了正确的选项。

    对于第三个问题,如果内置分析器不适合您,打破连字符,只需构建您自己的分析器。我遇到了与“@”符号类似的问题,为了解决这个问题,我 wrote a custom analyzer 正确处理了它。你可以对连字符做同样的事情。

    【讨论】:

      【解决方案2】:

      您应该使用PerFieldAnalyzerWrapper。顾名思义,您可以针对不同的领域使用不​​同的分析器。在这种情况下,您可以使用 KeywordAnalyzer 作为城市名称,使用 StandardAnalyzer 作为文本。

      【讨论】:

      • +1 用于 PerFieldAnalyzerWrapper。您还应该查看允许您组合较小查询的布尔查询。它们更容易调试和理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多