《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,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就返回文档。

参考文档:

Elasticsearch Reference [2.4] » Query DSL

TSql 分层和递归查询的更多相关文章

  1. CTE 递归查询

    使用CTE进行递归查询,能够实现对层次结构的数据的快速访问,非常有用. TSql CTE 递归原理探究 TSql 分层和递归查询 1,CTE的递归结构 递归查询的结构包括两部分:起始点和迭代公式. 使 ...

  2. [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法)   -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...

  3. T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...

  4. T-SQL with as 的用法(转) SQL 下的递归查询 SQL2005(CTE) ,SQL2000(Function 递归)

    摘自: http://blog.csdn.net/bluefoxev/article/details/6779794 ------- SQL2005 方法 一.WITH AS的含义     WITH ...

  5. T-SQL—理解CTEs

    在推出SQLServer2005之后,微软定义了一个新的查询架构叫做公共表表达式--CTE.CTE是一个基于简单查询的临时结果集,在一个简单的插入.更新.删除或者select语句的执行范围内使用.再本 ...

  6. 【转载】Oracle递归查询:使用prior实现树操作【本文出自叶德华博客】

    本文标题:Oracle递归查询:使用prior实现树操作 本文链接:http://yedward.net/?id=41 本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处. Oracle ...

  7. TSql CTE 递归原理探究

    CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( as jd union all as jd from cte ) ...

  8. SQL Server 2012新特性(1)T-SQL操作FileTable目录实例

    在SQL Server 2008提供FileStream,以借助Windows系统本身的API来强化SQL Server对于非结构化数据的支持后,SQL Server 2012更是推出了像Contai ...

  9. SQL递归查询知多少

    最近工作中遇到了一个问题,需要根据保存的流程数据,构建流程图.数据库中保持的流程数据是树形结构的,表结构及数据如下图: 仔细观察表结构,会发现其树形结构的特点: FFIRSTNODE:标记是否为根节点 ...

随机推荐

  1. Docker ntpdate Permition error

    After building a Dockerfile, I run it. I figure out that there is something wrong with local time. S ...

  2. Python成长笔记 - 基础篇 (七)python面向对象

      三大特性: 1.封装:在类中对数据赋值.内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法 2.继承:一个类可以派生出子类,在父类中定义的属性.方法会自动被子类继承 ...

  3. CardView

    CardView继承至FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影.CardView是一个Layout,可以布局其他View. CardView常用属性: c ...

  4. C++多态(一)

    面试题目中关于多态的问题不少,例如重载.虚函数(覆盖).多态的概念等等,这里做一个梳理,包含如下内容: 一.多态的定义 (一)定义 能够呈现不同形态的特性或状态. (二)两种多态性 1.编译时的多态性 ...

  5. iOS网络基础知识

    iOS网络基础知识 1.一次HTTP请求的完整过程 (1)浏览器或应用发起Http请求,请求包含Http请求Http(请求),地址(url),协议(Http1.1)请求为头部 (2)web服务器接收到 ...

  6. unity 实现简单的分离

    在网上随便搜一搜资料就可以找到很多关于Mvc ,MVVM,StrangeIoc等有关显示与数据分离的博客,很多大神也是讲的蛮有道理的,但是这些框架理解起来有一定的难度, 这时候肯定有人说有现成的框架为 ...

  7. [Xamarin] 簡單使用Fragment 靜態篇 (转帖)

    新的Android 開發,非常會使用到Fragment,不過官方範例有點小複雜,對初學者來說有點難消化,所以就記錄一下心得,這邊部落格將使用靜態的方法使用Fragment,Fragment 有自己的生 ...

  8. 软件工程day4

    使用ps制作了一个icon,将在下个版本中添加,用作程序图标. 参与组例会,得知新功能“吐槽墙”将以聊天室类似的社区形式实现. 提出对现有UI的建议: 对目前的登录窗口的UI不做改动,将标题的“用户登 ...

  9. RCP:给GEF编辑器添加拖拽辅助线

    当图形边缘碰触时,会产生一条帮助拖拽的辅助线 这里需要三个类: 1.SnapToGeomotry 2.SnapToGuide(非必须) 3.SnapFeedbackPolicy

  10. java 网络(socket)

    本文梳理一个基础的java TCP消息通信,构造一个简单的Packet进行传输,代码如下: Packet public class Packet { private String attribute; ...