您的位置:首页 > 其它

ElasticSearch查询 第四篇:匹配查询(Match)

2017-10-19 10:16 387 查看
《ElasticSearch查询》目录导航:

ElasticSearch查询 第一篇:搜索API

ElasticSearch查询 第二篇:文档更新

ElasticSearch查询 第三篇:词条查询

ElasticSearch查询 第四篇:匹配查询(Match)

ElasticSearch查询 第五篇:布尔查询

匹配(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,那么返回该文档,伪代码是:

if (doc.eventname contains "microsoft" or doc.eventname contains "azure" or doc.eventname contains "party")
return doc


匹配查询的行为受到两个参数的控制:

operator:表示单个字段如何匹配查询条件的分词

minimum_should_match:表示字段匹配的数量

通过调整operator 和 minimum_should_match 属性值,控制匹配查询的逻辑条件,进而控制引擎返回的结果。默认情况下operator的值是or,在构造查询时设置分词之间的逻辑运算符,如果设置为and,那么引擎内部执行的查询逻辑是:

if (doc.eventname contains "microsoft" and doc.eventname contains "azure" and doc.eventname contains "party")
return doc


对于minimum_should_match 属性值,默认值是1,如果设置其值为2,表示分词必须匹配查询条件的数量为2,这意味着,只要文档的eventname字段包含任意两个关键字,就满足查询条件。

短语(Phrase)是一个字符串,其单个分词出现的位置和分词的数量是固定的。在进行短语查询时,必须匹配短语中每个分词及其相对位置,例如,对于包含两个分词的短语:“azure function”,分词“azure”出现在分词“function”之前,并且两个词条之间的位置相差一个空格,下面两个字符串都满足短语匹配:

"Azure Notification Hubs & Azure Function"

"Serverless Azure Function"

一,布尔匹配查询

布尔型match查询是把query参数中的条件字符串加以分析,使用索引映射中定义的分析器对字符串分词,然后构建相应的子查询,ElasticSearch选择合适的分析器(analyzer),该analyzer和建立索引时使用的分析器相同。在执行match查询时,默认情况下,字段值必须匹配任意一个词条,例如,当文档的eventname字段匹配任意一个分词,azure、aws和cloud时,该文档匹配match查询,匹配分词的数量是由匹配参数控制的。

View Code
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就返回文档。

参考文档:

Elasticsearch Reference [2.4] » Query DSL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: