基于发生率的 Elasticsearch 衰减分数

Posted

技术标签:

【中文标题】基于发生率的 Elasticsearch 衰减分数【英文标题】:Elasticsearch decay score based on occurrence 【发布时间】:2015-02-06 18:25:34 【问题描述】:

我正在尝试找到一种方法来防止多个帖子出现在来自同一作者的搜索结果中。到目前为止,我已经尝试过随机评分,这可以让我保持分页。但是,在 10 个结果的给定页面中,我仍然可以有多达 4 个相同的作者。

有没有办法根据某个字段在结果集中出现的次数对文档进行评分?据我所知,您不能在评分脚本中保留变量或对象。

我已经研究了几种实现此目的的方法,但其中许多都有不少缺点。例如删除重复项,并再次调用以检索排除当前作者的新结果集。但是,这也可以返回多个相同的作者。所以我要一个一个地查询以替换结果集中的重复作者,这会破坏深度分页,因为最终用于替换重复的另一个结果集在标准搜索之前用完页面。我也尝试过不可分页的聚合。

是否有任何功能可以根据同一作者(或领域)的文档出现的次数分散或减去文档的分数?

【问题讨论】:

【参考方案1】:

编辑:在您仅仅因为它与 Lucene 相关而不是问题的真正答案而否决这个答案之前:1. ElasticSearch 是基于 Lucene 的 2. OP 想要做的事情真的很难做,我只是在尝试帮助...

你可以尝试从这里开始玩衰变:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html

但是,这不允许对当前查询的先前命中进行反向引用(因为需要一种技术来匹配您的用例)

我在使用 Lucene/Hibernate-Search 的 web 应用程序中遇到了与您类似的问题,但我并没有真正得到令人满意的结果,它仍然困扰着我。

我认为最好通过尝试以另一种方式实现排序来获得良好的用户体验。

【讨论】:

不过,如果你能找到方法并在此处发布,我将非常高兴 :) 顺便说一句。在我的 web 应用程序中,我最终在我的 Java 代码中对内容进行了预排序,然后手动将排序顺序设置为查询。由于您使用的是 ElasticSearch 而不是 Lucene/HSearch,因此很遗憾,这不起作用。 这是我以前的问题:***.com/questions/21528491/…【参考方案2】:

你有什么理由不能使用grouping?只需按用户分组并定义组的顺序。

【讨论】:

如果您指的是存储桶,则无法对存储桶进行分页。想想这个。我可以为每个作者创建一个存储桶,然后我可以为每个作者获取一击。假设有 90 个作者(并且这个值发生了变化),该查询每次都会在 90 个不同的桶中给我 90 个结果。桶本身不能分页。所以我总是会在每一页得到多少作者有价值的帖子。每个桶本身都是可分页的,但是一组桶不是。所以我可以为一个桶设置fromsize,但我不能在一组桶上这样做。【参考方案3】:

您不能使弹性搜索排序多样化。您只能random_seed 对文档进行评分并希望获得最好的结果。您可以使用 top hits 聚合器之类的东西来聚合每个作者的存储桶,但您不能对一组存储桶进行分页。因此打破了分页。

See here for more information

【讨论】:

以上是关于基于发生率的 Elasticsearch 衰减分数的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:在搜索中使用衰减函数(Gauss)

Elasticsearch的Groovy Script自定义评分检索

ElasticSearchElasticSearch 中使用衰减函数来完美你的搜索结果

基于上下文的推荐 -- 包括时间衰减算法和位置推荐算法(代码实现)

基于上下文的推荐 -- 包括时间衰减算法和位置推荐算法(代码实现)

根据 Elasticsearch 的交互式反馈更新分数