0%

Elasticsearch 基本使用

Elasticsearch 是一个开源的分布式搜索引擎,基于 Lucene 构建,广泛应用于日志分析、全文搜索、数据分析等领域。Elasticsearch 允许我们进行高效的实时搜索和数据分析,并且其强大的分布式架构使得它能够处理大规模的数据;这篇文章介绍一下 Elasticsearch 的基本增删改查(CRUD)操作。ES 采用 RESTful 风格 API,我们可以在 Kibana 中进行相关的操作指令。

基本概念

在开始之前,我们先来了解一下 ES 当中的一些基本概念吧。

  • 索引(Index):数据存储的地方,类似于关系数据库中的数据库。
  • 文档(Document):索引中的数据记录,类似于关系数据库中的行。
  • 字段(Field):文档中的具体数据单元,类似于关系数据库中的列。
  • 映射(Mapping):定义索引中字段的数据类型和其他特性。

获取集群或者节点的信息

1
2
3
4
5
6
# 获取集群的健康信息
GET _cluster/health
# 获取节点状态信息
GET _nodes/stats
# 查看所有的索引
GET /_cat/indices?v

CRUD

Create

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个索引,用于存储文档集合
PUT index_name
# 添加文档,自动生成主键
POST index_name/_doc
{
"field": "value"
}
# 添加文档,文档 ID 由用户设置,如果文档存在,则进行覆盖
PUT index_name/_doc/document_id
{
"field": "value"
}
# 如果文档存在,则报错给出提示信息
PUT index_name/_create/document_id
{
"field": "value"
}

Read

1
2
# 根据文档id读取索引中的文档
GET index_name/_doc/document_id

Update

1
2
3
4
5
6
7
8
# 更新指定文档对应的字段和内容
POST index_name/_update/document_id
{
"doc": {
"field1": "value",
"field2": "value",
}
}

Delete

1
2
# 删除指定文档
DELETE index_name/_doc/id

搜索信息

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 获取索引中的所有文档
GET index_name/_search
# 根据区间查询
GET index_name/_search
{
"query": {
"match": {
"field": {
"gte": "lowest value",
"lte": "highest value"
}
}
}
}
# 聚合查询
GET index_name/_search
{
"aggs": {
"name your aggregation": { # 自己定义的分组名称
"terms": {
"field": "category", # 需要进行分组的字段
"size": 100
}
}
}
}
# 全文搜索,会对 search terms 进行分词,根据分词找到匹配的数据
GET index_name/_search
{
"query": {
"match": {
"field": {
"query": "search terms"
}
}
}
}
# 默认情况下,分词使用 OR 进行文档匹配:如果文档出现了这个分词,就进行返回。可以将操作改成 And:一个文档中同时出现这些分词才回进行返回。
GET index_name/_search
{
"query": {
"match": {
"field you want to search": {
"query": "search terms",
"operator": "and"
}
}
}
}
# 短语搜索,将短语当成一个整体进行完全匹配,比如匹配商品的标签
GET index_name/_search
{
"query": {
"match_phrase": {
"field": {
"query": "search phreas"
}
}
}
}
# 多个字段的内容数据匹配搜索,比如搜索一篇文章标题或者文章主体包含某关键字
GET index_here/_search
{
"query": {
"multi_match": {
"query": "search terms",
"fields": [
"field1^2", # 可以设置搜索字段的权重(^),会排在前面优先展示
"field2",
"field you want to search over"
],
"type": "phrase" # 加上这行,表示短语搜索,进行全匹配
}
}
}

组合搜索查询

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Bool Query
- must: defines all queries(criteria) a document MUST match to be returned as hits
返回所有条件都符合的搜索结果:必需要符合条件1和条件2...
GET index_name/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field1": "value"
}
},
{
"match": {
"field2": "value"
}
}
]
}
}
}
- must_not: defines queries(criteria) a document MUST NOT match to be included in the search results
符合某种条件的结果不返回
GET index_name/_search
{
"query": {
"bool": {
"must": {
"match_phrase": {
"field1": "value"
}
},
"must_not":[ # 符合这个条件的结果不返回
{
"match": {
"field2": "value"
}
}
]
}
}
}
- should: "nice to have" queries(criteria)
符合条件的结果会有更高的得分,会展示在搜索结果的更前面
GET news_headlines/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field1": "value"
}
}
],
"should":[
{
"match_phrase": {
"field2": "value"
}
}
]
}
}
}
- filter: 过滤符合条件的结果
GET news_headlines/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field": "value"
}
}
],
"filter":{ # 筛选出符合这个时间区间的结果
"range":{
"date": {
"gte": "begin time",
"lte": "end time"
}
}
}
}
}
}

reference: