文章目录
安装
https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0
下载完成启动bin/elasticsearch
服务,可以在Postman
调试各种请求。
基本语法
索引
创建索引
javascript
PUT: http://127.0.0.1:9200/shopping
Response:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "shopping"
}
多次创建同一个索引时,会报错,说明创建请求是幂等性的(同一个操作执行多次和执行一次效果相同,不会因为多次执行而产生不同的效果)。所以应该用PUT
而非POST
,POST
每次都会创建一条新的记录,对于同一个请求,并不会由于索引重复而报错。
查看索引
GET: http://127.0.0.1:9200/shopping
包含了每个索引的健康状况、状态、名称、唯一ID(UUID)、分片数(primary和replica)、包含的文档数、删除的文档数、以及存储大小所有主分片占用的物理磁盘空间总。
删除索引
DELETE: http://127.0.0.1:9200/shopping
文档
创建文档
javascript
POST: http://127.0.0.1:9200/shopping/_doc`或者`POST: http://127.0.0.1:9200/shopping/_create
Request body:
{
"name": "xiaomi su7",
"type": 1,
"price": 29.99
}
Response:
{
"_index": "shopping",
"_type": "_doc",
"_id": "bhajbY8BDgHLWJjh9Xp7",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
如果觉得id
不好记忆,可以指定id
创建文档:POST/PUT: http://127.0.0.1:9200/shopping/_doc/1001
,重复调用会更新文档,如果明确用_create
,重复调用会有冲突。
更新文档
javascript
POST: http://127.0.0.1:9200/shopping/_update/1001
Request body:
{
"doc": {
"compony": "xiaomi "
}
}
Response:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 9,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 10,
"_primary_term": 1
}
如果加上doc
就是增量更新,否则为全亮更新。
匹配查询
javascript
GET: http://127.0.0.1:9200/shopping/_search
Request Body:
{
"query": {
"match_all": {
}
/**
"match": {
"compony": "xiaomi"
}
*/
"from": 0,
"size": 2,
"_source": ["type", "price"],
"sort": {
"price": {
"order": "desc"
}
}
}
Response:
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "1003",
"_score": null,
"_source": {
"price": 39.99,
"type": 1
},
"sort": [
39.99
]
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "bhajbY8BDgHLWJjh9Xp7",
"_score": null,
"_source": {
"price": 29.99,
"type": 1
},
"sort": [
29.99
]
}
]
}
}
多条件查询
javascript
GET: http://127.0.0.1:9200/shopping/_search
Request Body:
{
"query": {
"bool": {
// 数组里的条件同时满足
"must": [
{
"match": {
"name": "xiaomi su7"
}
},
{
"match": {
"type": 1
}
}
],
// 数组里的条件满足一个即可
"should": [
{
"match": {
"price": 39.99
}
}
],
// 对结果进行范围过滤
"filter": {
"range": {
"price": {
"gt": 30
}
}
}
}
}
}
Response:
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 2.2391143,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "1003",
"_score": 2.2391143,
"_source": {
"name": "xiaomi su7 pro",
"type": 1,
"price": 39.99
}
}
]
}
}
match
是分词检索,doc
在存储的时候是倒排索引,会把里面的字段按空格(实验结果)拆成一些词,每个词都会对应一条id
的数据。默认查询时用的并不是全词匹配,比如:
javascript
{
"query": {
"match": {
"name": "su7"
}
}
}
能匹配到name = "xiaomi su7" / "xiaomi su7 pro"
的数据。
聚合查询
javascript
GET: http://127.0.0.1:9200/shopping/_search
Request Body:
{
"aggs": {
"price_group": {
"terms": { // 分组
"field": "price"
}
}
},
"size": 0
}
Response:
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"price_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 29.989999771118164,
"doc_count": 2
},
{
"key": 39.9900016784668,
"doc_count": 1
}
]
}
}
}
映射
可以为某个索引设置一些映射的字段,包括字段是否能用分词查询(否则全亮匹配)、是否能用来查询。
javascript
PUT: http://127.0.0.1:9200/user/_mapping
Request Body:
{
"properties": {
"name": {
"type": "text", // 可分词查询
"index": true. // 可作为查询字段
},
"sex": {
"type": "keyword", // 只能全亮匹配
"index": true
},
"tel": {
"type": "keyword",
"index": false // 不可作为查询字段
}
}
}