我在Elasticsearch中存储了一个数字views
。我想在对数刻度上找到与它“最接近”的文档,因此10k和1MM是100k视图中相同的距离(并得到相同的得分)。这可能吗?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#exp-decay介绍了field value factor和decay functions,但它们可以“堆叠”吗?还有另一种方法吗?
答案 0 :(得分:1)
我不确定您是否可以通过衰减直接实现此目的,但您可以使用script_score
函数轻松完成此操作。下面的示例使用动态脚本,但请注意,使用file-based scripts是建议的,更安全的方法。
在下面的查询中,offset
参数设置为100,000,具有该值的“视图”字段的文档将获得最高分。当视图的值偏离offset
时,分数会以对数方式衰减。根据您的示例,1,000,000和/或10,000的文档具有相同的分数(此公式中为0.30279312)。
您可以通过更改脚本的开头乘以_score
而不是除以来反转这些结果的顺序。
$ curl -XPOST localhost:9200/somestuff/_search -d '{
"size": 100,
"query": {
"bool": {
"must": [
{
"function_score": {
"functions": [
{
"script_score": {
"params": {
"offset": 100000
},
"script": "_score / (1 + ((log(offset) - log(doc['views'].value)).abs()))"
}
}
]
}
}
]
}
}
}'
注意:您可能想要考虑“视图”为空的可能性,具体取决于您的数据。