Elasticsearch:搜索最常见的匹配/术语,无需TF或IDF调整

时间:2015-09-20 12:56:02

标签: elasticsearch

我们正在进行基于文本的搜索(通过着名的"在此输入您的搜索"输入框),计算多个字段的分数并显示最佳结果。它基本上是一个混合了" 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查询

2 个答案:

答案 0 :(得分:1)

听起来你想要遵循这个一般过程:

  1. 运行复杂的自定义搜索查询。
  2. 检查结果以确定每个供应商在结果集中占主导地位的程度
  3. 对结果进行重新排序,通过更多主要供应商推动汽车发展。
  4. 解决方案1 ​​(最灵活,效率最低)

    您可以使用供应商字段中的terms aggregation获取#2的信息。

    然后,您可以使用必要的派生提升重新查询(花费第二次往返)

    解决方案2 (最不灵活,效率最高)

    如果您满意让vendor popularity特朗普_score,您可以执行以下操作:

    • 运行零结果查询(您当前的模糊匹配查询)
    • ... vendor
    • 上有Terms个聚合
    • ...... ... Top Hits子聚合按_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访问评分函数中术语的文档频率。

您可能会发现此方法的意外后果是CorpSolutionsComputerInc等常见/通用术语会产生巨大影响在你的分数上,如果你没有明确地将它们作为停用词擦除。