elasticsearch 结合过滤器和功能评分-弹性搜索获胜';你不计算分数吗?,elasticsearch,search,elasticsearch,Search" /> elasticsearch 结合过滤器和功能评分-弹性搜索获胜';你不计算分数吗?,elasticsearch,search,elasticsearch,Search" />

elasticsearch 结合过滤器和功能评分-弹性搜索获胜';你不计算分数吗?

elasticsearch 结合过滤器和功能评分-弹性搜索获胜';你不计算分数吗?,elasticsearch,search,elasticsearch,Search,我有帖子索引,我想 a) 按日期筛选所有帖子,即仅在给定日期之前创建的返回帖子 b) 对结果应用功能评分 我提出了一个类似这样的问题: get posts/_search { "query": { "function_score": { "query": { "bool": { "filter": [ {

我有
帖子
索引,我想

a) 按日期筛选所有帖子,即仅在给定日期之前创建的返回帖子

b) 对结果应用
功能评分

我提出了一个类似这样的问题:

get posts/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "created_at": {
                  "lte": "2020-09-12T17:23:00Z"
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "likes",
            "factor": 0.1,
            "modifier": "ln1p",
            "missing": 1
          }
        }
      ],
      "score_mode": "sum"
    }
  },
  "from": 0,
  "size": 10
}
然而,问题是弹性搜索不将分数应用于结果,所有文档都有
0.0
分数。我可以通过将过滤器移动到函数中来“欺骗”ES,然后它确实工作了,但我觉得它不是最优的,你知道为什么上面的查询不会返回分数吗

“作弊”查询的示例,该查询会计算每个文档的分数:

get posts/_search
{
  "query": {
    "function_score": {
      "functions": [
        {
          "filter": {
            "range": {
              "created_at": {
                "lte": "2020-09-12T17:22:58Z"
              }
            }
          },
          "weight": 100
        },
        {
          "gauss": {
            "created_at": {
              "origin": "2020-09-12T17:22:58Z",
              "scale": "1h",
              "decay": 0.95
            }
          }
        },
        {
          "field_value_factor": {
            "field": "likes",
            "factor": 0.1,
            "modifier": "ln1p",
            "missing": 1
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10
}

过滤器不影响分数。只是0或1。 为了能够通过函数\分数查询影响分数,您必须使用计算分数的函数(匹配、匹配\短语、地理查询等) 您可以了解有关上下文的更多详细信息

字段\值\因子,但在您的第一次查询中,您在此阶段没有任何评分,因为它几乎与相同数量的订购相同

在第二个查询中,您计算一个分数,该分数取决于您的文档的最近程度,然后使用likes来影响它。这就是它起作用的原因