我们知道 es 中 multi_match 是多字段的 match 匹配模式,且默认情况下,计算分是采用 best_fields 模式,但如果要采用多字段是 match_phrase 匹配模式,同时计算分采用 most_fields 模式,那该如何解决呢?
这时,大家可能都会想到 multi_match 的 type 类型除了 best_fields、most_fields 等外,还有一个 phrase 类型,但它本质上是匹配采用 match_phrase 模式,计算采用 best_fields,并非题目要求。下面给出了实战中比较巧妙的解决方法。
解决方法
如题要求,首先我们不应该执着于在 multi_match 框架下解决这个问题,跳出该形式;其次,大家应该知道 most_fields 模式是将匹配的多个字段的相关分求和(sum)在一起的,所以我们可以将 match_phrase 语句按照字段个数拆分,然后放在 bool 查询的 should 子项里,并设置该 should 的 minimum_should_match 为 1 即可。
具体示例如下:
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"title": {
"query": "knowledge dict",
"boost":4.0
}
}
},
{
"match_phrase": {
"content": {
"query": "knowledge dict"
}
}
},
{
"match_phrase": {
"tag": {
"query": "knowledge dict",
"boost":2.0
}
}
}
],
"minimum_should_match" : "1"
}
}
}