我们正在进行基于文本的搜索(通过着名的"在此输入您的搜索"输入框),计算多个字段的分数并显示最佳结果。它基本上是一个混合了" term"的bool查询。和#34;匹配"在许多不同的领域(使用模糊,ngram,edge-ngrams和其他)。
我们希望最好的结果(最常见的#34;受欢迎的")首先出现(从而获得最高分)。然而,lucene的默认TF-IDF算法给出了完全相反的结果。您寻找存在于所有索引条目的30%中的供应商的图像。它将具有非常高的IDF并且排名非常低。我们只想要与之完全相反 - 给我们最常见的第一个(!)。
尝试使用"交叉领域"查询没有成功,因为我们想要将不同的查询类型与" bool"。
组合在一起现在,我们发现了什么"是使用Okapi BM25,其中k1 = 0且b = 0几乎(?)表现得像忽略TF(术语频率)和IDF(逆文档频率)的相似性。但是,我们不确定这是否真的可行。
你能给我们一些反馈吗?
这是走的路还是我们的问题"还有更好的等待被发现吗?
我试着让我的问题更清楚(抱歉有任何困惑):
我们说我们有汽车索引......
{id: 1, vendor: Opel, model: Astra, engine: 90hp gasoline}
{id: 2, vendor: Opel, model: Astra, engine: 100hp diesel}
{id: 3, vendor: Opel, model: Astra, engine: 120hp gasoline}
{id: 4, vendor: Chevrolet, model: Astro, engine: 120hp gasoline}
我们进行了全文搜索"当前用户输入" astr"
使用" edge ngram"分析所有字段(供应商,型号+引擎)。 analyzer {min:2,max:10}支持前缀搜索。
输入" astr"将匹配所有条目#1 - #4(它是" Astra"" Astro"的开头,所以所有条目都包含边缘ngram匹配)
IDF" Astr a "是log(4/3)〜= 0,287
以下的IDF; Astr o "是log(4/1)〜= 1,386
所以#4因IDF而排名更好
然而,我们想要完全相反:更频繁的" (="更受欢迎")汽车应排名更高。
注意:"交叉字段"查询是不够的,因为我们将几个不同的查询(模糊,边缘ngram,raw)组合成一个大型bool查询
答案 0 :(得分:1)
听起来你想要遵循这个一般过程:
解决方案1 (最灵活,效率最低)
您可以使用供应商字段中的terms aggregation获取#2的信息。
然后,您可以使用必要的派生提升重新查询(花费第二次往返)
或强>
解决方案2 (最不灵活,效率最高)
如果您满意让vendor popularity
特朗普_score
,您可以执行以下操作:
然后,聚合结果中的[astr]
查询结果将如下所示:
[Opel bucket]
Astra 90hp
Astra 100hp diesel
Astra 120hp
Ascona 144hp (if you had fuzziness 2)
Ascona 230hp (if you had fuzziness 2)
[Chevrolet bucket]
Astro 120hp
Alero 140hp (if you had fuzziness 2)
答案 1 :(得分:0)
如果您想使用文档频率来提升您的结果,请尝试在function_score
子句中滚动您自己的script_score函数。您可以通过term statistics访问评分函数中术语的文档频率。
您可能会发现此方法的意外后果是Corp
,Solutions
,Computer
,Inc
等常见/通用术语会产生巨大影响在你的分数上,如果你没有明确地将它们作为停用词擦除。