600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > es怎么返回全部查询结果_ES基本查询语句教程

es怎么返回全部查询结果_ES基本查询语句教程

时间:2019-01-12 20:48:19

相关推荐

es怎么返回全部查询结果_ES基本查询语句教程

前言

es是什么?

es是基于Apache Lucene的开源分布式(全文)搜索引擎,,提供简单的RESTful API来隐藏Lucene的复杂性。

es除了全文搜索引擎之外,还可以这样描述它:

1、分布式的实时文件存储,每个字段都被索引并可被搜索

2、分布式的实时分析搜索引擎

3、可以扩展到成百上千台服务器,处理PB级结构化或非结构化数据。

ES的数据组织类比

Relational DBElasticsearch

数据库(database)

索引(indices)

表(tables)

types

行(rows)

documents

字段(columns)

fields

mac安装ES

一、 ES简单的增删改查

1、创建一篇文档(有则修改,无则创建)

2、查询指定索引信息

3、 查询指定文档信息

4、查询对应索引下所有数据

5、删除指定文档

6、删除索引

7、修改指定文档方式

修改时,不指定的属性会自动覆盖,只保留指定的属性(不正确的修改指定文档方式)

使用POST命令,在id后面跟_update,要修改的内容放到doc文档(属性)中(正确的修改指定文档方式)

二、ES查询的两种方式

1、查询字符串搜索

2、结构化查询(单字段查询,不能多字段组合查询)

三、match系列之操作

1、match系列之match_all (查询全部)

2、match系列之match_phrase(短语查询)

通过观察结果可以发现,虽然如期的返回了中国的文档。但是却把和美国的文档也返回了,这并不是我们想要的。是怎么回事呢?因为这是elasticsearch在内部对文档做分词的时候,对于中文来说,就是一个字一个字分的,所以,我们搜中国,中和国都符合条件,返回,而美国的国也符合。而我们认为中国是个短语,是一个有具体含义的词。所以elasticsearch在处理中文分词方面比较弱势。后面会讲针对中文的插件。但目前我们还有办法解决,那就是使用短语查询 用match_phrase

我们搜索中国和世界这两个指定词组时,但又不清楚两个词组之间有多少别的词间隔。那么在搜的时候就要留有一些余地。这时就要用到了slop了。相当于正则中的中国.*?世界。这个间隔默认为0

3、match系列之match_phrase_prefix(最左前缀查询)智能搜索--以什么开头

搜索特定英文开头的数据

max_expansions 参数理解 前缀查询会非常的影响性能,要对结果集进行限制,就加上这个参数。

4、match系列之multi_match(多字段查询)

multi_match是要在多个字段中查询同一个关键字 除此之外,mulit_match甚至可以当做match_phrase和match_phrase_prefix使用,只需要指定type类型即可

当设置属性 type:phrase 时 等同于 短语查询

当设置属性 type:phrase_prefix时 等同于 最左前缀查询

match 查询相关总结

1、match:返回所有匹配的分词。

2、match_all:查询全部。

3、match_phrase:短语查询,在match的基础上进一步查询词组,可以指定slop分词间隔。

4、match_phrase_prefix:前缀查询,根据短语中最后一个词组做前缀匹配,可以应用于搜索提示,但注意和max_expanions搭配。其实默认是50.......

5、multi_match:多字段查询,使用相当的灵活,可以完成match_phrase和match_phrase_prefix的工作。

四、ES的排序查询

es 6.8.4版本中,需要分词的字段不可以直接排序,比如:text类型,如果想要对这类字段进行排序,需要特别设置:对字段索引两次,一次索引分词(用于搜索)一次索引不分词(用于排序),es默认生成的text类型字段就是通过这样的方法实现可排序的。

升序排序

五、ES的分页查询

from:从哪开始查 size:返回几条结果

六、ES的bool查询 (must、should)

must (must字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回)

should (只要符合其中一个条件就返回)

must_not 顾名思义

filter(条件过滤查询,过滤条件的范围用range表示gt表示大于、lt表示小于、gte表示大于等于、lte表示小于等于)

bool查询总结

must:与关系,相当于关系型数据库中的 and。

should:或关系,相当于关系型数据库中的 or。

must_not:非关系,相当于关系型数据库中的 not。

filter:过滤条件。

range:条件筛选范围。

gt:大于,相当于关系型数据库中的 >。

gte:大于等于,相当于关系型数据库中的 >=。

lt:小于,相当于关系型数据库中的

lte:小于等于,相当于关系型数据库中的 <=。

七、ES之查询结果过滤

现在,在所有的结果中,我只需要查看name和age两个属性,提高查询效率

八、ES之查询结果高亮显示

ES的默认高亮显示

ES自定义高亮显示(在highlight中,pre_tags用来实现我们的自定义标签的前半部分,在这里,我们也可以为自定义的 标签添加属性和样式。post_tags实现标签的后半部分,组成一个完整的标签。至于标签中的内容,则还是交给fields来完成)

十、ES之精确查询与模糊查询

term查询查找包含文档精确的倒排索引指定的词条。也就是精确查找。

term和match的区别是:match是经过analyer的,也就是说,文档首先被分析器给处理了。根据不同的分析器,分析的结果也稍显不同,然后再根据分词结果进行匹配。term则不经过分词,它是直接去倒排索引中查找了精确的值了。

对比两者的不同 (结果就不展示出来了,只展示结果的文字叙述)

查找多个精确值(terms)

十一、ES的聚合查询avg、max、min、sum

需求1、查询from是gu的人的平均年龄。

上例中,首先匹配查询from是gu的数据。在此基础上做查询平均值的操作,这里就用到了聚合函数,其语法被封装在aggs中,而my_avg则是为查询结果起个别名,封装了计算出的平均值。那么,要以什么属性作为条件呢?是age年龄,查年龄的什么呢?是avg,查平均年龄。

如果只想看输出的值,而不关心输出的文档的话可以通过size=0来控制

需求2、查询年龄的最大值

需求3、查询年龄的最小值

需求4、查询符合条件的年龄之和

十二、ES的分组查询

需求: 要查询所有人的年龄段,并且按照1520,2025,25~30分组,并且算出每组的平均年龄。

上例中,在aggs的自定义别名age_group中,使用range来做分组,field是以age为分组,分组使用ranges来做,from和to是范围

接下来,我们就要对每个小组内的数据做平均年龄处理。

ES的聚合查询的总结:聚合函数的使用,一定是先查出结果,然后对结果使用聚合函数做处理

avg:求平均

max:最大值

min:最小值

sum:求和

十三、ES之Mappings

由返回结果可以看到,分为两大部分:

1. mappings 是什么?

2. 字段的数据类型

一个简单的映射示例

我们在创建索引PUT mapping_test1的过程中,为该索引定制化类型(设计表结构),添加一个映射类型test1;指定字段或者属性都在properties内完成。

返回的结果中你肯定很熟悉!映射类型是test1,具体的属性都被封装在properties中。

3. ES mappings之dynamic的三种状态

一般的,mapping则又可以分为动态映射(dynamic mapping)和静态(显示)映射(explicit mapping)和精确(严格)映射(strict mappings),具体由dynamic属性控制。默认为动态映射

测试静态映射:当elasticsearch察觉到有新增字段时,因为dynamic:false的关系,会忽略该字段,但是仍会存储该字段。

测试严格映射:当elasticsearch察觉到有新增字段时,因为dynamic:strict 的关系,就会报错,不能插入成功。

小结: 动态映射(dynamic:true):动态添加新的字段(或缺省)。 静态映射(dynamic:false):忽略新的字段。在原有的映射基础上,当有新的字段时,不会主动的添加新的映射关系,只作为查询结果出现在查询中。 严格模式(dynamic:strict):如果遇到新的字段,就抛出异常。一般静态映射用的较多。就像HTML的img标签一样,src为自带的属性,你可以在需要的时候添加id或者class属性。当然,如果你非常非常了解你的数据,并且未来很长一段时间不会改变,strict不失为一个好选择。

4. ES之mappings的 index 属性

index属性默认为true,如果该属性设置为false,那么,elasticsearch不会为该属性创建索引,也就是说无法当做主查询条件。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。