随着互联网技术的不断发展,技术的不断迭代更新,会有很多新的产品涌现出来,我们也需要不断地学习来掌握这些产品。
不知道大家接触到的项目是否已经使用Elasticsearch了,但在平时了解一些技术架构肯定会听到「搜索使用es」、「日志都通过消息中间件放到es里面了」……
如果对Elasticsearch不了解的同学,可能心里会一慌,这个es,我还不懂啊……
所以说这篇文章就是Elasticsearch的基本介绍、最常用的知识点。希望看完后能对你有所帮助。
一、Elasticsearch简介
Elasticsearch是什么?
Elasticsearch 是一个基于JSON的分布式搜索和分析引擎,基于restful web接口。Elasticsearch是用Java语言开发的,基于Apache协议的开源项目,是目前最受欢迎的企业搜索引擎。
ELK是什么?
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
Elasticsearch基本概念
Cluster-集群
Elasticsearch集群由一或多个节点组成,其中有一个主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
Elasticsearch的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部看Elasticsearch集群,在逻辑上是个整体,你与集群中的任何一个节点通信和与整个Elasticsearch集群通信是等价的。
Shards-分片
当索引存储大量数据时,可能会超出单个节点的硬件限制,为了解决这个问题,Elasticsearch提供了将索引细分为分片的概念。分片又分为:主分片和副本分片。
primary shard:代表索引的主分片,一个索引可以分成多个主分片。
replica shard:代表索引主分片的副本。
Index-索引
类似于mysql数据库中的database。其中存储若干相似结构的Document数据。如:客户索引,订单索引,商品索引等。
Type-类型
类似于mysql数据库中的table表,es中可以在Index中建立type(table)。
注意:Elasticsearch5.x及更低版本中,一个Index中可以有多个Type。Elasticsearch6.x版本之后,type概念被弱化,一个index中只能有唯一的一个type。且在7.x版本之后,删除type定义。
Document
Elasticsearch中的最小数据单元。一个Document就是一条数据,一般使用JSON数据结构表示。
Field
es中一个文档中对应的多个列与mysql数据库中每一列对应
Query DSL
类似于mysql的sql语句,只不过在es中是使用的json格式的查询语句,专业术语就叫:QueryDSL
GET/PUT/POST/DELETE
分别类似与mysql中的select/update/delete…可以直接通过RESTFUL的方式进行调用
安装
通过安装包方式
官方下载地址:https://www.elastic.co/cn/downloads/elasticsearch,根据自己的需要进行选择即可。如果需要历史版本可以通过标红的链接点进去,获取历史版本。
安装中文分词器插件
windows下,需要打开CMD命令窗口,在「elasticsearch-版本号\bin」目录下执行如下命令:
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip
通过Docker方式
官方提供了镜像库,可以从里面直接下载想要的版本。
下载镜像包
$ docker pull elasticsearch:6.4.3
# 或者
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.3
修改虚拟内存(测试环境不修改也行)
$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
使用Docker命令启动(正式环境还可以增加集群相关的参数)
$ docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
-e "discovery.type=single-node" \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:6.4.3
安装分词器
# 安装分词器需要在docker容器里面运行
$ docker exec -it elasticsearch /bin/bash
$ elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.3.zip
# 需要重启一下
$ docker restart elasticsearch
访问
浏览器直接访问:http://机器IP:9200/
安装Kibana
# 版本信息一定要和Elasticsearch一致
docker pull kibana:6.4.3
# 使用docker命令启动
docker run --name kibana \
-p 5601:5601 \
--link elasticsearch:es \
-e "elasticsearch.hosts=http://es:9200" \
-d kibana:6.4.3
# 访问地址进行测试:http://机器IP:5601
二、Elasticsearch常用操作
集群状态相关操作
-
查看集群健康状态
GET /_cat/health?v
解释:status:green、yellow、red
green:每个索引的primary shard和replica shard都是active的
yellow:每个索引的primary shard都是active的,但部分的replica shard不是active的
red:不是所有的索引的primary shard都是active状态的。
-
查看节点健康状态
GET /_cat/nodes?v
-
查看所有索引信息
GET /_cat/indices?v
-
查看分片信息
GET _cat/shards?v
索引相关操作
创建索引
命令语法:PUT 索引名{索引配置参数}
索引名称必须是小写的,且不能以下划线’_’,’-’,’+'开头。
示例:
PUT test_index
修改索引
命令语法:PUT 索引名/_settings{索引配置参数}
索引一旦创建,primary shard数量不可变化,可以改变replica shard数量。
示例:
PUT test_index/_settings
{
"number_of_replicas" : 2
}
删除索引
命令语法:DELETE 索引名1[, 索引名2 …]
示例:
DELETE test_index
文档相关操作
新增文档
在索引中增加文档。Elasticsearch有自动识别机制。如果增加的document对应的index不存在,自动创建index;如果index存在,type不存在,则自动创建type。如果index和type都存在,则使用现有的index和type。
-
PUT 语法
可以自行指定文档ID
命令语法:PUT 索引名/类型名/唯一ID{字段名:字段值}
示例:
PUT test_index/test_type/1 { "name":"test_put", "remark":"test", "order_no":1 }
补充语法:PUT 索引名/类型名/唯一ID/_create{字段名:字段值}
_create:强制新增。使用强制新增语法时,如果Document的id在Elasticsearch中已存在,则会报错。(version conflict, document already exists)
-
POST语法
Elasticsearch自动生成id
命令语法:POST 索引名/类型名{字段名:字段值}
示例:
POST test_index/test_type { "name":"tes_post", "remark":"test", "order_no":4 }
查询文档
-
通过ID查询单条数据
命令语法:GET 索引名/类型名/唯一ID
示例:
GET test_index/test_type/1
-
批量查询
可以借助于元数据「_mget」,这个方式就比较多了。
示例:
# 第一种 GET _mget { "docs" : [ { "_index" : "索引名", "_type" : "类型名", "_id" : "唯一ID值" }, {}, {} ] } # 第二种 GET 索引名/_mget { "docs" : [ { "_type" : "类型名", "_id" : "唯一ID值" }, {}, {} ] } # 第三种 GET 索引名/类型名/_mget { "docs" : [ { "_id" : "唯一ID值" }, { "_id" : "唯一ID值" } ] }
更新文档
在Elasticsearch里面更新的操作,其不会真的修改Document中的数据,而是标记Elasticsearch中原有的Document为deleted状态,再创建一个新的Document来存储数据。更新有两种方式:
-
全量更新
命令语法:PUT 索引名/类型名/唯一ID{字段名:字段值} 与新增的put语法是一样的。
-
部分更新
命令语法:POST 索引名/类型名/唯一ID/_update{doc:{字段名:字段值}}
示例:
POST test_index/test_type/1/_update { "doc":{ "name":" test_post_for_update" } }
删除文档
Elasticsearch中执行删除操作时,Elasticsearch先标记Document为deleted状态,而不是直接物理删除。当Elasticsearch存储空间不足或工作空闲时,才会执行物理删除操作。标记为deleted状态的数据不会被查询搜索到。
命令语法:DELETE 索引名/类型名/唯一ID
示例:
DELETE test_index/test_type/1
三、常用元数据介绍
元数据通常使用下划线’_’开头。在使用查询文档时,返回结果中不仅包括我们存入的数据,还包括各元数据。
-
_index
代表的是文档数据存入的索引名称。
-
_type
代表的是文档数据存入的是索引中的类别。
-
_id
代表文档的唯一标识。使用index、type和id可以定位唯一的一个文档。
-
_source
代表的是文档的JSON串信息。
-
_version
代表的是文档的版本。每次数据变化,版本都会发生变更。
四、数据搜索(DSL)
Elasticsearch 提供了一个基于 JSON 的完整查询语法:DSL–Domain Specific Language,查询参数是一段JSON。
语法格式:
GET 索引名/_search
{
"command":{ "parameter_name" : "parameter_value"}
}
查询所有数据
GET 索引名/_search
{
"query":{
"match_all":{}
}
}
匹配查询-match query
搜索条件在进行拆词之后的词条与任意可以匹配上的数据就是搜索结果
GET 索引名/_search
{
"query": {
"match": {
"字段名": "搜索条件"
}
}
}
短语查询-match_phrase query
查询条件会被拆词,但是目标数据中必须包含所有词条才是结果。
GET 索引名/_search
{
"query": {
"match_phrase": {
"字段名": "搜索条件"
}
}
}
短语查询-term query
查询条件不会被分词,直接拿去匹配目标数据。
# 单个条件
GET 索引名/类型名/_search
{
"query" : {
"term" : {
"字段名": "搜索条件"
}
}
}
# 多个条件
GET 索引名/类型名/_search
{
"query" : {
"terms" : {
"字段名": ["搜索条件1", "搜索条件2"]
}
}
}
范围查询-range query
范围搜索,类似于mysql里面的between…and…
gte
:大于等于 gt
:大于 lte
:小于等于 lt
:小于
GET 索引名/_search
{
"query" : {
"range" : {
"字段名" : {
"gt" : 搜索条件1,
"lte" : 搜索条件2
}
}
}
}
多条件复合查询-bool
多个条件的查询,使用bool
来进行组合,在bool
里面有几个类型:
must
:表示多个条件必须同时满足;must_not
:表示多个条件必须都不满足;should
:表示多个条件满足其中一个即可;
GET 索引名/类型名/_search
{
"query": {
"bool": {
"must": [ #数组中的多个条件必须同时满足
{
"range": {
"字段名": {
"lt": 条件
}
}
}
],
"must_not":[ #数组中的多个条件必须都不满足
{
"match": {
"字段名": "条件"
}
},
{
"range": {
"字段名": {
"gte": "搜索条件"
}
}
}
]
"should": [# 数组中的多个条件有任意一个满足即可。
{
"match": {
"字段名": "条件"
}
},
{
"range": {
"字段名": {
"gte": "搜索条件"
}
}
}
]
}
}
}
聚合查询-aggs query
es也提供了丰富的聚合查询,类似于MySQL里面的分组、统计等。具体可以查看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/search-aggregations.html
五、最后
关于Elasticsearch的基础概念,了解这么多基本上算是入门了,但是在使用过程中肯定还会有很多需要注意的地方,也会有一些坑存在,哈哈
后续会慢慢总结一些使用ES的文章,大家感兴趣的话可以关注一下哦,也可以关注下「Hugh的白板」公众号,联系我,一起学习,一起探讨!加油!