我希望能够执行以下类型的查询:
要索引的数据包括(比方说)只有标题有趣的音乐视频。
我只是想对这些进行索引,然后为它们创建查询,这样,无论用户在查询中使用什么单词或单词,包含这些单词的文档,按照该顺序,在 tile 的开头将首先返回,然后是(在没有特定的顺序)通过在标题的任何位置包含至少一个搜索词的文档。此外,所有这些都应该不区分大小写。
例子:
对于文件:
如果我搜索“海”,我想得到
首先是标题中包含“sea”但不在开头的所有其他文档。
如果我搜索“Wild sea”,我想得到
首先是标题中包含“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<开头的文档更好(获得更高的分数)。
Video2Title = Wild sea
被索引为“title:lucene_start_token Wild sea
”,其余的依此类推然后做一个查询,这样:
+(title:sea) (title:"lucene_start_token sea")
并让 Lucene 返回标题中包含我的搜索词的所有文档,并对匹配“lucene_start_token+搜索词”的文档给出更好的分数
我的问题是,是否确实有更好的方法来做到这一点(也许使用 PhraseQuery 和 Term 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/