ES 常用查询命令汇总

本文最后更新于:2023年8月31日 下午

_cat系列

_cat系列提供了一系列查询elasticsearch集群状态的接口。你可以通过执行 curl -XGET localhost:9200/_cat获取所有_cat系列的操作

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
/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

你也可以后面加一个v,让输出内容表格显示表头,举例:_cat/allocation?v

_cluster系列

1、查询设置集群状态

1
curl -XGET localhost:9200/_cluster/health?pretty=true&level=indices&level=shards

pretty=true表示格式化输出

level=indices 表示显示索引状态

level=shards 表示显示分片信息

2、显示集群系统信息,包括CPU JVM等等

curl -XGET localhost:9200/_cluster/stats?pretty=true

3、集群的详细信息。包括节点、分片等。

curl -XGET localhost:9200/_cluster/state?pretty=true

3、获取集群堆积的任务

curl -XGET localhost:9200/_cluster/pending_tasks?pretty=true

3、修改集群配置

举例:

1
2
3
4
5
6
7
8
9
curl -XPUT localhost:9200/_cluster/settings -d ‘{

“persistent” : {

“discovery.zen.minimum_master_nodes” : 2

}

}’

transient 表示临时的,persistent表示永久的

4、curl -XPOST ‘localhost:9200/_cluster/reroute’ -d ‘xxxxxx’

对shard的手动控制,参考http://zhaoyanblog.com/archives/687.html

5、关闭节点

关闭指定192.168.1.1节点

1
2
3
curl -XPOST ‘http://192.168.1.1:9200/_cluster/nodes/_local/_shutdown’

curl -XPOST ‘http://localhost:9200/_cluster/nodes/192.168.1.1/_shutdown’

关闭主节点

curl -XPOST ‘http://localhost:9200/_cluster/nodes/_master/_shutdown’

关闭整个集群

1
2
3
4
5
curl -XPOST ‘http://localhost:9200/_shutdown?delay=10s’

curl -XPOST ‘http://localhost:9200/_cluster/nodes/_shutdown’

curl -XPOST ‘http://localhost:9200/_cluster/nodes/_all/_shutdown’

delay=10s表示延迟10秒关闭

_nodes系列

1、查询节点的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl -XGET ‘http://localhost:9200/_nodes/stats?pretty=true’

curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2/stats?pretty=true’

curl -XGET ‘http://localhost:9200/_nodes/process’

curl -XGET ‘http://localhost:9200/_nodes/_all/process’

curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/jvm,process’

curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/info/jvm,process’

curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/_all

curl -XGET ‘http://localhost:9200/_nodes/hot_threads

索引操作

1、获取索引

curl -XGET ‘http://localhost:9200/{index}/{type}/{id}’
curl -XGET ‘http://localhost:9200/{index}’

1.1 、获取索引结构
curl -XGET ‘http://localhost:9200/{index}/_mapping’

2、索引数据

1
2
3
4
5
6
7
8
9
curl -XGET "http:/10.0.27.14:9200/easyes_document/_search" -H "Content-Type: application/json" -H "Authorization:Basic ZWxhc3RpYzpDWVdqOFBNSmdM" -d '
{
"query": {
"match": {
"title": "测试文档"
}
}
}
'

2.1 查询某个index下所有数据

1
2
3
4
5
6
7
curl -XGET "http:/10.0.27.14:9200/easyes_document/_search" -H "Content-Type: application/json" -H "Authorization:Basic ZWxhc3RpYzpDWVdqOFBNSmdM" -d '
{
"query": {
"match_all": {}
}
}
'

2.2 查询所有索引别名
curl -XGET "http://10.0.27.14:9200/_alias" -H "Content-Type: application/json" -H "Authorization:Basic ZWxhc3RpYzpDWVdqOFBNSmdM"
2.3 查询指定别名信息

curl -XGET "http://10.0.27.14:9200/_alias/ee_default_alias" -H "Content-Type: application/json" -H "Authorization:Basic ZWxhc3RpYzpDWVdqOFBNSmdM"

3、删除索引

curl -XDELETE ‘http://localhost:9200/{index}/{type}/{id}’

4、设置mapping

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
curl -XPUThttp://localhost:9200/{index}/{type}/_mapping-d ‘{

“{type}” : {

“properties” : {

“date” : {

type” : “long

},

“name” : {

type” : “string”,

“index” : “not_analyzed

},

“status” : {

type” : “integer

},

type” : {

type” : “integer

}

}

}

}’

5、获取mapping

curl -XGET http://localhost:9200/{index}/{type}/_mapping

6、搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl -XGET ‘http://localhost:9200/{index}/{type}/_search’ -d '{

“query” : {

“term” : { “user” : “kimchy” } //查所有 “match_all”: {}

},

“sort” : { “age” : {“order” : “asc”}},{ “name” : “desc” } ,

“from”:0,

“size”:100

}
1
2
3
4
5
6
7
8
9
10
11
curl -XGET ‘http://localhost:9200/{index}/{type}/_search’ -d '{

“filter”: {“and”:{“filters”:{“term”:{“age”:“123”}},{“term”:{“name”:“张三”}}},

“sort” : { “age” : {“order” : “asc”}},{ “name” : “desc” } ,

“from”:0,

“size”:100

}

示例:

DSL查询示例

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
{
"query": {
"bool": {
"must": [
{
"term": {
"title.keyword": {
"value": "测试文档3",
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"track_total_hits": 2147483647,
"highlight": {
"pre_tags": ["<em>"],
"post_tags": ["</em>"],
"fragment_size": 2,
"fields": {
"content": {
"type": "unified"
}
}
}
}
  1. query:这是一个查询对象,用于指定要执行的查询操作。
  2. bool:这是一个布尔查询,用于组合多个子查询条件。
  3. must:这是一个必须匹配的子查询条件数组。在这个示例中,我们只有一个子查询条件。
  4. term:这是一个术语查询,用于精确匹配字段的值。
  5. title.keyword:这是要匹配的字段名。.keyword表示使用关键字字段进行匹配,这意味着不会进行分词。
  6. value:这是要匹配的具体值,这里是”测试文档3”。
  7. boost:这是一个可选的权重值,用于调整查询的相关性得分。

接下来是一些其他参数:

  1. adjust_pure_negative:这是一个布尔值,指示是否调整纯负面(不匹配)的查询得分。
  2. boost:这是整个查询的权重值。

然后是一些可选的参数:

  1. track_total_hits:这是一个整数值,用于指定要返回的总命中数。在这个示例中,设置为2147483647,表示返回所有命中的文档数。
  2. highlight:这是一个高亮对象,用于对匹配的字段进行突出显示。
  3. pre_tags:这是一个字符串数组,用于指定高亮文本的前置标签。
  4. post_tags:这是一个字符串数组,用于指定高亮文本的后置标签。
  5. fragment_size:这是一个整数值,用于指定每个高亮片段的最大长度。
  6. fields:这是一个字段对象,用于指定要高亮的字段及其类型。

总体而言,该DSL查询的目的是在”title.keyword”字段中精确匹配值为”测试文档3”的文档,并返回所有匹配的文档。同时,还会对”content”字段进行高亮处理。

mappings示例

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
{
"easyes_document": {
"mappings": {
"properties": {
"big_num": {
"type": "scaled_float",
"scaling_factor": 101.0
},
"case_test": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"comment_content": {
"type": "text",
"analyzer": "ik_smart"
},
"content": {
"type": "text",
"analyzer": "ik_smart"
},
"creator": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "ik_smart"
},
"english": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"filed_data": {
"type": "text",
"fielddata": true
},
"geo_location": {
"type": "geo_shape"
},
"gmt_create": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"ip_address": {
"type": "ip"
},
"join_field": {
"type": "join",
"eager_global_ordinals": true,
"relations": {
"document": "comment"
}
},
"location": {
"type": "geo_point"
},
"null_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"star_num": {
"type": "integer"
},
"sub_title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"users": {
"type": "nested",
"properties": {
"age": {
"type": "integer"
},
"faqs": {
"type": "nested",
"properties": {
"answer": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"faq_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"password": {
"type": "keyword"
},
"user_name": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
}
}
}

以上json信息是一个 Elasticsearch 索引的 Mapping 结构。Mapping 定义了索引中文档的字段和其属性。

以下是对该 Mapping 结构的解释:

  • “easyes_document” 是索引的名称。
  • “mappings” 是索引的 Mapping 部分。
  • “properties” 是索引中的字段定义部分。

具体字段的解释如下:

  • “big_num” 是一个 scaled_float 类型的字段,用于存储一个大数值。它使用了一个缩放因子为 101.0。
  • “case_test” 是一个 keyword 类型的字段,用于存储一个不分词的关键字。它使用了一个名为 “lowercase_normalizer” 的正规化器,将值统一转换为小写。
  • “comment_content” 和 “content” 是 text 类型的字段,用于存储文本内容。它们使用了 “ik_smart” 分析器,用于中文分词。
  • “creator” 是一个 text 类型的字段,它包含一个名为 “keyword” 的子字段,用于进行精确匹配。它使用了 “ik_smart” 分析器。
  • “english” 是一个 text 类型的字段,它包含一个名为 “keyword” 的子字段,用于进行精确匹配。
  • “filed_data” 是一个 text 类型的字段,用于进行字段数据(fielddata)分析。
  • “geo_location” 是一个 geo_shape 类型的字段,用于存储地理形状数据。
  • “gmt_create” 是一个 date 类型的字段,用于存储日期和时间。它使用了指定的日期格式。
  • “ip_address” 是一个 ip 类型的字段,用于存储 IP 地址。
  • “join_field” 是一个 join 类型的字段,用于实现父子关系。它指定了与 “document” 类型的 “comment” 关联。
  • “location” 是一个 geo_point 类型的字段,用于存储地理坐标点。
  • “null_field” 是一个 text 类型的字段,它包含一个名为 “keyword” 的子字段,用于进行精确匹配。
  • “star_num” 是一个 integer 类型的字段,用于存储整数值。
  • “sub_title”、”title” 和 “users” 都是 nested 类型的字段,用于存储嵌套的文档结构。
  • “users” 字段下有多个子字段,包括 “age”(integer 类型)、”faqs”(nested 类型)和 “user_name”(text 类型,使用 “ik_smart” 分析器)。
  • “faqs” 字段下有多个子字段,包括 “answer” 和 “faq_name”,它们都是 text 类型,包含一个名为 “keyword” 的子字段。

other

RefreshPolicy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Don't refresh after this request. The default.
*/
NONE("false"),
/**
* Force a refresh as part of this request. This refresh policy does not scale for high indexing or search throughput but is useful
* to present a consistent view to for indices with very low traffic. And it is wonderful for tests!
*/
IMMEDIATE("true"),
/**
* Leave this request open until a refresh has made the contents of this request visible to search. This refresh policy is
* compatible with high indexing and search throughput but it causes the request to wait to reply until a refresh occurs.
*/
WAIT_UNTIL("wait_for");

在Elasticsearch中,RefreshPolicy(刷新策略)用于控制索引的刷新行为。刷新是将索引中的写入操作(如索引、更新和删除)应用到搜索操作之前的过程。默认情况下,Elasticsearch会自动定期刷新索引,以确保最新的写入操作可立即被搜索到。

RefreshPolicy定义了何时以及如何执行索引的刷新操作。以下是一些常见的RefreshPolicy选项:

  1. RefreshPolicy.NONE:不执行刷新操作。这意味着写入操作将在内存中缓冲,直到发生显式刷新或达到自动刷新的条件。这是最高效的选项,但可能导致搜索结果不包含最新的写入操作。

  2. RefreshPolicy.IMMEDIATE:立即执行刷新操作。写入操作将立即应用到搜索操作之前,确保搜索结果包含最新的写入操作。这是最方便的选项,但可能会对性能产生一定影响。

  3. RefreshPolicy.WAIT_UNTIL:等待直到刷新操作完成。写入操作将被缓冲,直到刷新操作完成后再应用到搜索操作。这可以确保搜索结果包含最新的写入操作,并且在刷新完成前不会返回响应。这是一个比较保守的选项,适用于需要确保数据一致性的场景。

你可以根据具体需求选择适当的刷新策略。默认情况下,如果没有显式指定刷新策略,Elasticsearch会使用RefreshPolicy.AUTO,它会根据写入操作的频率和数据量来自动决定刷新时间点。

刷新策略在索引写入和搜索的一致性、性能和延迟之间提供了权衡。根据应用程序的需求,你可以选择不同的刷新策略来平衡这些因素。

DSL是什么?

在Elasticsearch中,DSL代表”Domain Specific Language”,即领域特定语言。DSL是一种用于构建结构化查询的语言,用于在Elasticsearch中定义搜索和分析操作。

Elasticsearch的查询DSL提供了一种灵活且强大的方式来构建各种查询。它使用JSON(JavaScript Object Notation)格式来表示查询和过滤条件,以及其他与搜索相关的操作。

使用DSL,你可以编写复杂的查询来搜索和过滤文档,执行聚合操作,进行分页和排序,以及执行其他与搜索相关的任务。DSL提供了许多不同类型的查询,例如全文搜索、精确匹配、范围查询、布尔查询等。

以下是一个示例,展示了使用DSL进行全文搜索的查询:

1
2
3
4
5
6
7
{
"query": {
"match": {
"title": "elasticsearch"
}
}
}

在上述示例中,我们使用DSL的match查询来搜索具有”title”字段中包含”elasticsearch”关键词的文档。

通过使用Elasticsearch的DSL,你可以以一种更结构化和可读性更高的方式定义查询和操作,而无需手动构建复杂的查询字符串。

References


ES 常用查询命令汇总
https://baymax55.github.io/2023/08/31/es/ES 常用查询命令汇总/
作者
baymax55
发布于
2023年8月31日
许可协议