我的使用场景如下:
对产品执行搜索,并通过其销售排名相对于结果中的其他文档提高评分。前10%的卖家应该增加1.5倍,第25-10%的卖家应该增加1.25倍。百分位数是根据查询结果而不是整个数据集计算的。此功能用于即时结果,当用户输入时,单个字符查询仍将返回结果。
例如,如果我搜索“小部件”并返回100个结果,则返回的前10个销售者将获得1.5倍的提升,而前10-25个则将获得1.25倍的提升。
我立即想到使用百分位数聚合特性来计算结果集的第75和90个百分位数。
非常好,这为我提供了结果和百分位数。但是我想提高“neon”的排名,使其高于“nylon”,因为它是结果中销售前10%的产品(注:在我们的系统中,salesRank值按重要性降序排列,值越高=销量越高)。由于只提供了一个字符,文本相关性非常低,因此销售排名应该有很大的影响。
似乎可以在此处使用function core query,但是文档中的所有示例都使用doc[]来使用文档中的值。没有任何用于使用响应顶层中的其他信息(例如“aggs”{})的示例。如果销售排名在100-90th和89th-75th百分位数之间,则我基本上希望提高文档的排名,分别为1.5和1.25。
Elasticsearch是否支持此功能,还是我需要使用自定义脚本或插件来实现?还是尝试完全不同的方法?我更喜欢预先计算百分位数,将其索引,并进行恒定分数提升,但利益相关者更喜欢运行时计算。
我正在使用Elasticsearch 1.2.0。
例如,如果我搜索“小部件”并返回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。