我的用例如下:对产品执行搜索并通过相对于结果中的其他文档的 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。
如果您将卖家作为父文档并定期更新他们的星级(以及一些提升因素)(例如通过某些工作人员),会怎么样?然后使用has_parent查询来匹配产品,并使用评分模式、自定义评分查询的组合来匹配来自畅销产品的顶级产品?
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |