elasticsearch查询第四篇:匹配查询(match)

悦光阴 悦光阴     2022-08-26     725

关键词:

匹配(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的值是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
         }
      }
   }
}

 

 

参考文档:

Elasticsearch Reference [2.4] » Query DSL

第四篇:添加一个线程组

...30QPS的时候的一个平均的响应时间;QPS:querypersecond每秒查询率,是查询服务器每秒能处理的查询次数,在因特网上,作为域名系统服务器的性能常用每秒查询率来衡量;2.测试步骤:线程数:虚拟用户数,一个虚拟用户占用一个... 查看详情

第四篇:记录相关操作多表查询(代码片段)

...blogs.com/linhaifeng/articles/7267596.html一介绍本节主题多表连接查询复合条件连接查询子查询准备表#建表createtabledepartment(idint,namevarchar(20));createtableemployee(idintprimarykeyauto_increment,namevarchar(20),sexenum(‘male‘,‘female‘)notnulldefault‘male‘,ag... 查看详情

mysql从青铜到王者第四篇:数据库表的基本查询增删查改

...张exam_result的表2.向exam_result表中插入数据3.select列1.全列查询2.指定列查询3.查询字段为表达式4.为查询结果指定别名5.查询结果去重4.where 查看详情

好玩的es--第四篇之聚合查询和集群(代码片段)

好玩的ES--第四篇之聚合查询和集群聚合查询简介测试数据使用根据某个字段分组求最大值求最小值求平均值求和整合应用集群集群Cluster相关概念集群<cluster>节点<node>索引<Index>映射<Mapping>文档<Document>分片&l... 查看详情

好玩的es--第四篇之聚合查询和集群(代码片段)

好玩的ES--第四篇之聚合查询和集群聚合查询简介测试数据使用根据某个字段分组求最大值求最小值求平均值求和整合应用集群集群Cluster相关概念集群<cluster>节点<node>索引<Index>映射<Mapping>文档<Document>分片&l... 查看详情

第四篇express安装esasticsearch

...s-generatorexpress./autocompletercdautocompleternpminstall2.让我们准备elasticsearch。下载elasticsearch,并将其解压到文件系统的某个位置。然后运行cdlocationOfElasticsearchb 查看详情

第四篇:记录相关操作(代码片段)

...入UPDATE实现数据的更新使用DELETE实现数据的删除使用SELECT查询数据以及。=============================== 查看详情

django学习~第四篇

...,这是最基本的    GET方法GET一般用于获取/查询资源信息,以?分割URL和传输数据,多个参数用&连接,login.action?name=hyddd&password=idont 查看详情

使用模糊 NEST 进行多匹配查询 - ElasticSearch

】使用模糊NEST进行多匹配查询-ElasticSearch【英文标题】:MultimatchquerywithFuzzyNEST-ElasticSearch【发布时间】:2020-07-1411:12:10【问题描述】:我编写了以下查询来检查一个值的多个字段,它的工作原理:varsearchResponse=client.Search<Documen... 查看详情

[elasticsearch]邻近匹配-性能,关联单词查询以及shingles

提高性能短语和邻近度查询比简单的match查询在性能上更昂贵。match查询只是查看词条是否存在于倒排索引(InvertedIndex)中,而match_phrase查询则需要计算和比较多个可能重复词条(Multiplepossiblyrepeated)的位置。在LuceneNightlyBenchmarks中,... 查看详情

elasticsearch-文档精确查询(term)(代码片段)

Elasticsearch-文档精确查询(term)match&termmatch:匹配查询term:精准查询term&match+text&keywordterm&match区别term:精确查询,对查询的值不分词,直接进倒排索引去匹配。match:模糊查询,对查询的值分词,对分词的结果一一进... 查看详情

深入理解脚本化css系列第四篇——脚本化样式表

...mes;目录[1]CSSStyleSheet[2]CSSRule前面的话  关于脚本化CSS,查询样式时,查询的是计算样式;设置单个样式时,设置的是行间样式;设置多个样式时,设置的是CSS类名。脚本化样式表当然也是一种脚本化CSS的技术,虽然不经常使用... 查看详情

elasticsearch系列(13)query之全文查询

参考技术A全文查询(Fulltextqueries)能够搜索已分析的text字段,如电子邮件的正文。全文查询支持以下方式的查询:匹配(match)查询返回与字段匹配的文档,支持字段类型包括文本、数字、日期或布尔值,对于文本值,在匹配... 查看详情

当查询文本是子字符串时,Elasticsearch 完全匹配

】当查询文本是子字符串时,Elasticsearch完全匹配【英文标题】:Elasticsearchexactmatcheswhenquerytextisasubstring【发布时间】:2014-08-2717:34:05【问题描述】:我的Elasticsearch中有一个字段的数据PUT/logs/visited_domains/1"visited_domain":"microsoft.com"P... 查看详情

elasticsearch查询matchterm和bool区别

es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。由于DSL查询更为直观也更为简易,所以大都使用这种方式。DSL查询是POST过去一个json,由于post的请求是json格式的,... 查看详情

elasticsearch基本查询

词条查询 这是一个简单查询。它仅匹配给定字段中包含该词条的稳定,且是2未经分析的确切的词条。 { “query”:{ “term”:{ “title”:”crime” } } } 多词条查询 匹配内容中包含某些词条的文... 查看详情

elasticsearch基本操作

...们发现,总共有12条数据,但是hits中默认只返回了10条。ElasticSearch中的聚合查询和groupby类似。聚合查询的关键字是aggs特定字段查询所有特定值查询结果我们分析查询结果可以看出,模糊匹配并不能去匹配整个词语。习语匹配习... 查看详情

elasticsearch7.8.0版本高级查询——完全匹配查询文档(代码片段)

目录一、初始化文档数据二、完全匹配查询文档2.1、概述2.2、示例一、初始化文档数据在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/1,请求体内容为:"name":"zhangsan","age":20,"sex"... 查看详情