首页 文章

ElasticSearch最高分数

提问于
浏览
2

我正在尝试解决在查询ElasticSearch数千个结果时遇到的性能问题 . 基本思想是我们进行一些查询后处理并仅显示前X个结果(查询可能有~100000个结果,而根据我们的分数力学我们只需要前100个) .

基本机制如下:ElasticSearch得分在0..1(得分/最高(得分))之间归一化,我们加上我们的排名得分(也在0..1之间归一化)并除以2 .

我想做的是使用自定义评分(或者任何有效的东西)将此逻辑移动到ElasticSearch中:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-script-score

我面临的问题是使用分数脚本/分数函数我似乎找不到像max(_score)那样的方法来将0到1之间的分数标准化 .

"script_score" : {
    "script" : "(_score / max(_score) + doc['some_normalized_field'].value)/2"
}

欢迎任何想法 .

1 回答

  • 0

    我不确定我理解你的问题 . 你想限制结果的数量吗?

    你试过吗?

    {
        "from" : 0, "size" : 10,
        "query" : {
            "term" : { "name" : "dennis" }
        }
    }
    

    您可以使用sort来定义 sort 顺序,默认情况下它将按主查询排序 .

    你也可以使用聚合(有或没有function_score)

    {
      "query": {
        "function_score": {
          "functions": [
            {
              "gauss": {
                "date": {
                  "scale": "3d",
                  "offset": "7d",
                  "decay": 0.1
                }
              }
            },
            {
              "gauss": {
                "priority": {
                  "origin": "0",
                  "scale": "100"
                }
              }
            }
          ],
          "query": {
            "match" : { "body" : "dennis" }
          }
        }
      },
      "aggs": {
    
            "hits": {
              "top_hits": {
                "size": 10
              }
            }
          }
    }
    

相关问题