06.full_text multi_match查询

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" ]
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值