【问题标题】:ElasticSearch custom script score that does not replace the natural scoring不替代自然评分的 ElasticSearch 自定义脚本评分
【发布时间】:2020-12-14 10:33:39
【问题描述】:

我有一个 ElasticSearch 查询,其中包含用 Painless 语言编写的自定义脚本分数。现在 ES 请求看起来像这样,自然的 ES _score 完全被我脚本中的自定义评分所取代:

 {
  "_source": {
    "excludes": [
      "field_to_exclude",
    ]
  },
  "from": 0,
  "size": 100,
  "query": {
    "script_score": {
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": [
            {
              "term": {
                "field_to_filter": 4
              }
            }
          ]
        }
      },
      "script": {
        "lang": "painless",
        "source": "COMPLEX_PAINLESS_SCRIPT"
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    },
    "_score"
  ]
}

根据前端的某些参数,我希望仍然能够单独计算 ES 自然评分,并将此自定义评分保留在另一个字段中计算,即使可能用作辅助排序标准。

这可能吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我终于想通了。如果您在sort 数组中使用自定义_script 字段以及用于自然ES 分数的_score 字段,则实际上可以做到这一点。

    除此之外,我们还可以使用 script_fields 将自定义评分保留在响应中的特定字段中。

    根据排序标准,两个 ES 请求看起来像:

    {
      "_source": {
        "excludes": [
          "field_to_exclude",
        ]
      },
      "from": 0,
      "size": 100,
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": [
            {
              "term": {
                "field_to_filter": 4
              }
            }
          ]
        }
      },
      "sort": [
        {
          "price": {
            "order": "desc"
          }
        },
        {
          "_score": {
            "order": "desc"
          }
        },
        {
          "_script": {
            "type": "number",
            "script": {
              "lang": "painless",
              "source": "COMPLEX_PAINLESS_SCRIPT"
            },
            "order": "desc"
          }
        }
      ],
      "script_fields": {
        "custom_score": {
          "script": {
            "lang": "painless",
            "source": "COMPLEX_PAINLESS_SCRIPT"
          }
        }
      }
    }
    

    和

    {
      "_source": {
        "excludes": [
          "field_to_exclude",
        ]
      },
      "from": 0,
      "size": 100,
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": [
            {
              "term": {
                "field_to_filter": 4
              }
            }
          ]
        }
      },
      "sort": [
        {
          "_script": {
            "type": "number",
            "script": {
              "lang": "painless",
              "source": "COMPLEX_PAINLESS_SCRIPT"
            },
            "order": "desc"
          }
        },
        {
          "_score": {
            "order": "desc"
          }
        }
      ],
    
      "script_fields": {
        "fit_score": {
          "script": {
            "lang": "painless",
            "source": "COMPLEX_PAINLESS_SCRIPT"
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2012-10-17
      • 2013-08-23
      • 2014-10-24
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多