我希望能够执行以下类型的查询:
要索引的数据包括(比方说)只有标题有趣的音乐视频。我只是想对这些进行索引,然后为它们创建查询,这样,无论用户在查询中使用什么单词或多个单词,包含这些单词的文档都会按顺序在图块的开头返回,然后(在没有特别的顺序)由在标题的任何位置包含至少一个搜索词的文档。此外,所有这些都应该不区分大小写。
例子:
对于文件:
- 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+搜索词”的人给出更好的分数
那么我的问题是,确实有更好的方法来做到这一点(也许使用PhraseQuery和Term position)?如果不是,以上哪一项在性能方面更好?