ElasticSearch
概念
Elasticsearch 是一个免费且开放的分布式搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。
es基于Restful风格,用于全文搜索以及文档搜索等。
倒排索引&正排索引
正排索引: 根据主键索引,去查询相关信息。
ps:对于t_desc表两个字端: id(主键)、desc。对desc进行模糊查询,就需要通过主键去遍历,这样效率就不会很高。
倒排索引:根据关键字(keyword)来查询主键。
索引操作
索引:Index,对于结构化数据库,就相当于所选择的数据库一样。
- 创建索引
使用put请求来进行索引的创建(put请求具有幂等性,对于同样的请求不会请求多次)
响应体:
1 2 3 4 5
| { "acknowledged": true, "shards_acknowledged": true, "index": "shopping" }
|
- 获取索引信息
使用get请求来获取索引信息
响应体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "shopping": { "aliases": {}, "mappings": {}, "settings": { "index": { "creation_date": "1676430935994", "number_of_shards": "1", "number_of_replicas": "1", "uuid": "Y2mGQ3jFSZacMKIQtQODwA", "version": { "created": "7080099" }, "provided_name": "shopping" } } } }
|
- 查询所有索引信息
1
| localhost:9200/_cat/indices?v
|
响应体
1 2 3
| health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open shopping Y2mGQ3jFSZacMKIQtQODwA 1 1 0 0 208b 208b
|
- 删除索引
使用Delete请求
响应体:
1 2 3
| { "acknowledged": true }
|
删除后再去获取shopping索引,得到错误信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| { "error": { "root_cause": [ { "type": "index_not_found_exception", "reason": "no such index [shopping]", "resource.type": "index_or_alias", "resource.id": "shopping", "index_uuid": "_na_", "index": "shopping" } ], "type": "index_not_found_exception", "reason": "no such index [shopping]", "resource.type": "index_or_alias", "resource.id": "shopping", "index_uuid": "_na_", "index": "shopping" }, "status": 404 }
|
文档操作
- 创建文档
选择对应的索引,在索引下进行数据的添加。使用POST请求,传入请求体(Json格式)
使用url:
1
| localhost:9200/{index}/_doc
|
请求体:
1 2 3 4 5
| { "name": "iphone12", "desc": "海军蓝256GB", "price": 9899 }
|
响应体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "_index": "shopping", "_type": "_doc", "_id": "D30eU4YB-BLWcyl7uoqr", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
|
可以自定义唯一id, 在请求路径上自己指定
1
| localhost:9200/{index}/_doc/{id自定义}
|
- 查询
a. 根据唯一id查询
使用GET请求
1
| localhost:9200/{index}/_doc/{id}
|
b. 全局查询
使用GET请求
1
| localhost:9200/{index}/_search
|
- 更新
更新文档中的某一字段
POST请求:
1
| localhost:9200/shopping/_update/{id}
|
请求体:
1 2 3 4 5
| { "doc" : { "name": "iphone12 pro" } }
|
对于全量更新,则需要使用put请求,保证幂等性
请求方式与创建文档相同,区别在于更新使用的是PUT请求
- 删除
使用DELETE请求即可
1
| localhost:9200/{index}/_doc/{id}
|
条件搜索
使用GET请求
方式一:
使用url
1
| localhost:9200/shopping/_search?q={key}:{value}
|
方式二:
1
| localhost:9200/shopping/_search
|
放入请求体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "query" : { "match": { "key": "value" } } }
{ "query" : { "match_all": {
} }, "from": 0, "size": 1 }
|
分页参数
from: 当前页的起始位置,从0开始,
size: 每一页的大小。
字段过滤与排序
如果只想查询出我们想看到的数据,请求体中可以加入”_source”,后面的value为数组
1 2 3 4 5 6 7 8
| { "query" : { "match": { "key": "value" } }, "_source": ["key", "key", ...] }
|
使用sort排序
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "query" : { "match": { "key": "value" } }, "_source": ["key1", "key2"], "sort": { "key1": { "order": "desc" } } }
|
多条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| { "query": { "bool": { "should": [ { "match": { "desc": "海军蓝256GB" } }, { "match": { "name": "iphone12" } } ], "filter": { "range": { "price": { "gt": 2000, "lt": 6000 } } } } } }
|
注意
对于文字,es会进行拆分,然后将每个文档进行拆分生成倒排索引,即在每次查询的时候会将所输入的文字性文档进行拆分,然后进行查询,如果想要精确匹配,则使用”match_phrase”
1 2 3 4 5 6 7
| { "query": { "match": { "name": "华小" } } }
|
所查询到的结果, es会将“华”、“小”进行拆分,进行查询。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| { "took": 530, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 1.1374959, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "1003", "_score": 1.1374959, "_source": { "name": "华为", "desc": "海军蓝256GB", "price": 5999.00 } }, { "_index": "shopping", "_type": "_doc", "_id": "1002", "_score": 1.1374959, "_source": { "name": "小米", "desc": "海军蓝256GB", "price": 3999.00 } } ] } }
|
使用match_phrase
1 2 3 4 5 6 7
| { "query": { "match_phrase": { "name": "华小" } } }
|
查询结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "took": 32, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 0, "relation": "eq" }, "max_score": null, "hits": [] } }
|
高亮显示
1 2 3 4 5 6 7 8 9 10 11 12
| { "query": { "match": { "name": "华小" } }, "highlight": { "fields":{ "name":{} } } }
|
聚合查询
分组查询
1 2 3 4 5 6 7 8 9 10
| { "aggs" : { "price_group": { "terms": { "field": "price" } } }, "size": 0 }
|
平均值
1 2 3 4 5 6 7 8 9 10
| { "aggs" : { "price_avg": { "avg": { "field": "price" } } }, "size": 0 }
|
映射关系
控制文档中的字段是否可以被查询,或者是否可以被分词,或者只能作为关键字来使用
在创建索引之后,创建结构信息
1
| localhost:9200/user/_mapping
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "properties": { "name": { "type": "text", "index": true }, "gender": { "type": "keyword", "index": true }, "tel": { "type": "keyword", "index": false } } }
|