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为分组,分组使⽤ran
ges来做,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不会为该属性创建索引,也就是说⽆法当做主查询条件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论