使用版本6之前的Elasticsearch,以下查询根据与查询的相似度返回命中结果。现在在ES 6+中,这将根据它们是否匹配查询的任何部分来返回命中,所有这些都具有相同的分数。此更改中断了更复杂查询的其余部分(未显示)。
对于以下查询,如何获得与较旧的ES 5匹配的命中分数
{
"query": {
"bool": {
"should": [
{
"terms": {
"some_field_name": [
"iPad Pro",
"iPhone 8"
]
}
}
]
}
}
}在ES 5中,这返回匹配所有术语的命中率较高,匹配较少的命中率较低。在ES 6+中,这只返回得分=1的命中结果,因此它们的排名不考虑有多少匹配的术语。
例如,同时包含这两个术语的命中在ES 5中排名更高:
"_score": 0.87546873, when 2 of 4 terms match
"_score": 0.60353506, when 2 of 5 terms match
"_score": 0.13353139, when 1 of 4 terms match这很像我们所需要的“余弦”相似性(请理解,这并不是分数的精确创建方式)。
哪个查询返回的分数与ES5对上述查询返回的分数相同。换句话说,什么是ES 6等价查询?
发布于 2019-02-06 15:43:46
注:由于评论中的讨论变得越来越长和笨拙,所以只是将其作为建议草案发布。
更新:我刚刚检查了我推荐的两种方法,两种方法似乎都给出了相似的分数。请尝试这些方法,看看您获得的分数是否与您相关。
我知道它不适用于术语,但我建议将其替换为多个“术语”过滤器,该过滤器也具有boost参数,或者将其替换为"term_set“查询,并将required_matches参数设置为"1”,因为我们需要“或”行为。
1)使用terms_set查询:
{
"query": {
"bool": {
"should": [
{
"terms_set": {
"some_field_name": {
"terms" : ["iPad Pro", "iPhone 8"],
"minimum_should_match_script": {
"source": "1"
}
}
}
}
]
}
}
}2)使用多项过滤器,而不是单项过滤器:
{
"query": {
"bool": {
"should": [
{
"term": {
"some_field_name": "iPad Pro"
}
},
{
"term": {
"some_field_name": "iPhone 8"
}
}
]
}
}
}如果你在术语中使用boost,那么你应该在每个术语块中应用相同的boost。
https://stackoverflow.com/questions/54526023
复制相似问题