elasticsearch查询语法(elasticsearch聚合查询)

本文目录
- elasticsearch聚合查询
- ElasticSearch查询之——Search API
- 深入研究查询Elasticsearch,过滤查询和全文搜索
- elasticsearch基本查询笔记(三)-- es查询总结
- elasticsearch bool查询
- Elasticsearch查询语句语法
- Elasticsearch的几种查询方式及其参数说明
- Elasticsearch 查询表达式
elasticsearch聚合查询
1.bucket和metric的概念
bucket是聚合查询的数据分组, 小学学生用年级分组,六个年级得到了6个bucket,bucket就是每个年级下的学生
metric就是分组之后,统计分析. 求和,最大值,最小值,平均值等
类似sql的语法的group having
数据准备
创建数据
1、根据color分组统计销售数量
只执行聚合分组,不做复杂的聚合统计。在ES中最基础的聚合为terms,相当于SQL中的count。
在ES中默认为分组数据做排序,使用的是doc_count数据执行降序排列。可以使用_key元数据,根据分组后的字段数据执行不同的排序方案,也可以根据_count元数据,根据分组后的统计值执行不同的排序方案。
2、统计不同color车辆的平均价格
本案例先根据color执行聚合分组,在此分组的基础上,对组内数据执行聚合统计,这个组内数据的聚合统计就是metric。同样可以执行排序,因为组内有聚合统计,且对统计数据给予了命名avg_by_price,所以可以根据这个聚合统计数据字段名执行排序逻辑。
通过颜色分组,得到组数据,每一组再次通过品牌分组,每一个品牌的平均值
嵌套式的分组成为下钻分析
aggs是同级为平铺分析
统计不同color中的最大和最小价格、总价
统计不同品牌汽车中价格排名最高的车型
在分组后,可能需要对组内的数据进行排序,并选择其中排名高的数据。那么可以使用s来实现:top_top_hithits中的属性size代表取组内多少条数据(默认为10);sort代表组内使用什么字段什么规则排序(默认使用_doc的asc规则排序);_source代表结果中包含document中的那些字段(默认包含全部字段)。
区间统计
histogram 区间统计
histogram类似terms,也是进行bucket分组操作的,是根据一个field,实现数据区间分组。
如:以100万为一个范围,统计不同范围内车辆的销售量和平均价格。那么使用histogram的聚合的时候,field指定价格字段price。区间范围是100万-interval : 1000000。这个时候ES会将price价格区间划分为: [0, 1000000), [1000000, 2000000), [2000000, 3000000)等,依次类推。在划分区间的同时,histogram会类似terms进行数据数量的统计(count),可以通过嵌套aggs对聚合分组后的组内数据做再次聚合分析。
date_histogram可以对date类型的field执行区间聚合分组,如每月销量,每年销量等。
如:以月为单位,统计不同月份汽车的销售数量及销售总金额。这个时候可以使用date_histogram实现聚合分组,其中field来指定用于聚合分组的字段,interval指定区间范围(可选值有:year、quarter、month、week、day、hour、minute、second),format指定日期格式化,min_doc_count指定每个区间的最少document(如果不指定,默认为0,当区间范围内没有document时,也会显示bucket分组),extended_bounds指定起始时间和结束时间(如果不指定,默认使用字段中日期最小值所在范围和最大值所在范围为起始和结束时间)。
在kibana dashboard看板的时候,时序图经常使用时间区域作为x轴查看数据
7.x之前
7.x之后
在聚合统计数据的时候,有些时候需要对比部分数据和总体数据。
如:统计某品牌车辆平均价格和所有车辆平均价格。global是用于定义一个全局bucket,这个bucket会忽略query的条件,检索所有document进行对应的聚合统计
如果有多层aggs,执行下钻聚合的时候,也可以根据最内层聚合数据执行排序。
如:统计每个品牌中每种颜色车辆的销售总额,并根据销售总额降序排列。这就像SQL中的分组排序一样,只能组内数据排序,而不能跨组实现排序。
filter也可以使用在aggs句法中,filter的范围决定了其过滤的范围。
如:统计某品牌汽车最近一年的销售总额。将filter放在aggs内部,代表这个过滤器只对query搜索得到的结果执行filter过滤。如果filter放在aggs外部,过滤器则会过滤所有的数据。
12M/M 表示 12 个月。
1y/y 表示 1年。
d 表示天
***隐藏网址***
ElasticSearch查询之——Search API
实现对ES中存储的数据进行查询分析,使用的关键字是 _search ,比如下面的API
小例子:查询job字段中包含java的文档,结果根据age属性进行升序排序,返回第1个文档,如果超过1s没有结束,则以超时结束。
多词匹配之间使用空格进行隔开,词语之间的关系为 “或”
若想使用词语匹配,需要用双引号括起来
泛查询在之前其实就有演示过,即像 q = xiaoming 这种不指定检索字段范围,会在所有字段中进行检索的查询即称为泛查询。反之,如果指定了字段,就能大大缩小范围。常见的指定字段的方式为 字段:检索条件字符 。
SearchURI中也可以使用和和 Query DSL 类型的布尔操作符,不过具体的使用规则略有不同,具体的规则如下:
需要注意的是, “+” 号在url中会被解析为空格,要使用encode后的结果才可以,我们需要用%2B来替代一下。
范围查询支持数据范围和日期范围的查询,具体的表达式写法有两种方式:
Query URI 支持我们使用通配符来进行模糊查询, ? 表示一个字符, * 表示一个或者多个字符
注意: 通配符匹配执行效率低,且占用较多内存 ,数据较多时不建议使用
如无特殊需求,不要将 ?/* 放在最前面(因为会加大匹配的范围,降低匹配效率)
Query URI 支持我们使用正则表达式来进行检索
当我们对于检索条件字符不明确时, Query URI 支持我们使用近似值来作为模糊查询的条件,这个和之前的通配符不太一样,通配符很多时候是基于我们清楚某一段字符中的某个区间内容了(比如说最终的结果是 xiaoming ,我们可以根据知道的字符进行匹配,比如 xiao* 、 *ming )。而近似值匹配可以是众多模糊匹配的并集。
Request Body Search 字如其意,就是通过在 body 中添加请求体来实现搜索。我们在第二节中学习了 Query URI 的众多语法可能会觉得它已经很强大,但实际上第三节的将要介绍的 Query DSL 会更加强大和灵活,不仅支持URI写法的所有语法,还支持更多高阶的语法查询。也是我们日常工作中更为常用的一种检索方式。
字段类的查询可以分为全文匹配和单词匹配,两者的区别在于会不会对查询语句进行分词后处理,全文匹配会(match、match_phrase),单词匹配(term、terms、range)不会。
该方法用于对字段作检索,对字段有顺序要求
Query String Query 其实就相当于 Query URI 的请求体写法
Simple Query String Query 类似于Query String,但是会忽略错误的查询语法,并且仅支持部分查询语法。其常用的逻辑符号如下,不能使用AND、OR、NOT等关键词,而是要对应地使用 + | - 。
Term Query 将查询语句作为整个单词进行查询,即不对查询语句做分词处理
terms query 和 term query 类似,差别在于后者可以同时支持多个全词匹配
Query DSL 支持我们使用 Range Query 来使用范围匹配
拓展:
我们可以发现,之前列举的字段类查询只能够满足单个字段查询条件的使用,当涉及到多个字段时,字段类查询的 match 和 term 等API就无能为力了。满足这种多字段检索需要的方式是使用复合查询。
·复合查询是指包含字段类查询或复合查询的类型,主要包括以下几类∶ constant_score query 、 bool query 、 dis_max query 、 function_score query 、 boosting query
这里的话,主要讲一下布尔查询 Bool Query
当我们不需要获取详细的文档信息,只需要获取命中的文档数量时,就可以使用count来获取我们想要的结果。
当我们只需要获取命中文档的指定字段值时,我们可以通过source来指定我们需要es返回的值
深入研究查询Elasticsearch,过滤查询和全文搜索
或如何了解缺少哪些官方文件
如果我不得不用一个短语来描述Elasticsearch,我会说:
目前,Elasticsearch在十大最受欢迎的开源技术中。 公平地说,它结合了许多本身并不独特的关键功能,但是,当结合使用时,它可以成为最佳的搜索引擎/分析平台。
更准确地说,由于以下功能的结合,Elasticsearch变得如此流行:
· 搜索相关性评分
· 全文搜索
· 分析(汇总)
· 无模式(对数据模式无限制),NoSQL,面向文档
· 丰富的数据类型选择
· 水平可扩展
· 容错的
通过与Elasticsearch进行合作,我很快意识到,官方文档看起来更像是所谓文档的"挤压"。 我不得不在Google上四处搜寻,并且大量使用stackowerflow,所以我决定编译这篇文章中的所有信息。
在本文中,我将主要撰写有关查询/搜索Elasticsearch集群的文章。 您可以通过多种不同的方式来实现大致相同的结果,因此,我将尝试说明每种方法的利弊。
更重要的是,我将向您介绍两个重要的概念-查询和过滤器上下文-在文档中没有很好地解释。 我将为您提供一组规则,以决定何时使用哪种方法更好。
在阅读本文后,如果我只想让您记住一件事,那就是:
当我们谈论Elasticsearch时,总会有一个相关性分数。 相关性分数是严格的正浮点数,表示每个文档满足搜索标准的程度。 该分数是相对于分配的最高分数的,因此,分数越高,文档与搜索条件的相关性越好。
但是,过滤器和查询是您在编写查询之前应该能够理解的两个不同概念。
一般来说,过滤器上下文是一个"是/否"选项,其中每个文档都与查询匹配或不匹配。 一个很好的例子是SQL WHERE,后面是一些条件。 SQL查询总是返回严格符合条件的行。 SQL查询无法返回歧义结果。
另一方面,Elasticsearch查询上下文显示了每个文档与您的需求的匹配程度。 为此,查询使用分析器查找最佳匹配。
经验法则是将过滤器用于:
· 是/否搜索
· 搜索精确值(数字,范围和关键字)
将查询用于:
· 结果不明确(某些文档比其他文档更适合)
· 全文搜索
此外,Elasticsearch将自动缓存过滤器的结果。
在第1部分和第2部分中,我将讨论查询(可以转换为过滤器)。 请不要将结构化和全文与查询和过滤器混淆-这是两件事。
结构化查询也称为术语级查询,是一组查询方法,用于检查是否应选择文档。 因此,在很多情况下,没有真正必要的相关性评分-文档匹配或不匹配(尤其是数字)。
术语级查询仍然是查询,因此它们将返回分数。
名词查询 Term Query
返回字段值与条件完全匹配的文档。 查询一词是SQL select * from table_name where column_name =...的替代方式
名词查询直接进入倒排索引,这可以使其快速进行。 在处理文本数据时,最好仅将term用于keyword字段。
名词查询默认情况下在查询上下文中运行,因此,它将计算分数。 即使所有返回的文档的分数相同,也将涉及其他计算能力。
带有过滤条件的 名词 查询
如果我们想加速名词查询并使其得到缓存,则应将其包装在constant_score过滤器中。
还记得经验法则吗? 如果您不关心相关性得分,请使用此方法。
现在,该查询没有计算任何相关性分数,因此,它更快。 而且,它是自动缓存的。
快速建议-对文本字段使用匹配而不是名词。
请记住,名词查询直接进入倒排索引。名词查询采用您提供的值并按原样搜索它,这就是为什么它非常适合查询未经任何转换存储的keyword字段。
多名词查询 Terms query
如您所料,多名词查询使您可以返回至少匹配一个确切名词的文档。
多名词查询在某种程度上是SQL select * from table_name where column_name is in...的替代方法
重要的是要了解,Elasticsearch中的查询字段可能是一个列表,例如{“ name”:}。如果您执行的术语查询包含以下一个或多个,则该记录将被匹配-它不必匹配字段中的所有值,而只匹配一个。
与名词查询相同,但是这次您可以在查询字段中指定多少个确切术语。
您指定必须匹配的数量-一,二,三或全部。 但是,此数字是另一个数字字段。 因此,每个文档都应包含该编号(特定于该特定文档)。
返回查询字段值在定义范围内的文档。
等价于SQL select * from table_name where column_name is between...
范围查询具有自己的语法:
· gt 大于
· gte 大于或等于
· lt 小于
· lte 小于或等于
一个示例,该字段的值应≥4且≤17
范围查询也可以很好地与日期配合使用。
正则表达式查询返回其中字段与您的正则表达式匹配的文档。
如果您从未使用过正则表达式,那么我强烈建议您至少了解一下它是什么以及何时可以使用它。
Elasticsearch的正则表达式是Lucene的正则表达式。 它具有标准的保留字符和运算符。 如果您已经使用过Python的re软件包,那么在这里使用它应该不是问题。 唯一的区别是Lucene的引擎不支持^和$等锚运算符。
您可以在官方文档中找到regexp的完整列表。
除正则表达式查询外,Elsticsearch还具有通配符和前缀查询。从逻辑上讲,这两个只是regexp的特殊情况。
不幸的是,我找不到关于这三个查询的性能的任何信息,因此,我决定自己对其进行测试,以查看是否发现任何重大差异。
在比较使用rehexp和通配符查询时,我找不到性能上的差异。如果您知道有什么不同,请给我发消息。
由于Elasticsearch是无模式的(或没有严格的模式限制),因此当不同的文档具有不同的字段时,这是一种很常见的情况。 结果,有很多用途来了解文档是否具有某些特定字段。
全文查询适用于非结构化文本数据。 全文查询利用了分析器。 因此,我将简要概述Elasticsearch的分析器,以便我们可以更好地分析全文查询。
每次将文本类型数据插入Elasticsearch索引时,都会对其进行分析,然后存储在反向索引中。根据分析器的配置方式,这会影响您的搜索功能,因为分析器也适用于全文搜索。
分析器管道包括三个阶段:
总有一个令牌生成器和零个或多个字符和令牌过滤器。
1)字符过滤器按原样接收文本数据,然后可能在对数据进行标记之前对其进行预处理。 字符过滤器用于:
· 替换与给定正则表达式匹配的字符
· 替换与给定字符串匹配的字符
· 干净的HTML文字
2)令牌生成器将字符过滤器(如果有)之后接收到的文本数据分解为令牌。 例如,空白令牌生成器只是将文本分隔为空白(这不是标准的)。 因此,Wednesday is called after Woden, 将被拆分为。 有许多内置标记器可用于创建自定义分析器。
删除标点符号后,标准令牌生成器将使用空格分隔文本。 对于绝大多数语言来说,这是最中立的选择。
除标记化外,标记化器还执行以下操作:
· 跟踪令牌顺序,
· 注释每个单词的开头和结尾
· 定义令牌的类型
3)令牌过滤器对令牌进行一些转换。您可以选择将许多不同的令牌过滤器添加到分析器中。一些最受欢迎的是:
· 小写
· 词干(存在多种语言!)
· 删除重复
· 转换为等效的ASCII
· 模式的解决方法
· 令牌数量限制
· 令牌的停止列表(从停止列表中删除令牌)
标准分析器是默认分析器。 它具有0个字符过滤器,标准令牌生成器,小写字母和停止令牌过滤器。 您可以根据需要组成自定义分析器,但是内置分析器也很少。
语言分析器是一些最有效的即用型分析器,它们利用每种语言的细节来进行更高级的转换。 因此,如果您事先知道数据的语言,建议您从标准分析器切换为数据的一种语言。
全文查询将使用与索引数据时使用的分析器相同的分析器。更准确地说,您查询的文本将与搜索字段中的文本数据进行相同的转换,因此两者处于同一级别。
匹配查询是用于查询文本字段的标准查询。
我们可以将匹配查询称为名词查询的等效项,但适用于文本类型字段(而在处理文本数据时,名词应仅用于关键字类型字段)。
默认情况下,传递给查询参数的字符串(必需的一个)将由与应用于搜索字段的分析器相同的分析器处理。 除非您自己使用analyzer参数指定分析器。
当您指定要搜索的短语时,将对其进行分析,并且结果始终是一组标记。默认情况下,Elasticsearch将在所有这些标记之间使用OR运算符。这意味着至少应该有一场比赛-更多的比赛虽然会得分更高。您可以在运算符参数中将其切换为AND。在这种情况下,必须在文档中找到所有令牌才能将其返回。
如果要在OR和AND之间输入某些内容,则可以指定minimum_should_match参数,该参数指定应匹配的子句数。 可以数字和百分比指定。
模糊参数(可选)可让您忽略错别字。 Levenshtein距离用于计算。
如果您将匹配查询应用于关键字keyword字段,则其效果与词条查询相同。 更有趣的是,如果将存储在反向索引中的令牌的确切值传递给term查询,则它将返回与匹配查询完全相同的结果,但是会更快地返回到反向索引。
与匹配相同,但顺序和接近度很重要。 匹配查询不了解序列和接近度,因此,只有通过其他类型的查询才能实现词组匹配。
match_phrase查询具有slop参数(默认值为0),该参数负责跳过术语。 因此,如果您指定斜率等于1,则短语中可能会省略一个单词。
多重比对查询的功能与比对相同,唯一的不同是多重比对适用于多个栏位
· 字段名称可以使用通配符指定
· 默认情况下,每个字段均加权
· 每个领域对得分的贡献都可以提高
· 如果没有在fields参数中指定任何字段,那么将搜索所有符合条件的字段
有多种类型的multi_match。 我不会在这篇文章中描述它们,但是我将解释最受欢迎的:
best_fields类型(默认值)更喜欢在一个字段中找到来自搜索值的令牌的结果,而不是将搜索的令牌分配到不同字段中的结果。
most_fields与best_fields类型相反。
phrase类型的行为与best_fields相同,但会搜索与match_phrase类似的整个短语。
我强烈建议您查阅官方文档,以检查每个字段的得分计算准确度。
复合查询将其他查询包装在一起。 复合查询:
· 结合分数
· 改变包装查询的行为
· 将查询上下文切换到过滤上下文
· 以上任意一项
布尔查询将其他查询组合在一起。 这是最重要的复合查询。
布尔查询使您可以将查询上下文中的搜索与过滤器上下文搜索结合在一起。
布尔查询具有四个可以组合在一起的出现(类型):
· must或"必须满足该条款"
· should或"如果满足条款,则对相关性得分加分"
· 过滤器filter或"必须满足该条款,但不计算相关性得分"
· must_not或“与必须相反”,不会有助于相关度得分
必须和应该→查询上下文
过滤器和must_not→过滤器上下文
对于那些熟悉SQL的人,必须为AND,而应为OR运算符。 因此,必须满足must子句中的每个查询。
对于大多数查询,提升查询与boost参数相似,但并不相同。 增强查询将返回与肯定子句匹配的文档,并降低与否定子句匹配的文档的得分。
如我们在术语查询示例中先前看到的,constant_score查询将任何查询转换为相关性得分等于boost参数(默认值为1)的过滤器上下文。
让我知道是否您想阅读另一篇文章,其中提供了所有查询的真实示例。
我计划在Elasticsearch上发布更多文章,所以不要错过。
你已经读了很长的内容,所以如果你阅读到这里:
综上所述,Elasticsearch符合当今的许多用途,有时很难理解什么是最佳工具。
如果不需要相关性分数来检索数据,请尝试切换到过滤器上下文。
另外,了解Elasticsearch的工作原理也至关重要,因此,我建议您始终了解分析器的功能。
Elasticsearch中还有许多其他查询类型。 我试图描述最常用的。 我希望你喜欢它。
***隐藏网址***
elasticsearch基本查询笔记(三)-- es查询总结
term 查询是简单查询,接受一个字段名和参数,进行精准查询,类似sql中:
ES中对应的DSL如下:
在ES5.x及以上版本,字符串类型需设置为keyword或text类型,根据类型来进行精确值匹配。
当进行精确值查询,可以使用过滤器,因为过滤器的执行非常快,不会计算相关度(ES会计算查询评分),且过滤器查询结果容易被缓存。
bool过滤器组成部分:
当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。
terms是包含的意思,如下:
name包含
返回结果:
range查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:
类似sql中的范围查询:
ES中对应的DSL如下:
如下sql,age不为null:
ES中对应的DSL如下:
如下sql,age为null:
ES中对应的DSL如下:
注:missing查询在5.x版本已经不存在。
匹配包含 not analyzed(未分词分析)的前缀字符:
匹配具有匹配通配符表达式( (not analyzed )的字段的文档。 支持的通配符:
1) * 它匹配任何字符序列(包括空字符序列);
2) ? 它匹配任何单个字符。
请注意,此查询可能很慢,因为它需要遍历多个术语。
为了防止非常慢的通配符查询,通配符不能以任何一个通配符*****或 ? 开头。
正则表达式查询允许您使用正则表达式术语查询。
举例如下:
注意: * 的匹配会非常慢,你需要使用一个长的前缀,
通常类似.*?+通配符查询的正则检索性能会非常低。
模糊查询查找在模糊度中指定的最大距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键词。
举例:
检索索引test_index中,type为user的全部信息。不过在 es6.x 版本,一个index仅有一个type,未来 es7.x 版本,将取消type,所以这个查询没啥意义。
返回指定id的全部信息。
全文检索查询,是通过分析器,对查询条件进行分析,然后在全文本字段进行全文查询。
全文搜索取决于mapping中设定的analyzer(分析器),这里使用的是ik分词器。
所以在进行查询开发时候,需要先了解index的mapping,从而选择查询方式。
匹配查询接受文本/数字/日期类型,分析它们,并构造查询。
对查询传入参数进行分词,搜索词语相同文档。
match_phrase查询分析文本,并从分析文本中创建短语查询。
用户已经渐渐习惯在输完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search) 或输入即搜索(search-as-you-type) 。
不仅用户能在更短的时间内得到搜索结果,我们也能引导用户搜索索引中真实存在的结果。
例如,如果用户输入 johnnie walker bl ,我们希望在它们完成输入搜索条件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。
match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。
elasticsearch bool查询
在查询时,如果需要同时对多个字段进行多个查询,那么可以使用 bool 查询语句.
bool 查询接收如下参数:
示例
*通过将 range 查询移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。
所有查询都可以借鉴这种方式。将查询移到 bool 查询的 filter 语句中,这样它就自动的转成一个不评分的 filter 了。
如果你需要通过多个不同的标准来过滤你的文档,bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:
constant_score 查询
尽管没有 bool 查询使用这么频繁,constant_score 查询也是你工具箱里有用的查询工具。它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
可以使用它来取代只有 filter 语句的 bool 查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。
Elasticsearch查询语句语法
在搜索时,一定要选择合理的 时间范围 ,这个时间范围是基于创建索引模式时选择的时间字段。比如 @timestamp 。
另外一个 小提示 :默认情况下,搜索结果列表的上方会显示一个柱状图。可以点击左下角的小箭头,查看其他的信息,比如搜索结果对应的ES请求主体等。
查询语句包含一系列词语( term )和操作符。一个词语可以是一个单词,比如 INFO 。
也可以是双引号包围的一个短语,比如 "INFO make" ,这种情况下会搜索这 整个短语 ,按照单词在短语中的顺序。
默认情况下,会在所有字段中匹配要搜索的词语。或者我们也可以指定要搜索的字段。比如以下查询:
通配符搜索适用于单个单词中,使用 ? 替换单个字符, * 替换零个或多个字符。比如: tags:trust* OR tes? 的查询结果如下。注意这个查询中的 tes? 是用于匹配所有字段的内容。如果要限定 tags 字段,则应该查询 tags:(trust* OR tes?) 。
另外,使用通配符查询是很占用内存的。
***隐藏网址***
可以搜索相似的词语,比如 trsut~ ,同样会匹配 trust 。
范围可以是日期,数值,或者字符串字段的范围。闭区间: ;开区间: {min TO max} ;也可以结合在一起: [min TO max} 。
比如 ERROR WARNING +INFO -DEBUG :
如果使用 AND , OR 和 NOT 操作符(也写作 && , || , ! ),则可以转化成:
如果要匹配保留字符,则需要在字符前加反斜杠 \ 。保留字符包括: + - = && || 》 《 ! ( ) { } ^ " ~ * ? : \ / 。比如:要搜索 (1+1)=2 ,则使用语句 \(1\+1\)\=2 。
不过, 《 和 》 是无法转义的,它们总是会创建一个范围查询。
***隐藏网址***
星期六, 26. 八月 2017 05:58下午
Elasticsearch的几种查询方式及其参数说明
查询方式:
1、query string search
1.1 GET /索引/类型/_search
其中:
took:耗费时间
timed_out: 是否超时
_shards:数据分片信息
totle:被查询的分片数
successful:成功执行查询的分片数
failed:失败执行查询的分片数
hits.total:查询结果的数量
hits.max_score:对于查询条件的匹配度,分数越高越匹配
hits.hits:所有匹配到的数据
"_index":所在索引
"_type":对应的类型
"_id":主键ID
"_score":匹配分数
"_source":数据资源
1.2 GET /索引/类型/_search?q=field:xxx&sort=field:desc
查询语句说明:
q代表查询条件,q等于键值对
sort代表排序,field代表字段,desc代表排序方式
2 query DSL(Domain Specified Language)
2.1 GET /索引/类型/_search
{
"query": { // 查询条件
"match":{ // 改为match_all 查全部
"field": "XXX"
}
},
“_source”: , // 指定结果列
"hightlight": { // 查询结果高亮显示
"pre_tags" : "《p class=’red’》", // 自定义高亮标签开始
"post_tags" : "《/p》", // 自定义高亮标签结尾
"fields": { // 要高亮显示的字段
"field": {} // 实际字段
}
},
"sort": [ // 排序条件
{"parice": "desc"}
],
“form”: 1, // 第几页
"size": 2 // 每页几天
}
3 query filter
GET /索引/类型/_search
{
“bool”: {
"must": { // 必须匹配
"match": {
"field": "XXX"
}
},
"filter": { // 筛选
"range": { // 范围
"field": { "gt": "22" } // gt代表大于
}
}
}
}
4 full-text search 全文检索
GET /索引/类型/_search
{
“query”: {
"match": { "field": "XXX OOOO" } // 查询匹配全文中的field字段,包含OOOO和XXX的数据信息,其中包含XXX OOOO的数据的_score分数最高,匹配度最高,原理为,数据进入时会将field字段的内容进行分词,然后根据分出来的每个词去匹配
}
}
5 phrase search (短语搜索)
GET /索引/类型/_search
{
“query”: {
"macth_phrase" : { // 只匹配XXX OOOO这个短句,而全文检索是除此之外,还会将包含XXX和包含OOOO的也都匹配出来
"field": "XXX OOOO"
}
}
}
Elasticsearch 查询表达式
Elasticsearch 是一个开源的搜索引擎,Elasticsearch 使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
已经在其他文档中详细介绍,此次仅做简单步骤介绍
查询表达式( Query DSL )是一种非常灵活又富有表现力的查询语言, Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分
上述查询会搜索ES中的所有索引,但通常只需要去固定一个或几个索引中搜索,搜索全部无疑会造成资源的浪费,在ES中可以通过以下几种方法来指定索引
以上表示在 mysql-shop_trades-order_statics 索引下查找数据
这里也可以用逗号分割多个匹配索引
ES本身没有group关键词搜索,但支持聚合查询,,需要使用关键字aggs
order by:注意日期格式和数值格式才支持排序;文本不支持,如果要排序, 需把字段设置为not analysis
select distinct(id) from table
match_phrase :查询分析文本,创建词组查询
***隐藏网址***
延伸

更多文章:
unlikely(not likely和unlikely含义一样吗)
2025年10月23日 20:45
kindeditor 在dialog中居中(在Iframe中使用jquery ui dialog 怎么使弹出窗口居于浏览器中间)
2025年7月27日 23:15
ASP.NET MVC 4框架揭秘:Controller类型的缓存?RxCache缓存框架
2026年6月1日 06:00
java编程工具免费(请问java编写程序除了用eclipse,还可以用什么我主要是想做web前端的,有没有什么视图化的软件啊)
2025年8月4日 12:30
memcached性能(PHP中4个加速,缓存扩展的区别和选用建议)
2025年9月8日 08:45
2 3表示什么python(python语句:print(*[1,2,3]),是什么意思)
2026年8月14日 22:30
java下载了打不开(为什么下载了java也玩不了我的世界)
2026年5月17日 05:15
timeformat函数(GetTimeFormat怎么用,各个参数尤其是最后一个有点看不懂)
2025年11月13日 04:30
sqlite3规则(sqlite3数据库 运行一段时间后 命令行操作出现:Error:unsupported file format)
2025年10月25日 22:45
extensional mentality的意思(mentality是什么意思)
2026年1月6日 13:00














