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

时间:2014-05-29 18:23:23

标签: elasticsearch

我的用例如下: 对产品执行搜索,并通过其salesRank相对于结果中的其他文档提高分数。前10%的卖家应该提高1.5倍,而前25-10%的卖家应该提高1.25倍。百分位数是根据查询结果计算的,而不是整个数据集。当用户键入时,此功能用于即时即时结果,因此单个字符查询仍会返回结果。

因此,举例来说,如果我搜索“Widget”并获得100个结果,那么返回的前10名卖家将获得1.5的提升,而前10-25名将被提升1.25。

我立即想到使用percentiles aggregation feature来计算结果集的第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
         }
      }
   }
}

太棒了,这给了我结果和百分位数。但我想在“尼龙”之上增加“霓虹灯”,因为它在结果中是前10%的卖家(注意:在我们的系统中,salesRank值优先下降,更高价值=更多销售)。由于只提供了一个字符,因此文本相关性非常低,因此销售排名应该会产生很大影响。

这里似乎可以使用function core query,但文档中的所有示例都使用doc []来使用文档中的值。没有任何使用来自顶层响应的其他信息,例如: “aggs”{}。如果销售排名分别在第100-90和第89-75百分位数,分别为1.5和1.25,我基本上想要提升一份文件。

这是Elasticsearch支持的内容还是我将不得不使用自定义脚本或插件进行自我推销?或者完全尝试不同的方法?我倾向于预先计算百分位数,对其进行索引,并持续得分提升,但利益相关者更喜欢运行时计算。

我正在使用Elasticsearch 1.2.0。

1 个答案:

答案 0 :(得分:1)

如果您将卖家作为父文件并定期更新他们的明星(以及一些提升因素),例如通过某个工作人员,该怎么办?然后使用has_parent查询匹配产品,并使用分数模式,自定义分数查询的组合来匹配来自畅销书的顶级产品?