es学习总结

0️⃣.安装

官网下载安装即可,注意学习时最好安装公司在用的版本型号.

1️⃣.基本概念

ES虽然是一个开源的分布式搜索引擎,但是你可以把它当做一个NoSQL的数据存储来使用.它是面向文档的,默认条件下是可扩展的.

逻辑设计

文档

ES中 搜索和存储的最小单位就是文档(document),毕竟ES中所存的数据很灵活,一般是JSON字符,个人认为完全可以把它当成”文档”;一篇文档同时包含字段和对应的值,而且文档中还可以包含新的文档;

ES中的文档不像SQL那样,具有严格的模式限制,ES中的文档是无模式的,也就数说并非所有的文档都需要拥有相同的字段,他们并不是受限于同一个模式.

虽然可以随意添加和忽略字段,但是每个字段的类型都很重要,毕竟字符串字段的类型你不能存储的时候存成整型类型,所以ES 中还有一个放置字段和字段类型映射的地方,和SQL中的表结构的概念相似,这种映射就叫做类型映射.

类型

类型是文档的逻辑容器,类易于表示行的容器. 每个类型中字段的定义叫做映射.

映射包含某个类型中当前索引的所有文档的所有字段,但是并不是所有的文档必须要有所有的字段,

如果新近索引的文档又有一个映射中上不存在的字段,elasticsearch会自动的将新字段加入映射,加入的时候还会”猜测”这个字段是什么类型,假如值是7,es会猜测他是长整型.

下了最新的ES学习时,发现ES的最新版本7.*之后已经不支持Type了,搜索时就只有一个_doc返回.

索引

索引是映射类型的容器,作为存放大量文档集合的地方,类似于SQL中的数据库 .每个索引存储在硬盘上的同组文件中,

逻辑设计

节点

一个节点就是一个运行中的ES实例.在服务器上启动ES后,你就拥有了一个节点.如果在另一台服务器启动ES,那就是另一个节点.甚至可以通过启动多个进程(修改端口),在同一服务器上拥有多个节点. 多个节点可以同时加入同一个集群.对于使用ES的应用程序,集群中有一个还是多个节点都是透明的.默认情况下,可以连接集群中的任一节点并在这个节点中访问到集群中完整的数据集,就好像这个集群中就只有这一个节点.

主分片和副本分片

一个主分片就是一个索引,每个主分片都会有一个副本分片.

2️⃣.索引,更新和删除

1.索引数据

1.1 核心的数据类型:

数据类型

1.2 预定义字段

预定义的字段都是很实用,而且会经常用到,这里罗列一下:

如何存储和搜索你的文档

①存储原有内容的_source

​ _source字段会按照原有格式来存储原有的文档. 类似于你点击链接,进来这篇博文,看到了文章的所有信息.

②仅仅返回源文档的某些字段

​ 可以在stored_fields参数中提供用逗号隔开的字段列表,比如

1
curl -XGET get-together/group/1?stored_fields=name

③索引一切的_all

如果总是在特定的字段上搜索,可以通过设置enabled为false来关闭_all:

1
2
3
"events":{
"all":{"enabled":false}
}
识别文档

文档是通过_uid来唯一识别的,ES 内部使用 _uid 来唯一确定文档的身份.

_uid是由 _id和 _type组成,当搜索或者检索文档时总能获得这两项信息.

下面是这几个字段的相关信息:

字段名称 是否存储 是否索引 详情
_uid yes yes 用于识别整个索引中的某篇文档
_id 🚫 🚫 该字段没有被索引,也没有被存储,如果搜索它,实际上使用的是_uid.当你获得了结果,同样是从 _uid中抽取内容
_type 🚫 not_analyzed 该字段是被索引的,并且也生成了单一的词条.ES用它来过滤指定类型的文档,也可以搜索这个字段.

2.更新文档

可以参考此文章

Elasticsearch增删改查 之 —— Update更新

3.删除数据

①删除单个文档

发送HTTP DELETE 请求即可删除单一的文档:

1
curl -XDELETE 'localhost:9200/online-shop/shirts/1'

为了 防止文档被删除后,也就不复存在了,但是一个更新操作机会重新创建该文档,尽管这是不允许发生的.毕竟我们希望这个数据永远的消失掉.为了避免这种问题,ES将会在一段时间内保留这篇文档的版本号,这样他就可以拒绝版本比删除操作更低的更新操作了.默认情况下这个时间是60秒.

③删除索引

就跟删除文档一样,删除索引需要下面的操作:

1
curl -XDELETE 'localhost:9200/online-shop/'

通过提供以逗号隔开的列表,还可以删除多个索引.如果将索引名修改为_all,就可以删除掉所有的索引哦.

为了防止我们这样误操作,可以在elasticsearch.yml中的action.destructive_require_name:true 来预防这种情况对的发生,这会使ES在删除的时候拒绝_all参数,以及索引名称中的通配符.

删除索引是很快的,因为它基本上就是移除了和索引分片相关的文件.

④关闭索引

除了删除索引,还可以选择关闭索引.如果关闭了索引,就无法通过ES来读取和写入其中的数据,直到它再次打开.当使用应用日志这样的流式数据时,这样的操作非常实用.因为在现实世界中,应用日志最好永久的保存,以防要查看很久以前的信息,我们可能暂时不需要这些数据,但是也不想删除他它们.

为了关闭索引,我们可以这么做

1
curl -XPOST 'localhost:9200/online-shop/_close'

打开的话,那就执行

1
curl -XPOST 'localhost:9200/online-shop/_open'

3️⃣.搜索操作

4️⃣.分析数据

5️⃣遇到的错误

  1. Kibana 启动出错: Your Kibana index is out of date, reset it or use the 💡-Pack upgrade assistant

Deleting Kibana index worked for me (CAUTION: I had a brand new install),

curl -XDELETE http://localhost:9200/.kibana