lucene - Lucens 执行 "starts-with"查询的最佳方式

标签 lucene startswith

我希望能够执行以下类型的查询:

要索引的数据包括(比方说)只有标题有趣的音乐视频。
我只是想对这些进行索引,然后为它们创建查询,这样,无论用户在查询中使用什么单词或单词,包含这些单词的文档,按照该顺序,在 tile 的开头将首先返回,然后是(在没有特定的顺序)通过在标题的任何位置包含至少一个搜索词的文档。此外,所有这些都应该不区分大小写。

例子:

对于文件:

  • Video1Title = 海是蓝色的
  • Video2Title = 狂野的大海
  • Video3Title = 狂野的大海随便
  • Video4Title = 海边随便

  • 如果我搜索“海”,我想得到
  • “Video1Title = 海是蓝色的”

  • 首先是标题中包含“sea”但不在开头的所有其他文档。

    如果我搜索“Wild sea”,我想得到
  • Video2Title = 狂野的大海
  • Video3Title = 狂野的大海随便

  • 首先是标题中包含“Wild”或“Sea”但没有“Wild Sea”作为标题前缀的所有其他文档。

    如果我搜索“Seasi”,我什么都不想要(我不关心关键字标记化和前缀查询)。

    现在AFAIKS,没有实际的方法告诉Lucene“找到我的文档,其中word1和word2等位于位置1、2和3等。”

    有“解决方法”来模拟这种行为:
  • 对该字段进行两次索引。在 field1您将单词标记化(可能使用 StandardAnalyzer )并在 field2 中你把它们都聚集成一个元素(使用 KeywordAnalyzer )。然后,如果您搜索类似的内容:

    +(field1:word1 word2 word3) (field2:"word1 word2 word3*")

  • 有效地告诉Lucene“文档必须在标题中包含word1或word2或word3,而且那些匹配“标题以>word1 word2 word3<开头的文档更好(获得更高的分数)。
  • 在索引字段时将“lucene_start_token”添加到字段的开头,以便Video2Title = Wild sea被索引为“title:lucene_start_token Wild sea”,其余的依此类推

  • 然后做一个查询,这样:

    +(title:sea) (title:"lucene_start_token sea")

    并让 Lucene 返回标题中包含我的搜索词的所有文档,并对匹配“lucene_start_token+搜索词”的文档给出更好的分数

    我的问题是,是否确实有更好的方法来做到这一点(也许使用 PhraseQueryTerm position )?如果不是,以上哪一个在性能方面更好?

    最佳答案

    您可以使用 Lucene Payloads为了那个原因。您可以为字段值的每个术语提供自定义提升。

    所以,当你索引你的标题时,你可以开始使用 3 的提升因子(例如):

    标题:野生 |3.0 生物 |2.5 蓝色 |2.0 |1.5

    标题: |3.0 生物 |2.5

    以这种方式建立索引,您可以将最近的术语提升到标题的开头。

    使用这种方法的主要问题是您必须自己标记并“手动”添加所有这些提升信息,因为分析器需要以这种方式构建的文本 (term1|1.1 term2|3.0 term3)。

    关于lucene - Lucens 执行 "starts-with"查询的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005747/

    相关文章:

    java - solrj:如何通过索引中的多值字段存储和检索 List<POJO>

    lucene - Lucene 中的 VInt 是什么?

    java - 使用 Apache Lucene 删除磁盘中的所有索引数据/文件?

    python - 从 python 中的字符串中提取特定模式

    c - 如何检查一个字符串是否以C中的另一个字符串开头?

    python - 使用 Python 删除文件中以 octothorpe 开头的行?

    java - 用于索引和搜索的 Lucene 分析器

    java - 为什么我在使用 lucene 时查询解析器总是出现错误

    python - text.startswith 方法与多个词

    python pandas row以一个字母一个数字通配符开头