Elasticsearch Match query -- 匹配查询
摘要
返回满足匹配项的文档,这些匹配项可以是字符串、数字、日期、布尔。字符串,会在搜索前被解析。该match查询是用于执行全文搜索(包括模糊匹配选项)的标准查询。
参数
你想搜索的字段
匹配规则参数(忽略了一些参数,不常用或者是我不会用的参数)
query
,必选项。字符串、数字、日期、布尔。字符串。该match查询分析执行搜索之前的任何提供的文本。这意味着match查询可以在text字段中搜索分析的标记,而不是确切的词。analyzer
,选填项。指定在执行搜索之前对query
提供的文本进行分析的方式。默认为field
的分析器一致。auto_generate_synonyms_phrase_query
,选填项。如果"auto_generate_synonyms_phrase_query":true
,则会自动为词组组成match phrase
查询。参见下文匹配词组 match phrase。operator
,选填项。布尔逻辑,用于解释query
中的文本。"operator": "or"
:"query": "capital of Hungary"
解释为capital OR of OR Hungary
;"operator": "and"
:解释为capital AND of AND Hungary
。可以用来组建一个临时的词组,某种意义上来说,就类似于match_phrase
查询。
匹配布尔前缀 match_bool_prefix
这类查询,会在查询之前分析query
指定的文本,然后构造出一个bool
复合查询。query
经过分词后,除了最后一个词将被组成一个prefix
查询外,其他词组会被构造成tern查询。总的来说,这类查询,是bool的一种简写
文档中,下面两者请求示例等价
GET /_search
{
"query": {
"match_bool_prefix" : {
"state" : "MD CT G"
}
}
}
GET /_search
{
"query": {
"bool" : {
"should": [
{ "term": { "state": "MD" }},
{ "term": { "state": "Cd" }},
{ "prefix": { "state": "G"}}
]
}
}
}
说明
在实验中,下面的两种示例并不完全等价;就拿官方提供的数据而言,假如说state
的类型为text
则下面的两种情况,结果才会相同。
GET /bank/_search
{
"query": {
"match_bool_prefix" : {
"state" : "MD CT G"
}
}
}
GET /bank/_search
{
"query": {
"bool" : {
"should": [
{ "term": { "state.keyword": "MD" }},
{ "term": { "state.keyword": "CT" }},
{ "prefix": { "state.keyword": "G"}}
]
}
}
}
若state的类型为keyword,则下面示例的结果不同
GET /blak_new/_search
{
"query": {
"match_bool_prefix" : {
"state." : "MD CT G"
}
}
}
GET /blak_new/_search
{
"query": {
"bool" : {
"should": [
{ "term": { "state": "MD" }},
{ "term": { "state": "CT" }},
{ "prefix": { "state": "G"}}
]
}
}
}
匹配词组 match_phrase
这种查询将分析文本,并从分析的文本中创建短语查询。
例如一些俚语、专有名词、缩写等。分词器,不会将这些词组拆分成单个的字。
用户可以构建自己的词库。
请求示例,我在自己的词库中添加了一个词组671 Bristol Street
前一个搜索请求,只要文档中包含671
或 Bristol
或 Street
就满足匹配条件;但第二个搜索请求只会匹配存在词组671 Bristol Street
的文档
GET /bank/_search
{
"query": {
"match" : {
"address" : {
"query" : "671 Bristol Street",
"auto_generate_synonyms_phrase_query":true
}
}
}
}
GET /bank/_search
{
"query": {
"match_phrase" : {
"address" : {
"query" : "671 Bristol Street"
}
}
}
}
匹配词组前缀 match_phrase_prefix
以包含的顺序,返回所提供文本的单词的文档。提供的最后一个词被视为前缀,匹配以该词开头的任意单词。简单的来说,query是一个整体。
下面的这个示例会匹配a rule object,而不会匹配 a best rule of ,rule of you 等;
GET _search
{
"query": {
"match_phrase_prefix": {
"address": {
"query": "a rule o"
}
}
}
}
多关键词匹配查询 multi_match
- 基于match,允许多个字段查询
- 字段可以使用通配符
- 字段可以使用
^number
,增强某个字段的重要性 - 如果为提供
fields
,则会默认为index.query.default_field
。这回提取映射中符合词条查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来构建查询。可以一次查询的字段数有限制。它由“indices.query.bool.max_clause_count
定义。
multi_match的types参数
- best_fields,默认值。query字段的单词(分词器分词后)出现在同一个field文档相关度要高于出现在多个field文档。