lucene Lucens最好的方式做“开始”查询

w8biq8rn  于 2023-11-18  发布在  Lucene
关注(0)|答案(3)|浏览(229)

我希望能够进行以下类型的查询:
要索引的数据包括我只是想索引这些,然后为它们创建查询,这样,无论用户在查询中使用了什么词,包含这些词的文档,按照这个顺序,在瓷砖的开头,将首先返回,在标题的任何位置都包含至少一个搜索词的文档(没有特定的顺序)。所有这些都应该不区分大小写。
范例:
对于文件:

  • 影片名称:海是蓝色的
  • Video2Title =狂野的大海
  • 视频3Title:狂野的海洋
  • Video4Title =海滨

如果我搜索“海”,

  • “Video1Title =海是蓝色的”

首先是所有其他文件,包含“海”的标题,但不是在开头。
如果我搜索“狂野大海”,

  • Video2Title =狂野的大海
  • 视频3Title:狂野的海洋

第一个是所有其他标题中有“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位置)?如果没有,上面哪一个更好的性能?

vbkedwbf

vbkedwbf1#

你可以使用Lucene Payloads来实现,你可以为字段值的每一个项给予自定义的提升。
所以,当你索引你的标题时,你可以开始使用3的提升因子(例如):
标题:野生| 3.0生物| 2.5蓝色| 2.0| 1.5
标题:| 3.0生物| 2.5
索引这种方式,你是提高最接近的条款开始的标题。
使用这种方法的主要问题是,您必须自己进行标记,并“手动”添加所有这些boost信息,因为分析器需要以这种方式(term1)结构化文本|1.1术语2| 3.0项3)。

jtoj6r0c

jtoj6r0c2#

你可以做的是分别为标题和每个token建立索引,例如文本wild deep blue endless sea的索引如下:

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

字符串
然后,如果有人查询“wilddeep”,则查询将被重写为

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


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

tv6aics1

tv6aics13#

应该创建一个KeywordFieldStringField字段,并使用PrefixQuery进行搜索。
关于PrefixQuery
匹配包含具有指定前缀的术语的文档的查询。PrefixQuery由QueryParser为app* 之类的输入构建。
关于KeywordField
该字段将每个文档的String或BytesRef索引为倒排索引以进行快速筛选,使用DocValuesType.SORTED_SET文档值以分栏方式存储值以进行排序和分面处理,并可选择将值存储为存储字段以进行最常用项检索。此字段不支持评分:查询生成常量评分。如果需要更精细的控制,可以使用StringField ...
关于StringField
已索引但未标记化的字段:整个String值作为单个标记进行索引。

相关问题