文章目录
1. multi_match 简介
这个multi_match实际上算是类似一个组合查询,他把dis_max query, phrase query, phrase_prefix,bool_prefix等给打包到一起了,使用的时候按照需要选用就可以了,这样的话就更加简单易用了。
但是在使用的时候又不想纯粹的只做组合的query(bool query,dis_max query等),哪些只做组合的query没有自己的查询语法,只是组合别的查询query,multi_match有自己的查询语法,是对多个查询类型的封装,暴露给外面的是一个新的api,不是bool那种还是使用子query的查询方式。而且他允许多字段查询。
一个简单的样例
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "subject", "message" ]
}
}
}
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ] #filed 的name可以使用通配符
}
}
}
GET /_search
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ] # subject会被提升权重
}
}
}
field的数量不能超过1024
2. multi_match 查询类型
multi_match 是如何支持dis_max,phrase,phrase_prefix等等查询的呢,在这里引入了一个参数叫 type,type的取值如下
best_fields:(默认)查找与任何字段匹配的文档,但使用最佳字段中的_score。请参阅best_fields。
most_fields: 查找与任何字段匹配的文档,并组合每个字段的_score。请参阅most_fields。
cross_fields: 使用相同的分析器将多个字段内容视为一个大字段。在大字段中查找每个单词。参见cross_fields。
phrase: 在每个字段上运行match_phrase查询,并使用最佳字段中的_score。参见词组和词组前缀。
phrase_prefix: 在每个字段上运行match_phrase_prefix查询,并使用最佳字段中的_score。参见词组和词组前缀。
bool_prefix: 在每个字段上创建一个match_bool_prefix查询,并组合每个字段中的_score。请参阅bool_prefix。
1. best_fields
当您在同一字段中search多个单词时,best_fields类型最有用。例如,搜索“brown fox”的时候,单个字段中的“brown fox”比一个字段中的“brown”和另一字段中的“ fox”更有意义。
best_fields类型为每个字段生成一个匹配查询,并将它们包装在dis_max查询中,以查找单个最佳匹配字段。例如,此查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "brown fox",
"type": "best_fields",
"fields": [ "subject", "message" ],
"tie_breaker": 0.3
}
}
}
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "match": { "message": "brown fox" }}
],
"tie_breaker": 0.3
}
}
}
其中的tie_breaker和dis_max的查询是一样的含义
因为best_fields and most_fields 的multi_match是以field为中心进行查询的,所以operator和minimum_should_match参数会单独的对每个field起作用
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "best_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
这个对应的语义是
(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)
2. most_fields
当多个field对相同内容采用不用的analyze进行存储,如果想对这多个字段进行搜索从而获得更加准确的结果的话,使用most_fields更加合适。比如,main field可能包含synonums,stemming , terms without diacritic(变音符),
second field 包含了原有的terms, third field 包含了shingles。这样的话就可以使用三个field的score来计算final score进而得到更好的排序效果。
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown fox",
"type": "most_fields",
"fields": [ "title", "title.original", "title.shingles" ]
}
}
}
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "quick brown fox" }},
{ "match": { "title.original": "quick brown fox" }},
{ "match": { "title.shingles": "quick brown fox" }}
]
}
}
}
3. phrase和phrase_prefix
phrase_prefix 和phrase和 best_fields类似
也可以使用tie_breaker参数,同时还可以使用boost,lenient,slop等在match_phase中使用的参数
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "phrase_prefix",
"fields": [ "subject", "message" ]
}
}
}
等同于
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match_phrase_prefix": { "subject": "quick brown f" }},
{ "match_phrase_prefix": { "message": "quick brown f" }}
]
}
}
}
4. cross_fields
cross_fields类型对于结构化文档(其中多个字段应匹配)特别有用。例如,当在first_name和last_name字段中查询“ Will Smith”时,最匹配的一个字段中可能有“ Will”,而另一个字段中有“ Smith”。
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
执行的逻辑是
+(first_name:will last_name:will)
+(first_name:smith last_name:smith)
5. bool_prefix
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "bool_prefix",
"fields": [ "subject", "message" ]
}
}
}