reference/docs/elasticsearch.md
2024-04-23 13:48:00 +08:00

666 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Elasticsearch 备忘清单
===
这是 [Elasticsearch](https://www.elastic.co/guide/index.html) 的官方文档。 你可以在这里找到 elasticsearch 的所有文档。
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的并作为看源软件发布。官方客户端在Java、.NETC#、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示Elasticsearch是最受欢迎的企业搜索引擎其次是Apache Solr也是基于Lucene。
入门
----
<!--rehype:body-class=cols-2-->
### 入门
#### 安装介绍
##### 下载
- 注意
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<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'`
- VERB HTTP 方法GET, POST, PUT, HEAD, DELETE
- PROTOCOLhttp 或者 https 协议(只有在 Elasticsearch 前面有 https 代理的时候可用)
- HOSTElasticsearch 集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫 localhost
- PORTElasticsearch 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是个嵌套jsontype是指定字段的类型。
-- 其他参数很多,请参考官网资料
## 删除索引
- 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}}}}'
```