【问题标题】:Can Elasticsearch do a decay search on the log of a value?Elasticsearch 可以对一个值的日志进行衰减搜索吗?
【发布时间】:2016-01-14 05:45:53
【问题描述】:

我在 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,但它们可以“堆叠”吗?还有其他方法吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我不确定您是否可以通过衰减直接实现此目的,但您可以使用 script_score 函数轻松实现。下面的示例使用动态脚本,但请注意,使用file-based scripts 是推荐的,更安全的方法。

    在下面的查询中,offset 参数设置为 100,000,“views”字段中具有该值的文档得分最高。随着视图值偏离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()))"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }'
    

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

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2021-09-27
      • 2018-08-09
      • 2010-09-14
      相关资源
      最近更新 更多