概述

  • ES(ElasticSearch)是一个开源的高拓展的分布式全文检索引擎,可以近乎实时地存储,检索数据。

  • ES使用Java开发,使用Lucence作为基础通过RESTful隐藏Lucence的复杂性。

  • ELK日志体系

    • ElasticSearch
    • LogStash
    • Kibana
  • 可以认为Solr与ES是竞品关系,Solr是Apache旗下项目,同样使用Java开发。

    • 在建立索引的时候,ES比Solr更快。Solr更适合存量的数据查询。
    • Solr使用ZK进行分布式管理,ES自身带有分布式协调功能

相关文档

安装

ES安装

  • 9200是后端发送请求restAPI使用的、9300是es在分布式集群下节点间的通信端口
1
docker run --net=host --name elasticsearch -d -e ES_JAVA_OPTS="-Xms2048m -Xmx4096m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0
1
2
3
4
5
6
7
8
9
10
docker exec -it elasticsearch /bin/bash

vi config/elasticsearch.yml

# 末尾添加
http.cors.enabled: true
http.cors.allow-origin: "*"

# 重启ES
docker restart elasticsearch
  • es的目录解读
    • config目录存放配置文件
    • bin目录存放了可执行的程序

image-20240207235613296

设置用户名和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker exec -it elasticsearch bash

vi config/elasticsearch.yml

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

restart...

docker exec -it elasticsearch bash

# 交互方式设置密码,需要设置多个用户的密码,设置密码建议不要是纯数字,便于后面直接在命令中设置kibana访问ES的账密。
bin/elasticsearch-setup-passwords interactive

docker restart elasticsearch

docker restart kibana

HEAD安装

用处不大,Elasticsearch设置用户名密码之后,不能再直接使用Elasticsearch head 访问

1
docker run --net=host --name elasticsearch-head -d -p 9100:9100 mobz/elasticsearch-head:5

Kibana安装

1
2
3
4
5
6
7
8
9
10
docker run --net=host --name kibana -d -e ELASTICSEARCH_HOSTS=http://localhost:9200 -e ELASTICSEARCH_USERNAME="elastic" -e ELASTICSEARCH_PASSWORD="elastic123456" -e SERVER_HOST=0.0.0.0  -p 5601:5601 kibana:7.6.2

docker exec -it kibana bash

vi /usr/share/kibana/config/kibana.yml

# 修改server.host从0改为0.0.0.0,允许远程访问。如果配置为localhost,只能本地访问。
server.host: "0.0.0.0"

docker restart kibana

分词器安装

相关说明

  • 安装过程:放到ES的plugins目录下的ik目录,然后重启ES

  • 分词器

    • standard:没有办法对中文进行合理分词的,只是将每个中文字符一个一个的切割开来,比如说「中国人」就会简单的拆分为 中、国、人
    • ik_smart 最少切分,会将「中华人民共和国国歌」拆分为:中华人民共和国、国歌。
    • ik_max_word 最细粒度切分,得到的词组比较多。会将「中华人民共和国国歌」拆分为:中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌,会穷尽各种可能的组合。【推荐,在搜索领域,拆分越细粒度的搜索效果越好】
  • 分词分析

1
2
3
4
5
GET _analyze
{
"analyzer": "ik_smart",
"text":"中华人民共和国国歌"
}
  • 如果分词不符合预期,可以增加自定义字典。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
下载:https://github.com/medcl/elasticsearch-analysis-ik/releases?q=7.7.0&expanded=true

docker exec -it elasticsearch bash

cd plugins/

mkdir ik && cd ik

curl https://mirror.ghproxy.com/https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip -o ik.zip

unzip ik.zip

rm ik.zip

docker restart elasticsearch

核心概念

与关系型数据库对比

ES是面向文档的,其与数据库的对比如下

关系型数据库 ES
database 数据库 indices 索引
table 表 types 即将弃用
rows 行 documents 文档
column 字段 fields
  • 物理设计:ES在后台将多个索引划分为多个分片,分片可以在多个节点中迁移(ES一开始就是集群模式,不过其允许只有一个节点)
  • 逻辑设计:一个索引类型中,包含多个文档,比如说文档1、文档2。通过索引->类型->文档的方式找到具体的文档。

索引

  • 索引就是数据库,索引是映射类型的容器,ES中的一个索引是一个非常大的文档集合。索引存储了映射类型的字段和其它配置,然后他们被存储到了各个分片上。
  • 一个集群至少有一个节点,一个节点就是一个ES进程。

字段类型

mapping 映射

  • 类型分类
    • 字符串 text、keyword(keyword是不可分割的整体)
    • 数值 long、integer、short、byte、double、float、half、float、scaled float
    • 日期类型 date
    • 布尔值 boolean
    • 二进制 binary

文档

  • 一个文档就是关系型数据库的一行数据

集群

  • 一个集群至少有一个节点,一个节点就是一个ES进程。创建一个索引,索引会有5个主分片,每个分片都会有一个副本(复制分片)。
  • 实际上,一个分片就是一个Lucene索引,一个包含倒排索引的文件目录。何为倒排索引?正常索引是通过ID找数据;倒排索引是通过数据找ID。

操作语法

type被弃用,默认可以写为_doc。

  • 使用 type 允许在一个 index 里存储多种类型的数据,这样就可以减少 index 的数量了。在使用时,向每个文档加入 _type 字段,在指定 type 搜索时就会被用于过滤。只有同一个 index 的中的 type 都有类似的映射 (mapping) 时,才应该使用 type。否则,使用多个 type 可能比使用多个 index 消耗的资源更多。不过type,即将被弃用了。
  • ES的操作都是基于restful风格的API进行操作。

ES整体

查询ES状态

1
GET _cat/health

索引操作

查看所有索引

1
GET _cat/indices

获取索引

1
GET /index1

创建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT /test2/
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "integer"
},
"birthday": {
"type": "date"
}
}
}
}

删除索引

1
DELETE test1

文档操作

创建文档

  • 创建文档(没有则创建,否则更新):PUT 索引名称/类型名称/文档ID
1
2
3
4
5
PUT /test1/type1/1  or /test1/_doc/1
{
"name":"leo",
"age":28
}
  • 创建文档(随机ID):POST 索引名称/类型名称
1
2
3
4
5
POST /test1/_doc/
{
"name":"tomcat",
"age":30
}
  • 修改文档:POST 索引名称/类型名称/文档id/_update(推荐,可以修改部分字段)
  • 删除文档:DELETE 索引名称/类型名称/文档id
  • 获取文档:GET 索引名称/类型名称/文档id
  • 查询所有数据:索引名称/类型名称/_search

删除

1
2
# 删除文档
DELETE /test1/type1/1

查询

  • 查询具体数据
1
2
3
4
5
# 精确搜索
GET test1/type1/1

# 模糊搜索
GET test1/type1/_search?q=name:leo

复杂查询

  • GET查询,携带请求体。注意在UI界面中,URL与路径之间不能包含空白行
1
2
3
4
5
6
7
8
GET test1/type1/_search
{
"query":{
"match":{
"name": "tomcat"
}
}
}
  • 返回结果中,hits包含索引和文档信息

分页

1
2
3
4
{
"from": 30,
"size": 10
}

筛选

  • _source字段对查询结果进行过滤,只返回指定的字段
1
2
3
4
5
6
7
8
9
GET test1/type1/_search
{
"query":{
"match":{
"name": "tomcat"
},
"_source": ["field1","field2"]
}
}

排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET test1/type1/_search
{
"query":{
"match":{
"name": "tomcat"
},
"sort": [
{
"age":{
"order": "desc"
}
}
]
}
}

多条件查询

  • must(and)
  • should(or)
  • must_not(not)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET test1/type1/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "jetty"
}
},
{
"match": {
"age": 14
}
}
]
}
}
}

过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GET test1/type1/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "jetty"
}
}
]
},
"filter": {
"range": {
"age": {
"lt": 10
}
}
}
}
}

多条件

  • 空格隔开,满足一个即可
1
2
3
4
5
6
7
8
GET test1/type1/_search
{
"query":{
"match":{
"name": "tomcat jetty leo"
}
}
}

精确查询

  • term 通过倒排索引指定的词条进行精确查找(效率高)
  • match 会使用分词器解析
1
2
3
4
5
6
7
8
GET test1/_search
{
"query":{
"term":{
"name": "tomcat"
}
}
}

分词分析

1
2
3
4
5
6
7
8
9
10
11
12
GET _analyze
{
"analyzer": "standard",
"text": "tomcat"
}


GET _analyze
{
"analyzer": "keyword",
"text": "tomcat"
}

高亮查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET test1/_search
{
"query":{
"match":{
"name": "tomcat"
}
},
"highlight": {
"fields": {
"name": {

}
}
}
}
  • 通过pre_tagspost_tags,自定义高亮的标签。

SpringBoot集成

  1. 配置依赖
1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>${springboot.version}</version>
</dependency>
  1. 配置连接属性
1
2
3
4
5
# 配置
spring:
elasticsearch:
rest:
uris: http://172.16.8.2:9200

索引操作

  1. 新增索引:CreateIndexRequest
  2. 获取索引,判断是否存在,GetIndexRequest
  3. 删除索引,DeleteIndexRequest

文档操作

  1. 添加文档,IndexRequest
  2. 获取文档,GetIndexRequest
  3. 更新文档,UpdateRequest
  4. 删除文档,DeleteRequest
  5. 批量操作,BulkRequest
  6. 查询,SearchRequest