- 一、基本概念
- 二、安装
- 三、ES 数据操作
- magacorp 索引名称
# employee 类型名称
# 1 文档id
# 创建索引并插入一条文档 - 执行 一个 HTTP GET 请求并指定文档的地址——索引库、类型和ID。
# 查询指定索引 id 为1 的文档 - 查询megacorp 索引 employee type 下的所有文档(一个搜索默认返回10条数据)
- 带条件查询
- 领域特定语言(DSL), 指定了使用一个 JSON 请求
- <1>这部分查询属于区间过滤器(range filter),它用于查找所有年龄大于30岁的数据——gt为”greater than”的缩写。
# <2> 这部分查询与之前的match语句(query)一致。 - 搜索所有喜欢“rock climbing”的员工:
- 查询同时包含”rock”和”climbing”(并且是相邻的)的员工记录
- 在之前的语句上增加highlight参数,返回结果中会有一个新的部分叫做highlight
# 这里包含了来自about字段中的文本,并且用来标识匹配到的单词。 - 3、更新文档
- 4、删除文档
- 5、版本控制
- 6、局部更新
- 7、MGET
- 8、批量
- 四、ES 聚合
文档:
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
一、基本概念
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 安装
- 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
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.0# docker pull elasticsearch
运行:
开发模式:
docker run -d -p 9200:9200 -p 9300:9300 -e"discovery.type=single-node"--name es63 docker.elastic.co/elasticsearch/elasticsearch:6.3.0
Docker-compose 启动:
启动命令:
docker-compose up
docker-compose.yml:
version: '2.2'services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0container_name: es63-1environment:# 集群的名称,名称一样的组成一个集群- cluster.name=es63-cluster- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms216m -Xmx216m"- "discovery.zen.ping.unicast.hosts=es63-1,es63-2"# 设置允许跨域,方便head插件访问- "http.cors.enabled=true"- "http.cors.allow-origin=*"ulimits:memlock:soft: -1hard: -1volumes:# 将索引数据挂载到名为esdata1的docker volume,可以通过-v参数删除(如docker stop -v或者docker-compose down -v)- esdata1:/usr/share/elasticsearch/data# 将日志目录挂载到物理机docker-compose.yml目录下的logs/es目录下# - ./logs/es/:/usr/share/elasticsearch/logs/:rw# 下面是将索引数据挂载到物理机docker-compose.yml目录下的data/es目录下# - ./data/es/:/usr/share/elasticsearch/data:rwports:- 9200:9200- 9300:9300networks:- esnetelasticsearch2:image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0container_name: es63-2environment:- cluster.name=es63-cluster- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms216m -Xmx216m"# 这里的elasticsearch是指的设置的container_name,容器内部可以通过container_name相互网络访问- "discovery.zen.ping.unicast.hosts=es63-1,es63-2"# 设置允许跨域,方便head插件访问- "http.cors.enabled=true"- "http.cors.allow-origin=*"ulimits:memlock:soft: -1hard: -1volumes:- esdata2:/usr/share/elasticsearch/dataports:- 9201:9201- 9301:9301networks:- esnetvolumes:esdata1:driver: localesdata2:driver: localnetworks:esnet:

es从5.0开始默认指定jvm内存为2g,我们需要修改下参数。
# 运行
docker run \-d \-p 9200:9200 \-p 9300:9300 \-v "$PWD/esdata":/usr/share/elasticsearch/data \-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \--name elasticsearch \elasticsearch
- Kibana 安装
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
docker pull kibana
启动Kibana有两种方式:
方式1:当Kibana部署在同一个Docker服务中时,可以直接使用—link进行连接,启动方式如下:
docker run \--name kibana \--link elasticsearch:elasticsearch \-p 5601:5601 \-d \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服务的地址。
- 验证
当我们已经启动了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选第一个即可.
./bin/elasticsearch-plugin install
https://github.com/NLPchina/elasticsearch-sql/releases/download/5.6.12.0/
elasticsearch-sql-5.6.12.0.zip
docker run -p 9100:9100 mobz/elasticsearch-head:5
注意对应版本!!!!
./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
| VERB | 适当的 HTTP 方法 或 谓词 : GET、POST、PUT、HEAD 或者 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 中更新一个文档有两种形式,一种为更新整个文档(重建索引),一种为局部更新。两者的更新过程都是一样,过程如下:
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() 等统计方法。
