我将数字views
存储在Elasticsearch中。我想找到一个以对数刻度“最接近”的文档,以便从10万个 View 中得出10k和1MM的距离相同(并得到相同的分数)。那可能吗?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#exp-decay描述field value factor和decay functions,但是可以“堆叠”吗?还有其他方法吗?
最佳答案
我不确定是否可以通过衰减直接实现,但是可以使用script_score
函数轻松实现。下面的示例使用动态脚本,但是请注意,使用file-based scripts是推荐的更为安全的方法。
在下面的查询中,offset
参数设置为100,000,并且其“ View ”字段中具有该值的文档得分最高。当 View 的值偏离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()))"
}
}
]
}
}
]
}
}
}'
注意:您可能要考虑“ View ”为空的可能性,具体取决于您的数据。
关于elasticsearch - Elasticsearch可以对值的对数进行衰减搜索吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34770992/