《ElasticSearch查询》目录导航:html
匹配(Match)查询属于全文(Fulltext)查询,不一样于词条查询,ElasticSearch引擎在处理全文搜索时,首先分析(analyze)查询字符串,而后根据分词构建查询,最终返回查询结果。匹配查询共有三种类型,分别是布尔(boolean)、短语(phrase)和短语前缀(phrase_prefix),默认的匹配查询是布尔类型,这意味着,ElasticSearch引擎首先分析查询字符串,根据分析器对其进行分词,例如,对于如下match查询:数组
"query":{
"match":{
"eventname":"Microsoft Azure Party"
}
查询字符串是“Microsoft Azure Party”,被分析器分词以后,产生三个小写的单词:microsoft,azure和party,而后根据分析的结果构造一个布尔查询,默认状况下,引擎内部执行的查询逻辑是:只要eventname字段值中包含有任意一个关键字microsoft、azure或party,那么返回该文档,伪代码是:less
if (doc.eventname contains "microsoft" or doc.eventname contains "azure" or doc.eventname contains "party") return doc
匹配查询的行为受到两个参数的控制:elasticsearch
经过调整operator 和 minimum_should_match 属性值,控制匹配查询的逻辑条件,进而控制引擎返回的结果。默认状况下operator的值是or,在构造查询时设置分词之间的逻辑运算符,若是设置为and,那么引擎内部执行的查询逻辑是:ide
if (doc.eventname contains "microsoft" and doc.eventname contains "azure" and doc.eventname contains "party") return doc
对于minimum_should_match 属性值,默认值是1,若是设置其值为2,表示分词必须匹配查询条件的数量为2,这意味着,只要文档的eventname字段包含任意两个关键字,就知足查询条件。ui
短语(Phrase)是一个字符串,其单个分词出现的位置和分词的数量是固定的。在进行短语查询时,必须匹配短语中每一个分词及其相对位置,例如,对于包含两个分词的短语:“azure function”,分词“azure”出如今分词“function”以前,而且两个词条之间的位置相差一个空格,下面两个字符串都知足短语匹配:spa
一,布尔匹配查询code
布尔型match查询是把query参数中的条件字符串加以分析,使用索引映射中定义的分析器对字符串分词,而后构建相应的子查询,ElasticSearch选择合适的分析器(analyzer),该analyzer和创建索引时使用的分析器相同。在执行match查询时,默认状况下,字段值必须匹配任意一个词条,例如,当文档的eventname字段匹配任意一个分词,azure、aws和cloud时,该文档匹配match查询,匹配分词的数量是由匹配参数控制的。htm
POST /_search -d
{
"from":10, "size":5, "query":{ "match":{ "eventname":"azure aws cloud" } } }
2,match查询经常使用的参数blog
POST /search -d
{
"from":10, "size":5, "query":{ "match":{ "eventname":{ "query":"azure aws cloud security", "operator":"or", "minimum_should_match":2 } } } }
二,短语匹配查询(match_phrase)
在执行短语匹配查询时,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的全部分词,而且保证各个分词的相对位置不变:
POST /_search -d
{
"from":1, "size":100, "fields":[ "eventname"], "query":{ "match_phrase":{ "eventname":"Open Source" } } }
三,短语前缀匹配查询(match_phrase_prefix)
除了把查询文本的最后一个分词只作前缀匹配以外,match_phrase_prefix和match_phrase查询基本同样,参数 max_expansions 控制最后一个单词会被重写成多少个前缀,也就是,控制前缀扩展成分词的数量,默认值是50。扩展的前缀数量越多,找到的文档数量就越多;若是前缀扩展的数量太少,可能查找不到相应的文档,遗漏数据。如代码所示,可以查到eventname包含"Open Source Hack Night"的文档。
POST /_search -d
{
"from":1, "size":100, "fields":[ "eventname" ], "query":{ "match_phrase_prefix":{ "eventname":{ "query":"Open Source hac", "max_expansions":50 } } } }
四,多字段匹配查询
在多个字段上执行匹配相同的查询,叫作"multi_match"查询,Elasticsearch共有五种多字段匹配查询:best_fields,most_fields,cross_fields,phrase和phrase_prefix,默认的是best_fields类型,以下示例代码:
{ "multi_match" : { "query": "Microsoft Azure", "fields": [ "subject", "message" ] } }
参数query指定查询的条件,在match查询中,query中的参数被分析成分词;参数type指定查询的类型,默认值是best_fields;参数fields指定字段数组,ElasticSearch在每一个字段上匹配参数query。对于best_fields和most_fields类型,每一个字段都会拆分红一个子查询(Individual Query),这意味着,ElasticSearch引擎在每一个字段上生成一个子查询,每一个子查询都匹配相同的query参数。
在示例中,参数query被拆分红两个分词microsoft和azure,ElasticSearch引擎有两个参数设置每一个子查询(Individual Query)应该匹配的分词数量。
参数operator设置每一个字段的子查询的匹配分词的逻辑方式,默认值是or,例如,若是设置参数operator为and,那么subject字段中必须同时含有microsoft和azure这两个分词。也就是说,匹配全部的分词。
"operator":"and"
当参数operator使用默认值时,参数minimum_should_match设置每一个子查询应该匹配多少个分词,默认值是1,例如,设置minimum_should_match为1,那么subject字段中至少含有microsoft或azure的一个分词。
“operator”:"or" "minimum_should_match":1
1,best_fields类型
best_fields类型是默认值,从指定的字段中匹配查询,每一个字段都计算评分(_score),返回最高的评分。若是不考虑评分,那么best_fields查询类型的含义是从指定的字段中执行查询,返回匹配的文档。
对于best_fields和most_fields查询类型,它们都是基于字段拆分的,每一个字段都会产生一个子查询,
{ "multi_match" : { "query": "Will Smith", "type": "best_fields", "fields": [ "first_name", "last_name" ], "operator": "and" } }
跟best_fields类型相同的查询类型是dis_max,字母dis是单词“Disjunction”的简写,意思是分离,dis_max查询类型有一个子查询数组,每个子查询都单独计算评分,返回子查询中最高的评分。若是忽略评分,那么dis_max查询类型的含义是执行指定的子查询,返回匹配的文档。
{ "dis_max": { "queries": [ { "match": { "subject": "brown fox" }}, { "match": { "message": "brown fox" }} ] } }
2,most_fields类型
most_fields类型是默认值,从指定的字段中匹配查询,每一个字段都计算评分(_score),最后把每一个字段的评分合并(Combine)在一块儿,求平均分。若是不考虑评分,那么most_fields查询类型的含义是从指定的字段中执行查询,返回匹配的文档。
该类型的查询相似于布尔查询的should子句查询,
{ "bool": { "should": [ { "match": { "title": "quick brown fox" }}, { "match": { "title.original": "quick brown fox" }}, { "match": { "title.shingles": "quick brown fox" }} ] } }
3,phrase和phrase_prefix查询类型
该类型的query是phrase,在每一个字段上执行查询,而后返回最高的评分,相似于best_fields类型。
{ "multi_match" : { "query": "quick brown f", "type": "phrase_prefix", "fields": [ "subject", "message" ] } } { "dis_max": { "queries": [ { "match_phrase_prefix": { "subject": "quick brown f" }}, { "match_phrase_prefix": { "message": "quick brown f" }} ] } }
4,cross_fields类型
该查询类型是把query条件拆分红各个分词,而后在各个字段上执行匹配分词,默认状况下,只要有一个字段匹配,那么返回文档。
例如,query参数拆分红will和smith两个分词,当参数operator为and时,字段first_name或last_name必须包含will ,而且 first_name或last_name必须包含smith。
{ "multi_match" : { "query": "Will Smith", "type": "cross_fields", "fields": [ "first_name", "last_name" ], "operator": "and" } }
若是参数operator为or,字段first_name或last_name必须包含will ,或者 first_name或last_name必须包含smith,其等价的逻辑是,只要字段 first_name或last_name中包含 will或smith就返回文档。
参考文档: