Elasticsearch - 如何通过聚合结果提高得分?

5
我的使用场景如下: 对产品执行搜索,并通过其销售排名相对于结果中的其他文档提高评分。前10%的卖家应该增加1.5倍,第25-10%的卖家应该增加1.25倍。百分位数是根据查询结果而不是整个数据集计算的。此功能用于即时结果,当用户输入时,单个字符查询仍将返回结果。
例如,如果我搜索“小部件”并返回100个结果,则返回的前10个销售者将获得1.5倍的提升,而前10-25个则将获得1.25倍的提升。
我立即想到使用百分位数聚合特性来计算结果集的第75和90个百分位数。
POST /catalog/product/_search?_source_include=name,salesRank
{
  "query": {
    "match_phrase_prefix": {
      "name": "N"
    }
  },
  "aggs": {
    "sales_rank_percentiles": {
      "percentiles": {
        "field" : "salesRank",
        "percents" : [75, 90]
      }
    }
  }
}

这会给我以下结果:

{
   "hits": {
      "total": 142,
      "max_score": 1.6653868,
      "hits": [
         {
            "_score": 1.6653868,
            "_source": {
               "name": "nylon",
               "salesRank": 46
            }
         },
         {
            "_score": 1.6643861,
            "_source": {
               "name": "neon",
               "salesRank": 358
            }
         },
         ..... <SNIP> .....
      ]
   },
   "aggregations": {
      "sales_rank_percentiles": {
         "values": {
            "75.0": 83.25,
            "90.0": 304
         }
      }
   }
}

非常好,这为我提供了结果和百分位数。但是我想提高“neon”的排名,使其高于“nylon”,因为它是结果中销售前10%的产品(注:在我们的系统中,salesRank值按重要性降序排列,值越高=销量越高)。由于只提供了一个字符,文本相关性非常低,因此销售排名应该有很大的影响。
似乎可以在此处使用function core query,但是文档中的所有示例都使用doc[]来使用文档中的值。没有任何用于使用响应顶层中的其他信息(例如“aggs”{})的示例。如果销售排名在100-90th和89th-75th百分位数之间,则我基本上希望提高文档的排名,分别为1.5和1.25。
Elasticsearch是否支持此功能,还是我需要使用自定义脚本或插件来实现?还是尝试完全不同的方法?我更喜欢预先计算百分位数,将其索引,并进行恒定分数提升,但利益相关者更喜欢运行时计算。
我正在使用Elasticsearch 1.2.0。
1个回答

1
如果您将卖家作为父文档并定期更新他们的星级(以及一些提升因素),例如通过某个工作程序,那么您可以使用has_parent查询来匹配产品,并使用得分模式和自定义得分查询的组合来匹配顶级卖家的顶级产品。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接