设为首页 收藏本站
查看: 955|回复: 0

[经验分享] ElasticSearch查询 第四篇:匹配查询(Match)

[复制链接]

尚未签到

发表于 2017-7-1 07:03:36 | 显示全部楼层 |阅读模式
  《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查询,匹配分词的数量是由匹配参数控制的。



POST /_search -d
{  
"from":10,
"size":5,
"query":{  
"match":{  
"eventname":"azure aws cloud"
}
}
}
  2,match查询常用的参数


  • operator:用来控制match查询匹配词条的逻辑条件,默认值是or,如果设置为and,表示查询满足所有条件;
  • minimum_should_match:当operator参数设置为or时,该参数用来控制应该匹配的分词的最少数量;



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类型。


DSC0000.gif DSC0001.gif


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389881-1-1.html 上篇帖子: Power BI官方视频(2) Power BI嵌入到应用中的3种方法 下篇帖子: 在Application中集成Microsoft Translator服务之开发前准备
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表