0%

ElasticSearch基于http请求的基础操作

ElasticSearch

概念

Elasticsearch 是一个免费且开放的分布式搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。

es基于Restful风格,用于全文搜索以及文档搜索等。

倒排索引&正排索引

正排索引: 根据主键索引,去查询相关信息。

ps:对于t_desc表两个字端: id(主键)、desc。对desc进行模糊查询,就需要通过主键去遍历,这样效率就不会很高。

倒排索引:根据关键字(keyword)来查询主键。

索引操作

索引:Index,对于结构化数据库,就相当于所选择的数据库一样。

  1. 创建索引

使用put请求来进行索引的创建(put请求具有幂等性,对于同样的请求不会请求多次

1
localhost:9200/shopping

响应体:

1
2
3
4
5
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "shopping"
}
  1. 获取索引信息

使用get请求来获取索引信息

1
localhost:9200/shopping

响应体:

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. 查询所有索引信息
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

  1. 删除索引

使用Delete请求

1
localhost:9200/shopping

响应体:

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
}

文档操作

  1. 创建文档

选择对应的索引,在索引下进行数据的添加。使用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", // 生成的唯一id
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

可以自定义唯一id, 在请求路径上自己指定

1
localhost:9200/{index}/_doc/{id自定义}
  1. 查询

a. 根据唯一id查询

使用GET请求

1
localhost:9200/{index}/_doc/{id}

b. 全局查询

使用GET请求

1
localhost:9200/{index}/_search
  1. 更新

更新文档中的某一字段

POST请求:

1
localhost:9200/shopping/_update/{id}

请求体:

1
2
3
4
5
{
"doc" : {
"name": "iphone12 pro" //填入需要更新的字段
}
}

对于全量更新,则需要使用put请求,保证幂等性

请求方式与创建文档相同,区别在于更新使用的是PUT请求

  1. 删除

使用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" // 填入需要查询的条件
}
}
}
// 如果全量查询,则使用match_all
{
"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" // order表示排序, desc降序, asc升序
}
}
}

多条件查询

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": [ // should表示 or , must表示and
{
"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":{} //字段key
}
}
}

聚合查询

分组查询

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 //使用tel字段无法查询,因为tel字段指定index=false,不能作为索引,
}
}
}
-------------本文结束感谢您的阅读-------------