【发布时间】:2013-02-21 15:17:11
【问题描述】:
我希望能够进行以下类型的查询:
要索引的数据包括(比方说)只有标题有趣的音乐视频。 我只是想对这些进行索引,然后为它们创建查询,这样,无论用户在查询中使用什么单词或单词,包含这些单词的文档都将按顺序在图块的开头返回,然后(在没有特别的顺序)由在标题的任何位置包含至少一个搜索词的文档。此外,所有这些都应该不区分大小写。
例子:
对于文档:
- Video1Title = 海是蓝色的
- Video2Title = 野生海洋
- Video3Title = 野生海洋 随便
- Video4Title = 海边随便
如果我搜索“海”,我想得到 p>
- “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,而且那些匹配“title以>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)?如果不是,以上哪一项在性能方面更好?
【问题讨论】:
标签: lucene startswith