为什么custom_filters_score中的脚本表现为提升?

use*_*345 3 elasticsearch

{
  "query": {
    "custom_filters_score": {
      "query": {
        "term": {
          "name": "user1234"
        }
      },
      "filters": [
        {
          "filter": {
            "term": {
              "subject": "math"
            }
          },
          "script": "_score + doc['subject_score'].value"
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果脚本有上面的那么它给出了Error: unresolvable property or identifier: _score 如果脚本是这样的"script": "doc['subject_score'].value"它以与boost相似的方式乘以_score.我想用自定义分数替换elasticsearch _score.

imo*_*tov 5

如果我理解你正确你想使用elasticsearch得分,如果主题不是数学,你想使用自定义得分主题是数学.如果您使用的是Elasticsearch v0.90.4或更高版本,则可以使用新function_score查询来实现:

{
    "query": {
        "function_score": {
            "query": {
                "term": {
                    "name": "user1234"
                }
            },
            "functions": [{
                "filter": {
                    "term": {
                        "subject": "math"
                    }
                },
                "script_score": {
                    "script": "doc[\"subject_score\"].value"
                }
            }, {
                "boost_factor": 0

            }],
            "score_mode": "first",
            "boost_mode": "sum"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在v0.90.4之前,您将不得不求助于使用custom_score和的组合custom_filters_score:

{
    "query": {
        "custom_score": {
            "query": {
                "custom_filters_score": {
                    "query": {
                        "term": {
                            "name": "user1234"
                        }
                    },
                    "filters": [{
                        "filter": {
                            "term": {
                                "subject": "math"
                            }
                        },
                        "script": "-1.0"
                    }]
                }
            },
            "script": "_score < 0.0 ? _score * -1.0 + doc[\"subject_score\"].value : _score"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者@javanna建议,使用bool查询组合在一起的多个custom_score查询:

{
    "query": {
        "bool": {
            "disable_coord": true,
            "should": [{
                "filtered": {
                    "query": {
                        "term": {
                            "name": "user1234"
                        }
                    },
                    "filter": {
                        "bool": {
                            "must_not": [{
                                "term": {
                                    "subject": "math"
                                }
                            }]
                        }
                    }
                }
            }, {
                "filtered": {
                    "query": {
                        "custom_score": {
                            "query": {
                                "term": {
                                    "name": "user1234"
                                }
                            },
                            "script": "doc['subject_score'].value"
                        }
                    },
                    "filter": {
                        "term": {
                            "subject": "math"
                        }
                    }
                }
            }]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)