- 内容概述
- 什么是
Elasticsearch
,为什么要应用它? -
根底概念简介
- 节点(
node
) - 索引(
index
) - 类型映射(
mapping
) - 文档(
doc
)
- 节点(
- 本地环境搭建,创立第一个
index
-
罕用
RESTful Api
示例- 新增文档
- 查问文档 - 不分词类型
- 查问文档 - 分词类型
内容概述
本文内容次要集中在应用层,通过上面几个局部介绍以后最风行的搜寻工具:Elasticsearch
,理解这些内容后,能够疾速开始应用它。
- 什么是
Elasticsearch
,为什么要应用它? - 根底概念:节点,索引,类型映射和文档
- 本地环境搭建,创立第一个
index
- 罕用
RESTful Api
示例
什么是Elasticsearch
,为什么要应用它?
Elasticsearch
是一个分布式、RESTful 格调的搜寻和数据分析引擎。
它基于 Lunece
实现,应用 java
语言编写。Lunece
是一个优良的搜索引擎库,但它应用起来非常复杂。
Elasticsearch
通过对 Lunece
的封装,暗藏了复杂性,提供了应用简略的 RESTful Api。
同时也实现了分布式集群个性,具备存储数据大,查问性能好,扩大不便等特点。
为什么要应用它
在业务开发中,基于 ES 的个性,通常有上面这些场景须要应用它:
- 存储大量数据。通过在应用 mysql 存储的时候,数据的单位是
G
。应用 ES 的时候,数据的单位是T
。由此能够看出 ES 应用于大数据量的存储场景,基于分布式个性,它也反对备份和容灾,并且能够很容易程度扩大容量。 - 分词搜索引擎。ES 具备弱小的分词能力,能够反对高性能的实时搜寻。
- 高效数据分析。ES 提供的聚合剖析性能,可实现对保留的大量数据的近实时统计分析。
根底概念简介
要应用 ES,须要理解几个最根本的概念,节点 (node
),索引(index
),类型映射(mapping
) 和文档(doc
)。
节点(node
)
节点是组成 ES 集群的根本单位,每个节点是一个运行的 ES 实例。每个物理机器上能够有多个节点,应用不同的端口和节点名称。
节点按次要性能能够分为三种:主节点 (Master Node),协调节点(Coordianting Node) 和数据节点(Data Node)。上面简略介绍下:
- 主节点:解决创立,删除索引等申请,保护集群状态信息。能够设置一个节点不承当主节点角色
- 协调节点:负责解决申请。默认状况下,每个节点都能够是协调节点。
- 数据节点:用来保留数据。能够设置一个节点不承当数据节点角色
索引(index
)
索引是 ES 中的逻辑概念,是文档的容器。对 ES 的操作,根本都是对索引操作,一个 ES 集群中,能够创立多个索引。
索引定义了一组文档的数据模型和解决办法。每个索引能够有多个主分片和正本分片,别离保留在不同的节点。
- 主分片的作用是对索引的扩容,使一个索引的容量能够冲破单机的限度。
- 正本分片是对数据的爱护,每个主分片对应一个或多个正本分片,当主分片所在节点宕机时,正本分片会被晋升为对应的主分片应用。
- 一个主分片和它的正本分片,不会调配到同一个节点上。
- 一个索引的分片数在创立时指定,如果要批改须要重建索引,代价很高。
类型映射(mapping
)
mapping
定义了一个索引中,文档保留的每个字段的数据类型。依据数据类型的不同,在增加文档时对每个字段的解决也不同。
例如,对 text 类型的字段,会先应用分词器分词,生成倒排索引,用于之后的搜寻。对 keyword 类型的字段,不会分词,搜寻时只能准确查找。
一个简略的 mapping 示例如下:
{
"javalogs": { // 索引名称
"mappings": {
"properties": {
"log_content": { //text 类型,分词,用于之后的分词索引
"type": "text"
},
"date": {// 工夫类型
"type": "date"
},
"log_level": { //keyword 类型,不分词
"type": "keyword"
},
"ip": {"type": "keyword"}
}
}
}
}
在 6.x 版本中,每个索引中还能够有多个 type,辨别不同的 mapping。在 7.x 中,type 被勾销,每个索引只有一个 type:_doc
文档(doc
)
- 文档是
Elasticsearch
中的最小单位,每个索引都是有数量泛滥的文档组成的。 - 文档中蕴含多个字段,每个字段的类型由
mapping
定义。 - 在一个索引中每个文档都有一个惟一 id,能够在增加时指定,也能够主动生成。
上面通过一张图来形容,节点 (node
),索引(index
) 和文档 (doc
) 之间的关系。
本地环境搭建,创立第一个index
所有常识都要通过实际把握,所以在理解根本的概念和逻辑后,上面就进入实际环节。
这里举荐应用 docker 来搭建本地开发环境,docker 对应 windows 和 mac 零碎都有桌面版本,应用十分不便。因为网络限度,间接应用 docker 官网仓库拉取镜像会很慢,所以在装置实现后,须要在设置中将仓库的地址替换为国内源,这里举荐https://docker.mirrors.ustc.edu.cn
,速度很快,设置如下:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
上面咱们应用 docker 装置 Elasticsearch
和kibana
镜像,kibana
是 es 官网配套的可视化剖析工具,应用它的页面 dev tools 能够很不便的通过 api 操作 es。
因为要同时部署两个 docker 镜像,这里举荐应用docker-composer
,桌面版装置实现后就带有该命令,须要的配置如下:
services:
kibana:
image: kibana:7.2.0
container_name: kibana-simple
environment:
- TIMELION_ENABLED=true
ports:
- "5601:5601"
networks:
- mynetwork
elasticsearch:
image: elasticsearch:7.2.0
container_name: es-simple
environment:
- cluster.name=mytestes #这里就是 ES 集群的名称
- node.name=es-simple #节点名称
- bootstrap.memory_lock=true
- network.publish_host=elasticsearch #节点公布的网络名称
- discovery.seed_hosts=es-simple #设置集群中的主机地址
- cluster.initial_master_nodes=es-simple #手动设置能够成为 master 的节点汇合
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/local/elasticsearch/simpledata
ports:
- 9200:9200
networks:
- mynetwork
volumes:
esdata1:
driver: local
networks:
mynetwork:
driver: bridge
创立一个名称为 docker-compose.yaml
文件,复制上面的配置到文件中,而后再文件所在目录执行 docker-compose up
,之后会启动两个 docker 实例,别离是elasticsearch
和kibana
。
在本地浏览器中,拜访 http://127.0.0.1:5601/
,能够看到kibana
的界面如下:
创立好的 kibana
曾经默认增加了 Elasticsearch
的配置,通过管理工具能够很不便的查看 ES 集群的状态,索引状况,删除索引等。
上面通过 dev tools
创立索引,dev tools
提供的命令提醒很不便,并且能够把已写好的申请保留在浏览器缓存中,非常适合用来学习Elasticsearch
。
这里通过 ES 提供的 RESTful Api
创立了第一个索引,并且设置了该索引中的mapping
,ES 的地址曾经设置过,这里能够不写残缺的域名,对应的 curl 残缺申请如下:
curl --location --request PUT 'http://127.0.0.1:9200/javalogs' \
--header 'Content-Type: application/json' \
--data-raw '{"mappings": {"properties": {"log_content": {"type":"text"},"date": {"type":"date"},"log_level": {"type":"keyword"},"ip": {"type":"keyword"}
}
}
}'
罕用 RESTful Api
示例
上面介绍下 Elasticsearch
中罕用的 api,这些例子都是间接在 kibana
的dev tools
中运行的,如果想用 curl 拜访,可参考前一节中的转换例子。
新增文档
// 主动生成_id
POST javalogs/_doc
{
"log_content" : "get user_id 123456",
"date" : "2020-04-15T11:09:08",
"log_level": "info",
"ip": "10.223.32.67"
}
// 指定_id
POST javalogs/_doc/111
{
"log_content" : "api response in 55ms",
"date" : "2020-04-15T11:09:07",
"log_level": "info",
"ip": "10.223.32.67"
}
查问文档 - 不分词类型
ES 在文档查问时,对于不分词的查问,间接按值查问即可,例如上面这样:
// 不分词类型查问
POST javalogs/_search
{
"query": {
"match": {"ip": "10.223.32.67"}
}
}
查问文档 - 分词类型
这里次要说下分词类型的查问,对于剖析类型的 field
在查问时,也会默认把查问的语句分词。假如有两个文档如下:
// 文档 1
{
"log_content" : "call aaa service error",
"date" : "2020-04-15T11:09:07",
"log_level": "error",
"ip": "10.223.32.67"
}
// 文档 2
{
"log_content" : "call bbb service error",
"date" : "2020-04-15T11:09:08",
"log_level": "error",
"ip": "10.223.32.67"
}
当搜寻条件为 call aaa service
时,实际上会把两个文档都搜寻进去。
这是因为在搜寻时,条件 call aaa service
会被分词为 call
,aaa
和service
,所有蕴含这三个词的文档都会被搜寻进去,例如上面:
// 一般搜寻,两个文档都会返回
POST javalogs/_search
{
"query": {
"match": {"log_content": "call aaa service"}
}
}
那如果想要只搜寻蕴含 call aaa service
的文档,应该如何做呢?
依照下面的剖析,须要同时蕴含这三个词,并且依照给定的程序,才返回对应的文档,那么这个能够应用 match_phrase
实现,示例如下:
// 文档必须同时蕴含三个词,并且程序与搜寻条件统一才会返回。这里只会返回 - 文档 1
POST javalogs/_search
{
"profile": "true",
"query": {
"match_phrase": {"log_content": "call aaa service"}
}
}
那如果条件是蕴含 call
,aaa
和service
,然而不肯定是连着的,该如何搜寻呢?能够应用 operator
操作符实现。
例如有第三个文档如下:
// 文档 3
{
"log_content" : "call inner aaa service error",
"date" : "2020-04-15T11:09:08",
"log_level": "error",
"ip": "10.223.32.67"
}
要想把 文档 1
和 文档 2
都搜寻进去,查问的示例如下:
// 文档中同时蕴含 call,aaa 和 service 就会返回,不按程序。会返回 - 文档 1 和文档 2
POST javalogs/_search
{
"query": {
"match": {
"log_content":
{
"query": "call aaa service",
"operator": "and"
}
}
}
}
下面就是对 Elasticsearch
的简略介绍和实战操作示例,心愿能帮忙大家疾速入门应用 ES。
以上内容属集体学习总结,如有不当之处,欢送在评论中斧正