4

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

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

例子:

对于文件:

  • 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)?如果不是,以上哪一项在性能方面更好?

4

2 回答 2

5

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

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

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

标题:|3.0生物|2.5

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

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

于 2013-02-26T00:00:10.410 回答
1

你可以做的是分别索引标题和每个标记,例如文本wild deep blue endless sea将被索引为:

title: wild deep blue endless sea
t1: wild
t2: deep
t3: blue
t4: endless
t5: sea

然后如果有人查询“wild deep”,查询将被重写为

title:"wild deep" OR (t1:wild AND t2:deep)

这样,您将始终找到所有匹配的文档(如果它们匹配title),但匹配t1..tN的标记将使相关文档得分更高。

于 2013-02-25T16:33:01.433 回答