【问题标题】:tf/idf boosting within field领域内的 tf/idf 提升
【发布时间】:2015-09-20 04:37:56
【问题描述】:

我的用例是这样的: 对于查询iphone charger,我与结果的相关性更高,nameiphone charger coupons 比名称为iphone charger,可能是因为description 和其他字段的匹配更好。提升name 字段并没有多大帮助,除非我大幅歪曲了重要性。我真正需要的是tf/idfname 字段中提升

引用elasticsearch blog:

字段中术语的频率被字段的长度所抵消。但是,实际评分功能以相同的方式处理所有字段。它将所有标题字段(因为它们很短)视为比所有正文字段(因为它们很长)更重要。

我需要提升特定字段的 more important 值。我们可以通过函数分数或其他方式来做到这一点吗?

【问题讨论】:

  • 我认为你从错误的角度考虑这个问题。想想你的要求是什么。 "iphone charger" 比其他文本短。这是你想要支持这个文本的规则吗?您需要考虑匹配规则,然后考虑如何实现这一点。不希望与tf/idf 混淆,imo。
  • @AndreiStefan 对我来说,名称字段自然比任何其他字段都更重要。但在名称中,即使在匹配之后,相关性也不太可接受,因为一个额外的词会改变一切。所以更少的单词+更多的匹配给了我想要的结果
  • 你见过this吗?
  • 是的,忽略 tf/idf 可能会导致我反向,导致名称字段更大的产品显示为简单的iphone charger

标签: elasticsearch lucene tf-idf


【解决方案1】:

一个词的长度差异并没有对评分算法有太大的影响(事实上,由于长度规范的不精确性,它可以完全消失)。如果在其他领域有命中,你有很多得分元素要对抗。

dis_max 可能是解决此问题的合理方法。而不是所有的附加分数和坐标等你试图克服,它会简单地选择最佳匹配子查询的分数。如果您针对标题提升查询,则可以确保那里的匹配是强烈首选的。

然后,您可以分配一个“tie_breaker”,以便仅当“title”分数并列时才考虑描述子查询的分数。

{
    "dis_max" : {
        "tie_breaker" : 0.2,
        "queries" : [
            {
                "terms" : { 
                    "age" : ["iphone", "charger"],
                    "boost" : 10
                }
            },
            {
                "terms" : {
                    "description" : ["iphone", "charger"]
                }
            }
        ]
    }
}

如果您绝对知道何时与整个字段完全匹配,则处理此类事情的另一种方法是单独索引该字段的未标记版本,并同时查询该字段.与该字段的未标记版本的任何匹配都将再次与整个字段内容完全匹配。这将防止您需要依赖长度规范来做出决定。

【讨论】:

  • 谢谢,我会试试决胜局。这是否意味着short fields have high weight 中提到的权重设置得如此之低,以至于需要 10 倍的提升才能击败其他竞争领域?
猜你喜欢
  • 2015-05-07
  • 2018-05-27
  • 2020-09-27
  • 2012-01-12
  • 2012-02-29
  • 1970-01-01
  • 2017-07-01
  • 2018-09-19
  • 2016-10-13
相关资源
最近更新 更多