ElasticSearch 从入门到放弃

2023-02-03

说明

一起来学习ES的使用吧,目前只是分享皮毛,看完这篇应该对ES有个大概认识了,后续会继续更新。

ES 8.0+

kibana 8.0+

查看es相关信息

查看es是否启动成功

安装后访问 127.0.0.1:9200 ,注意端口,出现以下界面便是成功的

image-20230131162605503

查看集群健康状态_cat/health

访问:https://127.0.0.1:9200/_cat/health?v

image-20230131163043775

  • cluster:集群名称
  • status:集群状态 green 表示集群一切正常;yellow 表示集群不可靠但可用(单节点状态);red 集群不可用,有故障。
  • node.total:节点总数量
  • node.data:数据节点的数量
  • shards:存活的分片数量
  • pri:主分片数量
  • relo:迁移中的分片数量
  • init:初始化中的分片数量
  • unassign:未分配的分片
  • pending_tasks:准备中的任务
  • max_task_wait_time:任务最长等待时间
  • active_shards_percent:激活的分片百分比
查看分片信息_cat/shards

https://127.0.0.1:9200/_cat/shards?v

image-20230131163440304

  • index:索引名称,通常.开头的是es自带的索引
  • shard:分片数
  • prirep:分片类型,p为主分片,r为复制分片
  • state:分片状态,STARTED为正常
  • docs:记录数
  • store:存储大小
  • ip:节点ip
  • node:节点名称,在哪个节点上
查看集群节点信息_cat/nodes

https://127.0.0.1:9200/_cat/nodes?v

image-20230131163807466

  • ip:节点ip
  • heap.percent:堆内存使用百分比
  • ram.percent: 运行内存使用百分比
  • cpu:cpu使用百分比
  • master:带* 表明该节点是主节点,带-表明该节点是从节点
  • name:节点名称
查看索引信息_cat/indices

https://127.0.0.1:9200/_cat/indices?v

image-20230131164137019

  • index: 索引名称
  • docs.count:文档总数
  • docs.deleted:已删除文档数
  • store.size: 存储的总容量
  • pri.store.size:主分片的存储总容量

使用Kibana操作es

基本操作

带?v表示列出列名

索引操作
添加修改文档POST/PUT

POST indexName/_doc/[id]

我们可以看到可以查出两条"张三"数据,其中一条id是随机生成的,另外一条是指定生成的,若下次在指定相同id则会执行update操作,直接覆盖已有的记录

image-20230131170557861

PUT indexName/_doc/id

put操作也可以添加或修改记录,必须指定id,若id不存在则创建该记录,若存在则做更新操作,覆盖已有的记录

image-20230131172533858

像上述的两种方式更新会直接覆盖原有记录,那有没有办法只修改其中某些字段呢?肯定是有的,我们可以借助 POST indexName/_update/id 来处理,只有POST可以这样操作,PUT不可以

image-20230131174803851

还可以借助 POST indexName/_update_by_query来批量修改

image-20230201101745388

删除文档

可以根据文档id进行删除

image-20230203150753196

也可以通过条件进行删除,_delete_by_query

image-20230203151259488

简单查询

在已知文档ID的情况,我们可以根据ID查询数据

image-20230201102932385

我们还可以进行查询、排序、分页,不过这种方式有很大的局限性,而且也不安全(GET请求),不推荐使用

高级查询DSL
数据准备
match_all

不需要写任何条件

image-20230201112854654

term

term精确值匹配,常用的查询,可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。term作为精确查询不会将搜索词进行分词,直接将整个搜索词与倒排索引的内容进行匹配

image-20230201175105436

这两个term查询,查询"张小五"的时候,是没有结果的,而查询“五”却可以出现结果。原因是因为name字段没有指定keyword类型时,默认为text类型,当我们插入"张小五",分词器会将这段文本进行分词后插入倒排索引中。如下图"张小五"被分为"张"、"小五"、"五",当我们使用term查询"张小五"时自然查不到,因为term不会将搜索词进行分词。

image-20230201161647361

terms

terms和term类似,支持多个匹配项查询

image-20230201175211799

match

match查询比较强大,与term不同的是,如果查询的字段是分词的match查询会把搜索词进行分词后再与索引内容做匹配,如果该字段是不分词的就将查询条件作为整体进行查询

image-20230203143741801

multi_match

与match类似,multi_match可以指定多个字段查询,只要有一个字段匹配搜索条件即可

image-20230201175415176

match_phrase

短语匹配,他会将给定的短语(phrase)当成一个完整的查询条件,他不会进行分词,而且要完整匹配查询条件

image-20230201175508297

ids

多id查询

image-20230202102438237

range

范围查询,通常用于查询数值、时间

image-20230202102707767

exist

查看包含某字段的数据

image-20230202103009820

bool

布尔查询,用来组合多个条件实现复杂查询,常与must(且)、should(或)、must_not(非)、filter(过滤)一起出现,而且这些关键词都可以指定多个条件

image-20230202105322816

prefix

前缀查询,keyword类型前缀是可以查询得到的,text类型如果搜索词是英文也是可以查询的,如果是中文,单字也是可以查询的,多字就无法查询了

image-20230201175727938

wildcard

通配符查询,?用来匹配任意一个字符,*用来匹配任意多个字符

image-20230201173845333

fuzzy

模糊查询,用于模糊查询指定关键词的文档,可容忍搜索词错误,最大模糊必须在0-2之间

  • 搜索关键词长度为2不允许存在模糊
  • 搜索关键词长度为3~5允许一次模糊
  • 搜索关键词长度大于5最大2次模糊

image-20230202101905248

regexp

正则匹配查询,正则应该要能匹配整个文本,查询中文时,要注意分词

image-20230202110031646

注意事项

prefix、wildcard、fuzzy、regexp性能较低,不推荐使用,而且对中文查询时总是会出现意想不到的结果——期望能查询的却总是查不到数据

了解term查询机制,尤其是中文

分页查询

关键词:from、size

image-20230202111159509

scroll分页查询

ES系列十二、ES的scroll Api及分页实例 - 小人物的奋斗 - 博客园 (cnblogs.com)

分页查询from越大,查询效率就越低,这是我们可以使用scroll分页查询检索体积大量(甚至全部)结果,这与传统数据库中使用游标的方式非常相似

scroll不要用于实时请求,主要用于大数据量的场景

初次请求,指定scroll和size,scroll=1m表示使用scroll查询,并且缓存1分钟,这个时间不用设置太久,每个 scroll 请求都会设置一个新的过期时间。初次请求会得到一个scroll_id,后续会用到

image-20230203113515810

根据scroll_id进行请求,获得数据

image-20230203113833459

当超过scroll的设置的过期时间,scroll上下文会被自动删除,但是scroll不会删除,所以当我们处理完数据,需要手动删除scroll

image-20230203114615057

排序字段

关键词:sort

正序:asc、倒序:desc,可指定多个字段排序

image-20230202111655436

指定字段查询

关键词:_source,可以通过includes来指定查看哪几个字段,也可以通过excludes指定不查看哪几个字段

image-20230202112544853

高亮查询

关键词:highlight,通过pre_tags设置前缀,post_tags设置后缀来达成高亮效果

image-20230203150024398

过滤查询

常与布尔查询一起使用,es查询会按匹配程度计算分数,并默认按分数从高到低排序查询结果,而过滤不会计算分数、也不会自动按分数排序只会进行过滤操作而已,而且过滤有一定的缓存效果,在效率上过滤会优于查询,所以建议查询大数据时,可以先进行过滤(filter)再进行查询(query),常见的过滤操作有:term、terms、range、exists、ids

image-20230202143358748

聚合查询

以下内容参考:ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合) - 小人物的奋斗 - 博客园 (cnblogs.com)

类似于sql中的group by,语法

聚合查询—指标聚合
max、min、sum、avg

max、min、sum、avg分别求最大值、最小值、总和值、平均值

image-20230202161353641

文档计数_count

image-20230202171010064

统计某字段有值的文档数value_count

image-20230202171532990

去重后计数cardinality

image-20230202172002440

stats统计

一次性统计count、max、min、avg、sum这五个值

image-20230202172402880

extended_stats统计

比stats额外统计平方和、方差、标准差、平均值加减两个标准差的区间

image-20230202172941218

百分位统计percentiles

不知道是什么,不知道怎么个算法

可以自定义percents的值,不指定时默认为[1,5,25,50,75,95,99]

image-20230202174252450

统计值小于等于指定值的文档占比percentile_ranks

不知道怎么个算法

image-20230202175125236

地理位置坐标点的范围

参考官网链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-geobounds-aggregation.html

地理位置中心点坐标值

参考官网链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-geocentroid-aggregation.html

聚合查询—桶聚合
按照字段项分组聚合terms

field:"" 指定排序的字段

size:5 指定返回多少组数

show_term_doc_count_error:true 每个组上显示偏差值

shard_size:5 指定每个分片上返回多少个分组

order:{"_key":"desc"} 指定按照分组值"_key"倒序排序

order:{"_count":"asc"} 指定按照文档计数值"_count"正序排序

order:{"max_age":"desc"} 指定按照分组指标值倒序排序

"doc_count_error_upper_bound": 0 文档计数的最大偏差值

"sum_other_doc_count": 3 未返回的其他文档数,不在桶里的文档数量

image-20230203101725822

对满足过滤查询的文档进行聚合计算filter

这个不会影响查询结果只会影响聚合结果

image-20230203104010028

分别对多个过滤条件聚合计算filters

这不是要同时满足多个过滤条件,而是针对过滤条件一聚合一次,过滤条件二又聚合一次

image-20230203105543166

数值范围分组聚合range

image-20230203110401827

时间范围分组聚合date_range
时间直方图(柱状)聚合
缺失值的桶聚合
地理距离分区聚合

这几个不理解,暂时不记录