Lucens做"启动"查询的最佳方式

Shi*_*gon 3 lucene startswith

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

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

例:

对于文件:

  • Video1Title =海是蓝色的
  • Video2Title =狂野的大海
  • Video3Title =野海无论如何
  • Video4Title =海边无论如何

如果我搜索"海",我想得到

  • "Video1Title =海是蓝色的"

首先是标题中包含"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",依此类推

然后进行查询,以便:

+(标题:海)(标题:"lucene_start_token sea")

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

那么我的问题是,确实有更好的方法(可能使用PhraseQueryTerm 职位)吗?如果没有,上述哪一个更好的性能?

Sam*_*cía 5

您可以使用Lucene Payloads.您可以为字段值的每个项提供自定义提升.

因此,当您为标题编制索引时,您可以开始使用3的提升因子(例如):

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

标题: | 3.0 生物 | 2.5

通过这种方式索引,您可以将最近的术语提升到标题的开头.

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