ElasticSearch

开源的ElasticSearch是目前全文搜索引擎的首选,可以快速的存储,搜索和分析海量数据

近乎实时存储检索 可以处理pb级别的数据 es使用java开发 和lucene作为核心

目的通过简单的Restful API来隐藏 Lucene的复杂性 从而让全文搜索变简单

去年的虚拟机上的es居然还可以正常启动

image-20210314215611192

Docker安装

  1. 下载镜像文件

    1
    2
    docker pull elasticsearch:7.4.2
    docker pull kibana:7.4.2
  2. 创建实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # 给虚拟机创建自己的目录 为了后面把配置挂载出来
    mkdir -p /mydata/elasticsearch/config
    mkdir -p /mydata/elasticsearch/data

    # 表示es可以用远程的任何机器访问
    echo "http.host:0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml

    # --name 为容器起名字
    # -p 两个端口 9300是集群状态下节点通信
    docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \

    #以单节点运行
    -e "discovery.type=single-node" \

    #最大占用
    -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \

    # 挂载yml配置
    -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml\

    # 挂载data和插件目录
    -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
    -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \

    # 后台启动
    -d elasticsearch:7.4.2

    # 启动后如果无法访问 看看是否权限问题
    chomd -R 777 /mydata/elasticsearch
    # 重启


    #安装kibana 注意改自己主机地址 kibana的可视化访问端口一般5601
    docker run -name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10 -p 5601:5601 \
    -d kibana:7.4.2
  3. 可以使用postman发送测试请求

    查看节点信息

    1
    http://192.168.56.10:9200/_cat/nodes

基本概念

image-20210314212255410

Index(索引)

Type(类型)

倒排索引

维护一个倒排索引表 将整句拆分成单词

image-20210314212034363

查出的记录就会有相关性得分

初步检索

_cat

GET /_cat/nodes: 查看所有节点

GET /_cat/health: 查看es健康状况

GET /_cat/master: 查看主节点

GET /_cat/indices: 查看所有索引

image-20210314220826676

image-20210314220859874

索引一个文档(保存)

PUT带id保存

  • 如果发送多次就是更新操作
  • 不允许不带id

保存一个数据,保存在索引的哪个类型下,指定用哪个唯一标识

在customer索引下的external类型下保存1号数据为

1
2
3
4
PUT customer/external/1
{
"name": "John Doe"
}

image-20210314221313709

image-20210314221430950

带_的都是元数据, 代表基本信息

POST请求保存

  • 保存的时候可以不指定id 是新增操作
  • 带id 第一次是create 第二次就是update

查询文档

GET

image-20210314222050224

  • _index: 在哪个索引
  • _type: 在哪个类型
  • _id: 记录id
  • _version: 版本号
  • _seq_no: 并发控制字段,每次更新就会+1 用来做乐观锁
  • _primary_term: 主分片重新分配,如重启,就会变化
  • found: true
  • _source: 真正的内容

更新文档

POST

如果带了_update,就一定要带上doc

这个操作会对比我们的元数据 如果数据一致 版本号就不会发生任何变化

1
2
3
4
5
6
POST customer/external/1/_update
{
"doc":{
"name":"John Doew"
}
}

如果不带_update, 不断更新 不断叠加版本

1
2
3
4
POST customer/external/1/_update
{
"name":"John Doew"
}

更新的同时可以添加属性

删除文档&索引

DELETE

1
2
DELETE customer/external/1/
DELETE customer/

BULK批量API

image-20210314224645071

可以进行保存 删除 更新操作

image-20210314224902595

进阶检索

SearchAPI

ES支持两种基本方式检索

  • 一个是通过使用REST request URI 发送搜索参数(url+检索参数)

image-20210314225800176

QueryDSL

  • 另一个是通过使用REST request body 来发送它们(url+请求体)

image-20210314230032147

(未完待续)