这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
本Elasticsearch相关文章的版本为:7.4.2
multi_match查询基于match查询的基础上,同时应用于多个字段查询。
测试数据:
POST /multi_match_test/_doc/1
{
"subject": "elasticsearch full text search",
"title": "es is very helpful"
}
POST /multi_match_test/_doc/2
{
"subject": "elasticsearch term text search",
"title": "elasticsearch full awesome"
}
下面的查询将在subject和title字段中查找包含full text的文档:
POST /multi_match_test/_search
{
"query": {
"multi_match": {
"query": "full text",
"fields": ["subject", "title"]
}
}
}
query: 需要查询的内容
fields: 在哪些字段里去查找
multi_match查询支持一下几种类型的查询:
best_fileds: 这是multi_match默认的查询类型。这种查询类型非常适合在你想在一个字段里面尽可能多的匹配到你想查询的内容。例如你想在subject或field里面同时出现full和text的文档,你肯定不会希望full或者text各自出现在其中一个字段里。
POST /multi_match_test/_search
{
"query": {
"multi_match": {
"query": "full text",
"fields": ["subject", "title"],
"type": "best_fields"
}
}
}
best_fields的文档得分计算方式: 把输入的文本进行分词,然后把分词放到dis_max查询里。把所有字段里得分最高的那个字段的得分作为整个文档的得分。
上面的查询将会转化为以下的查询:
POST /multi_match_test/_search
{
"query": {
"dis_max": {
"queries": [
{"match": {"subject": "full text"}},
{"match": {"title": "full text"}}
]
}
}
}
返回的数据:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.87546873,
"hits" : [
{
"_index" : "multi_match_test",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.87546873,
"_source" : {
"subject" : "elasticsearch full text search",
"title" : "es is very helpful"
}
},
{
"_index" : "multi_match_test",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.7361701,
"_source" : {
"subject" : "elasticsearch term text search",
"title" : "elasticsearch full awesome"
}
}
]
}
}
文档1得分过程:
因为文档1在执行subject的match的查询时同时命中full和text,subject字段得2分;文档1在执行title的match的查询时没有命中,title字段得0分;取两个字段里面的最高分作为文档1的得分即2分。
文档2得分过程:
因为文档2在执行subject的match的查询时仅命中text,subject字段得1分;文档2在执行title的match的查询时仅命中full,title字段得1分;取两个字段里面的最高分作为文档1的得分即1分。
所以文档1比文档2的得分即匹配度更高。
most_fields: 查找与任何字段匹配的文档并组合来自每个字段的_score作为整个文档的得分。