diff --git a/README.md b/README.md index 2975db0..4014b25 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,7 @@ Quick Reference [Oracle](./docs/oracle.md) [PostgreSQL](./docs/postgres.md) [Redis](./docs/redis.md) +[Elasticsearch](./docs/elasticsearch.md) ## 快捷键 diff --git a/assets/elasticsearch.svg b/assets/elasticsearch.svg new file mode 100644 index 0000000..47275c7 --- /dev/null +++ b/assets/elasticsearch.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/elasticsearch.md b/docs/elasticsearch.md new file mode 100644 index 0000000..0071ef7 --- /dev/null +++ b/docs/elasticsearch.md @@ -0,0 +1,665 @@ +Elasticsearch 备忘清单 +=== + +这是 [Elasticsearch](https://www.elastic.co/guide/index.html) 的官方文档。 你可以在这里找到 elasticsearch 的所有文档。 + +Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并作为看源软件发布。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。 + +入门 +---- + + +### 入门 + +#### 安装介绍 + +##### 下载 + +- 注意 + + version 需替换为指定版本 + + 官方包有的功能只能试用,完整功能需要付费,请仔细阅读官网文档。 + +- windows + + 下载地址: + + [https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-\${VERSION}-windows-x86_64.zip](https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-windows-x86_64.zip) + +- linux + + ```shell + wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz + wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512 + shasum -a 512 -c elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512 + tar -xzf elasticsearch-${VERSION}-linux-x86_64.tar.gz + cd elasticsearch-${VERSION}/ + ``` + +- macos + + ```shell + curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz + curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c - + tar -xzf elasticsearch-${VERSION}-darwin-x86_64.tar.gz + cd elasticsearch-${VERSION}/ + ``` + +#### 启动 + +- 启动 Elasticsearch + + ```shell + $ ./bin/elasticsearch + ``` + +- 设置密码 + + ```shell + export ELASTIC_PASSWORD="your_password" + ``` +- 测试是否启动成功 + + ```shell + curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200 + ``` + + 成功则返回样例如下: + + ```json + { + "name" : "Cp8oag6", + "cluster_name" : "elasticsearch", + "cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA", + "version" : { + "number" : "${VERSION}", + "build_type" : "tar", + "build_hash" : "f27399d", + "build_flavor" : "default", + "build_date" : "2016-03-30T09:51:41.449Z", + "build_snapshot" : false, + "lucene_version" : "9.10.0", + "minimum_wire_compatibility_version" : "1.2.3", + "minimum_index_compatibility_version" : "1.2.3" + }, + "tagline" : "You Know, for Search" + } + ``` + + + +### elasticsearch 和 RDMS 的对比 + +| RDMS | elasticsearch | +| ----------------------- | ----------------- | +| 数据库(database) | 索引(index) | +| 表(table) | 类型(type) | +| 行(row) | 文档(document) | +| 列(column) | 字段(field) | +| 表结构 | 映射 | +| 索引 | 全文索引 | +| SQL | 查询DSL | +| SELECT * FROM tablename | GET http://... | +| UPDATE table SET | PUT http://... | +| DELETE | DELETE http://... | + +操作 +---- + +说明: + + 1. 以 user_info 为索引名称,类比数据库, + 2. 字段有 id,username,password,nickname,age,info,remark 为例进行演示。 + +# DSL语法 + +## 基础语法规则 + +`curl -X '://:/?' -d ''` + + +- 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 格式的请求主体(如果请求需要的话) + + + +# 索引的操作 + +## 创建索引 + +- 统一请求 api 前缀 + + http://localhost:9200/ + +- DSL语法 + + ```shell + PUT /user_info + { + "settings": { + "number_of_replicas": 1, + "number_of_shards": 1 + }, + "mappings": { + "properties": { + "id": { + "type": "long", + "index": true + }, + "username": { + "type": "keyword", + "index": true + }, + "nickname": { + "type": "keyword", + "index": true + }, + "password": { + "type": "keyword", + "index": false + }, + "age": { + "type": "integer", + "index": true + }, + "info": { + "type": "text", + "index": true + }, + "remark": { + "type": "text", + "index": true + } + } + } + } + ``` + +- curl + + ```shell + curl -XPUT "http://localhost:9200/user_info" -H 'Content-Type: application/json' -d'{ "settings": { "number_of_replicas": 1, "number_of_shards": 1 }, "mappings": { "properties": { "id": { "type": "long", "index": true }, "username": { "type": "keyword", "index": true }, "nickname": { "type": "keyword", "index": true }, "password": { "type": "keyword", "index": false }, "age": { "type": "integer", "index": true }, "info": { "type": "text", "index": true }, "remark": { "type": "text", "index": true } } } }' + ``` + +- 参数说明: + + settings:索引信息设置 + + number_of_shards:每个索引的主分片数,这个配置在索引创建后不能修改 + + number_of_replicas:每个主分片的副本数,这个配置可以随时修改。 + + mappings:索引映射定义 + + properties:字段定义 properties里是json配置,key为字段名称(自定义名称),value是个嵌套json,type是指定字段的类型。 + + -- 其他参数很多,请参考官网资料 + +## 删除索引 + +- DSL语法 + + ```http + DELETE /user_info + ``` + +- curl + + ```shell + curl -XDELETE "http://localhost:9200/user_info" + ``` + + +## 判断索引是否存在 + +- DSL语法 + + ```http + # 查看索引是否存在 + HEAD /user_info + ``` + +- curl + + ```shell + # 查看索引是否存在 + curl -XHEAD "http://localhost:9200/user_info" + ``` + +## 开启/关闭索引 + +- 开启DSL语法 + + ```http + # 开启索引 + POST /user_info/_open + ``` + +- curl + + ```shell + # 开启索引 + curl -XPOST "http://localhost:9200/user_info/_open" + ``` + +- 关闭DSL语法 + + ```http + # 关闭索引 + POST /user_info/_close + ``` + +- curl + + ```shell + # 关闭索引 + curl -XPOST "http://localhost:9200/user_info/_close" + ``` + + + +## 索引的别名 + +- 添加别名DSL语法 + + ```http + # 添加别名 + POST /user_info/_alias/user1 + ``` + +- 添加别名curl + + ```shell + # 添加别名 + curl -XPOST "http://localhost:9200/user_info/_alias/user1" + ``` + + +- 删除别名DSL语法 + + ```http + # 删除别名 + DELETE /user_info/_alias/user1 + ``` + +- 删除别名curl + + ```shell + # 删除别名 + curl -XDELETE "http://localhost:9200/user_info/_alias/user1" + ``` + +- 查看别名DSL语法 + + ```http + # 查看别名 + GET /_alias/user1 + ``` + + +- 查看别名curl + + ```shell + # 查看别名 + curl -XGET "http://localhost:9200/_alias/useraa" + ``` + +## mapping 操作 + +类似修改数据库中列的操作 + +### 查看 mapping + +- DSL语法 + + ```http + # 查看mapping + GET /user_info/_mapping + ``` + +- curl + + ```shell + # 查看mapping + curl -XGET "http://localhost:9200/user_info/_mapping" + ``` + +### 新增 mapping + +- 注意 + + **需要注意的是字段映射只能增加,不能更改删除** + +- DSL语法 + + ```http + # 新增mapping + PUT /user_info/_mapping + { + "properties":{ + "sex":{ + "type":"keyword" + } + } + } + ``` + +- curl + + ```shell + # 新增mapping + curl -XPUT "http://localhost:9200/user_info/_mapping" -H 'Content-Type: application/json' -d'{ "properties":{ "sex":{ "type":"keyword" } } }' + ``` + +# 文档的操作 + +## 添加文档 +- DSL语法 + + ```http + # 新增一条数据 + POST /user_info/_doc/1 + { + "id":1, + "username":"username", + "password":"123456", + "nickname":"nickname", + "age":18, + "info":"一些个人相关的介绍", + "remark":"备注信息", + "sex":"男" + } + ``` + +- curl + + ```shell + # 新增一条数据 + curl -XPOST "http://localhost:9200/user_info/_doc/1" -H 'Content-Type: application/json' -d'{ "id":1, "username":"username", "password":"123456", "nickname":"nickname", "age":18, "info":"一些个人相关的介绍", "remark":"备注信息", "sex":"男" }' + ``` + + +## 查询指定索引的所有文档 + +- 类似数据库中的 `select * from user_info;` + +- DSL语法 + + ```http + GET /user_info/_search + { + "query": { + "match_all": {} + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} } }' + ``` + +## 通过 id 查询文档 + +- 类似数据库中的 `select * from user_info where id = 1;` + +- DSL语法 + + ```http + # 通过id查询 + GET /user_info/_doc/1 + ``` + +- curl + + ```shell + # 通过id查询 + curl -XGET "http://localhost:9200/user_info/_doc/1" + ``` + + +## 通过条件查询文档 + +### 精确查找 + +- 类似数据库中的 `select * from user_info where username = 'username';` + +- DSL语法 + + ```http + # 通过条件查询 + GET /user_info/_search + { + "query": { + "bool": { + "must": [ + { "term": { "username": "username" } } + ] + } + } + } + ``` + +- curl + + ```shell + # 通过条件查询 + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "term": { "username": "username" } } ] } } }' + ``` + +### 模糊查找 + +- 类似数据库中的模糊查询 `select * from user_info where info like '%人%';` + +- DSL语法 + + ```http + # 模糊查找 + GET /user_info/_search + { + "query": { + "match": { + "info": "人" + } + } + } + ``` + + + +### 范围查找 + +- 类似数据库中的范围查询 `select * from user_info where age between 18 and 30;` + +- DSL语法 + + ```http + GET /user_info/_search + { + "query": { + "range": { + "age": { + "gt": 18, + "lt": 30 + } + } + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "range": { "age": { "gt": 18, "lt": 30 } } } }' + ``` + +### limit 查找 + +- 类似数据库中的 limit 查询 `select * from user_info limit 10;` + +- DSL语法 + + ```http + GET /user_info/_search + { + "size": 10, + "query": { + "match_all": {} + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 1, "query": { "match_all": {} } }' + ``` + +### limit offset 查找 + +- 类似数据库中的 limit 查询 `select * from user_info limit 0,10;` + +- DSL语法 + + ```http + GET /user_info/_search + { + "size": 2, + "from": 1, + "query": { + "match_all": {} + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 2, "from": 1, "query": { "match_all": {} } }' + ``` + +- 参数说明 + + - "size": 10表示我们想要返回的结果数量是10条。 + - "from": 20表示我们想要从结果集中的第21条记录开始返回(因为偏移是从0开始的)。 + - "query": `{"match_all": {}}` 是一个匹配所有文档的查询,因为我们没有特定的查询条件,只是想要分页结果。 + +### and 查询 + +- 类似数据库中的 and 查询 `select * from user_info where age > 18 and sex = '男';` + +- DSL语法 + + ```http + GET /user_info/_search + { + "query": { + "bool": { + "must": [ + { "range": { "age": { "gt": 18 } } }, + { "term": { "sex": "男" } } + ] + } + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "range": { "age": { "gt": 17 } } }, { "term": { "sex": "男" } } ] } } }' + ``` + +### or 查询 + +- 类似数据库中的 or 查询 `select * from user_info where age > 18 or sex = '男';` + +- DSL语法 + + ```http + GET /user_info/_search + { + "query": { + "bool": { + "should": [ + { + "range": { + "age": { + "gt": 18 + } + } + }, + { + "term": { + "sex": "男" + } + } + ] + } + } + } + ``` + +- curl + + ```shell + curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "should": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }' + ``` + + +## 删除文档 + +### 删除指定 id + +- 类似数据库中的 delete 查询 `delete from user_info where id = 3;` + +- DSL语法 + + ```http + # 删除文档 + DELETE /user_info/_doc/3 + ``` + +- curl + + ```shell + # 删除文档 + curl -XDELETE "http://localhost:9200/user_info/_doc/3" + ``` + +### 删除指定条件 + +- 类似数据库中的 delete 查询 `delete from user_info where age > 18;` + +- DSL语法 + + ```http + POST /user_info/_delete_by_query + { + "query": { + "range": { + "age": { + "gt": 18 + } + } + } + } + ``` +- curl + + ```shell + curl -XPOST "http://localhost:9200/user_info/_delete_by_query" -H 'Content-Type: application/json' -d'{"query":{"range":{"age":{"gt":18}}}}' + ```