文档:

https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/index.html
安装: https://www.iocoder.cn/Elasticsearch/install/?self https://www.missshi.cn/api/view/blog/5aa125bd5b925d1040000009
基本语法: https://www.dubby.cn/detail.html?id=9077 https://www.jianshu.com/p/6333940621ec

https://blog.csdn.net/laoyang360/article/details/79293493

一、基本概念

1、Node 与 Cluster

ElasticSearch 本质上是分布式的数据库,单个 ElasticSearch 实例称为一个节点(node),一组节点构成一个集群(cluster)。

2、Index


索引作为动词的话,在 ElasticSearch 中存储数据的行为就叫做索引(indexing);类似于 SQL 语句中的 insert;
作为名词,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index 的复数是 indices 或 indexes。

3、Type

在 ElasticSearch 中 type 的概念,相当于表的概念,在6.X 的版本里只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
每个 type 都有自己的 mapping,相当于传统数据中表的列一样。

4、Document

Index 里的单条记录成为 Document(文档),Document 用 json 格式表示。在 ES 中文档没法修改,所有的修改操作在 ES 内部都是先删除旧的文档,再索引新文档。

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

Relational DB -> Databases -> Tables -> Rows -> Columns ElasticSearch -> Indices -> Types -> Documents -> Fields

4.1 文档元数据

节点 说明
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识

二、安装

https://www.xuchuruo.cn/%E4%BD%BF%E7%94%A8docker%E5%AE%89%E8%A3%85elasticsearch.html

1、Docker 安装

  1. ES 安装

    安装文档: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.html Docker 镜像: https://www.docker.elastic.co/#

    https://www.missshi.cn/api/view/blog/5aa125bd5b925d1040000009

  1. docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.0
  2. # docker pull elasticsearch

运行:
开发模式:

  1. docker run -d -p 9200:9200 -p 9300:9300 -e
  2. "discovery.type=single-node"
  3. --name es63 docker.elastic.co/elasticsearch/elasticsearch:6.3.0

Docker-compose 启动:
启动命令:

  1. docker-compose up

docker-compose.yml:

  1. version: '2.2'
  2. services:
  3. elasticsearch:
  4. image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0
  5. container_name: es63-1
  6. environment:
  7. # 集群的名称,名称一样的组成一个集群
  8. - cluster.name=es63-cluster
  9. - bootstrap.memory_lock=true
  10. - "ES_JAVA_OPTS=-Xms216m -Xmx216m"
  11. - "discovery.zen.ping.unicast.hosts=es63-1,es63-2"
  12. # 设置允许跨域,方便head插件访问
  13. - "http.cors.enabled=true"
  14. - "http.cors.allow-origin=*"
  15. ulimits:
  16. memlock:
  17. soft: -1
  18. hard: -1
  19. volumes:
  20. # 将索引数据挂载到名为esdata1的docker volume,可以通过-v参数删除(如docker stop -v或者docker-compose down -v)
  21. - esdata1:/usr/share/elasticsearch/data
  22. # 将日志目录挂载到物理机docker-compose.yml目录下的logs/es目录下
  23. # - ./logs/es/:/usr/share/elasticsearch/logs/:rw
  24. # 下面是将索引数据挂载到物理机docker-compose.yml目录下的data/es目录下
  25. # - ./data/es/:/usr/share/elasticsearch/data:rw
  26. ports:
  27. - 9200:9200
  28. - 9300:9300
  29. networks:
  30. - esnet
  31. elasticsearch2:
  32. image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0
  33. container_name: es63-2
  34. environment:
  35. - cluster.name=es63-cluster
  36. - bootstrap.memory_lock=true
  37. - "ES_JAVA_OPTS=-Xms216m -Xmx216m"
  38. # 这里的elasticsearch是指的设置的container_name,容器内部可以通过container_name相互网络访问
  39. - "discovery.zen.ping.unicast.hosts=es63-1,es63-2"
  40. # 设置允许跨域,方便head插件访问
  41. - "http.cors.enabled=true"
  42. - "http.cors.allow-origin=*"
  43. ulimits:
  44. memlock:
  45. soft: -1
  46. hard: -1
  47. volumes:
  48. - esdata2:/usr/share/elasticsearch/data
  49. ports:
  50. - 9201:9201
  51. - 9301:9301
  52. networks:
  53. - esnet
  54. volumes:
  55. esdata1:
  56. driver: local
  57. esdata2:
  58. driver: local
  59. networks:
  60. esnet:


ElasticSearch - 图1


es从5.0开始默认指定jvm内存为2g,我们需要修改下参数。
# 运行

  1. docker run \
  2. -d \
  3. -p 9200:9200 \
  4. -p 9300:9300 \
  5. -v "$PWD/esdata":/usr/share/elasticsearch/data \
  6. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  7. --name elasticsearch \
  8. elasticsearch
  1. Kibana 安装

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
docker pull kibana
启动Kibana有两种方式:
方式1:当Kibana部署在同一个Docker服务中时,可以直接使用—link进行连接,启动方式如下:

  1. docker run \
  2. --name kibana \
  3. --link elasticsearch:elasticsearch \
  4. -p 5601:5601 \
  5. -d \
  6. kibana

其中,8601是Kibana暴露的端口。
此外,对于跨主机或者Docker服务时,Kibana可以直接关联HTTP地址:

docker run \
    --name kibana \
    -e ELASTICSEARCH_URL=http://some-elasticsearch:9200 \
    -p 5601:5601 \
    -d \
    kibana

其中,http://some-elasticsearch:9200表示启动elasticsearch服务的地址。

  1. 验证

当我们已经启动了Elasticsearch后,可以在命令行输入如下命令来测试一下Elasticsearch是否已经正常启动了:

curl 'http://localhost:9200/?pretty'

期望结果如下类似:

{
  "name" : "dJf2MDl",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "JlYKF0YrQYWC3vPx386QWg",
  "version" : {
    "number" : "5.6.12",
    "build_hash" : "cfe3d9f",
    "build_date" : "2018-09-10T20:12:43.732Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

Kibana访问
我们可以打开浏览器,访问如下地址: http://localhost:5601

老版本的es需要设置 : index patter改为* Time Filter field name选第一个即可.

  1. SQL 插件

    https://github.com/NLPchina/elasticsearch-sql


./bin/elasticsearch-plugin install 
https://github.com/NLPchina/elasticsearch-sql/releases/download/5.6.12.0/
elasticsearch-sql-5.6.12.0.zip
  1. HEAD 插件

    https://github.com/mobz/elasticsearch-head#

docker run -p 9100:9100 mobz/elasticsearch-head:5
  1. IK 分词器

    https://github.com/medcl/elasticsearch-analysis-ik

注意对应版本!!!!
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.12/elasticsearch-analysis-ik-5.6.12.zip

三、ES 数据操作

一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:
curl -X://:/?‘ -d ‘‘

VERB 适当的 HTTP 方法谓词 : GETPOSTPUTHEAD 或者 DELETE
PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个https 代理)
HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (如果请求需要的话)

1、索引文档

文档通过 _index、_type、_id 唯一确定,索引文档的基本语法:

PUT /_index/_type/_id
{
   "field":"value",
   ... 
}

magacorp 索引名称
# employee 类型名称
# 1 文档id
# 创建索引并插入一条文档

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

ES 响应:

{
   "_index":    "megacorp",
   "_type":     "employee",
   "_id":       "1",
   "_version":  1,
   "created":   true
}

说明:
1、_version:ES 每个文档都有版本号,每当文档变化(含删除)都会使 _version 增加。
2、自增ID:如果索引文档的时候没有给定ID,ES 会自动生成一个 UUID。

2、检索文档

从 ElasticSearch 中获取文档的基本语法格式:

GET /_index/_type/_id
# ES 响应:
{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "title": "My first blog entry",
      "text":  "Just trying this out...",
      "date":  "2014/01/01"
  }
}
  • pretty 参数

在任意的查询字符串中增加 pretty 参数,ES 会美化输出的 JSON,_source 不会被美化。

  • found 响应

文档找到返回 true,文档未找到返回 false,HTTP 响应状态码也相应的由 ‘200 OK’ 变为 ‘404 Not Found’。

可以在 curl 后加 -i 参数得到响应头。

  • _source

它包含了在创建索引时我们发送给 Elasticsearch 的原始文档。
_source 也可以作为查询参数,可以过滤字段。
# 检索文档的一部分:title、text
GET /website/blog/123?_source=title,text
# 只查询_source 数据,ES 响应不含元数据。
GET /website/blog/123?_source

2.1 主键搜索

执行 一个 HTTP GET 请求并指定文档的地址——索引库、类型和ID。
# 查询指定索引 id 为1 的文档

GET /megacorp/employee/1

2.2 条件搜索

查询megacorp 索引 employee type 下的所有文档(一个搜索默认返回10条数据)

GET /megacorp/employee/_search

带条件查询

GET /megacorp/employee/_search?q=last_name:Smith

领域特定语言(DSL), 指定了使用一个 JSON 请求

# GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

<1>这部分查询属于区间过滤器(range filter),它用于查找所有年龄大于30岁的数据——gt为”greater than”的缩写。
# <2> 这部分查询与之前的match语句(query)一致。

GET /megacorp/employee/_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 30 } <1>
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "smith" <2>
                }
            }
        }
    }

2.3 全文搜索

搜索所有喜欢“rock climbing”的员工:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

2.4 短语搜索

查询同时包含”rock”和”climbing”(并且是相邻的)的员工记录

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

2.5 高亮搜索

在之前的语句上增加highlight参数,返回结果中会有一个新的部分叫做highlight
# 这里包含了来自about字段中的文本,并且用来标识匹配到的单词。

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

2.6 检查文档是否存在

只是检查文档存在与否时,可以使用 head 代替 GET,HEAD 请求不会返回响应体,只有 HTTP 头。存在返回 ‘200 OK’,不存在返回 ‘404 Not Found’。

curl -i -XHEAD http://localhost:9200/website/blog/123

3、更新文档

在 ES 中更新一个文档有两种形式,一种为更新整个文档(重建索引),一种为局部更新。两者的更新过程都是一样,过程如下:

  1. 从旧文档中检索JSON
  2. 修改它
  3. 删除旧文档
  4. 索引新文档

    3.1 更新整个文档

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}

ES 响应:

{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 2,
  "created":   false <1>
}
  • <1> created 标识为 false,因为同索引同类型下已存在相同 ID 的文档。

    3.2 创建索引

    由上可见,全新的创建一个文档和更新一个文档的请求都是相同,如何指定只执行创建操作呢?有三种方法:

  • 创建的时候不指定 ID,由 ES 自动生成。

  • 使用 op_type 查询参数:
    PUT /website/blog/123?op_type=create
    { ... }
    
  • 在 URL 后面加上 _create 作为端点。
    PUT /website/blog/123/_create
    { ... }
    

如果创建成功,ES 返回正常的数据且相应的状态码为 ‘201 Created’,如果文档已存在,返回 ‘409 Conflict’,错误信息如下:

{
  "error" : "DocumentAlreadyExistsException[[website][4] [blog][123]:
             document already exists]",
  "status" : 409
}

4、删除文档

删除文档的语法和之前的一致,只不过要使用 DELETE 方法:
DELETE /_index/_type/_id
如果文档找到,ES 返回 ‘200 OK’,并且 _version 会增加,如果文档未找到返回 ‘404’,_version 也会增加。

删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。

5、版本控制

ES 更新文档的时候当面临并发问题的时候,有两种方式来保证数据的一致性问题。

5.1 指定 _version

PUT /website/blog/1?version=1 <1>
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}
  • <1> 只有当文档的 version 也为1的时候,更新才生效。
  • 所有更新和删除文档的请求都接受version参数,它可以允许在你的代码中增加乐观锁控制。

    5.2 使用外部版本控制系统

    PUT /website/blog/2?version=5&version_type=external
    {
    "title": "My first external blog entry",
    "text":  "Starting to get the hang of this..."
    }
    

如上,在指定版本的同时再加上 version_type=external,外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查_version 是否与请求中指定的一致,而是检查是否小于指定的版本。如果请求成功,外部版本号就会被存储到_version中。

6、局部更新

7、MGET

8、批量

四、ES 聚合

1、高阶概念

1.1 桶(Buckets)

满足特定条件的文档的集合。

1.2 指标(Metrics)

对桶内的文档进行统计计算。
SELECT COUNT(color),SUM(0),MAX(X) — 相当于指标
FROM table
GROUP BY color — 相当于桶
桶在概念上类似于 SQL 的分组(GROUP BY),而指标则类似于 COUNT() 、SUM() 、MAX() 等统计方法。