Elasticsearch可以对值的日志进行衰减搜索吗?

时间:2016-01-13 15:46:51

标签: elasticsearch

我在Elasticsearch中存储了一个数字views。我想在对数刻度上找到与它“最接近”的文档,因此10k和1MM是100k视图中相同的距离(并得到相同的得分)。这可能吗?

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#exp-decay介绍了field value factordecay functions,但它们可以“堆叠”吗?还有另一种方法吗?

1 个答案:

答案 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()))"
                }
              }
            ]
          }
        }
      ]
    }
  }
}'

注意:您可能想要考虑“视图”为空的可能性,具体取决于您的数据。