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

Eri*_*ker 5 elasticsearch

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

例如,如果我搜索“Widget”并返回 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]
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这让我得到以下信息:

{
   "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
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

太好了,这给了我结果和百分位数。但我想将“neon”提升到“nylon”之上,因为它是结果中排名前 10% 的卖家(注意:在我们的系统中,salesRank 值的优先级递减,更高的值 = 更多的销售额)。文本相关性非常低,因为只提供了一个字符,所以销售排名应该有很大的影响。

似乎可以在这里使用函数核心查询,但是文档中的所有示例都使用 doc[] 来使用文档中的值。没有任何用于使用来自响应顶层的其他信息,例如“aggs”{}。如果文档的销售排名分别在 100-90th 和 89th-75th 百分位数内,我基本上想提升 1.5 和 1.25。

这是 Elasticsearch 支持的东西,还是我必须自己使用自定义脚本或插件?或者完全尝试不同的方法?我更喜欢预先计算百分位数,将它们编入索引,并不断提高分数,但利益相关者更喜欢运行时计算。

我正在使用 Elasticsearch 1.2.0。

Ale*_*lex 1

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