我的用例如下: 对产品执行搜索,并通过其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。
答案 0 :(得分:1)
如果您将卖家作为父文件并定期更新他们的明星(以及一些提升因素),例如通过某个工作人员,该怎么办?然后使用has_parent
查询匹配产品,并使用分数模式,自定义分数查询的组合来匹配来自畅销书的顶级产品?