Elasticsearch 对不同集合中的精确匹配和模糊匹配进行排序

Elasticsearch sort exact matches and fuzzy matches in different sets

这是我第一次在这里提问,如果有任何错误,我深表歉意。

我正在尝试对我的索引进行模糊搜索(使用模糊参数匹配查询),这将 return 结果按字母顺序排列。但我需要先进行精确匹配(按字母顺序排列),然后再进行模糊匹配。

我已经试过这个来使完全匹配获得更高的分数。但他们只是按分数排序:

   "query":{
      "bool":{
         "must":[
            {
               "match":{
                  "myPropertyName":{
                     "query":"myWord",
                     "fuzziness":"AUTO"
                  }
               }
            }
         ],
         "should":[
            {
               "match":{
                  "myPropertyName":{
                     "query":"myWord",
                     "boost":20
                  }
               }
            }
         ]
      }
   },
   "sort":[
      "_score",
      {
         "myProperty.keyword":{
            "order":"asc"
         }
      }
   ],
   "track_scores":true
}

然后我尝试了很多方法让所有精确匹配和模糊匹配的分数都一样。我可以使用 filterconstant_score 进行模糊匹配,但我想不出一种方法来分配自定义分数应该在我的搜索中查询的结果。

我怎样才能做到这一点?

我已经通过使用带有 "boost_mode": "replace" 的函数分数查询并将自定义值设置为权重参数来实现这一点,例如:"weight": "10".

{
   "query":{
      "function_score":{
         "query":{
            "bool":{
               "filter":[
                  {
                     "match":{
                        "myPropertyName":{
                           "query":"myWord",
                           "fuzziness":"AUTO"
                        }
                     }
                  }
               ]
            }
         },
         "boost_mode":"replace",
         "functions":[
            {
               "filter":{
                  "match":{
                     "myPropertyName":{
                        "query":"myWord"
                     }
                  }
               },
               "weight":"10"
            }
         ]
      }
   },
   "sort":[
      "_score",
      {
         "myProperty.keyword":{
            "order":"asc"
         }
      }
   ],
   "track_scores":true
}

这样,与 match query 匹配的文档将 return 得分为 0,因为它也是 filter query。然后在这些文档中,与函数匹配的文档将 return 得分为 10,因为 "boost_mode": "replace""weight: "10".

当首先排序时,Elasticsearch 将根据分数对结果进行排序,因为它在“sort[]”数组中排在第一位。然后得分相同的文档将按字母顺序排列。

这对我来说非常有效。