ElasticSearch 自定义脚本评分,不替代自然评分

博利诺

我有一个带有用 Painless 语言编写的自定义脚本分数的 ElasticSearch 查询。现在 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 自然评分,并将此自定义评分保留在另一个字段中计算,即使可能用作辅助排序标准。

这可能吗?

博利诺

我终于想通了。如果您_scriptsort数组中使用自定义字段以及_score自然 ES 分数字段,这实际上可以完成

除此之外,我们可以使用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"
      }
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章