elasticsearch 笔记

记录下ES的常用操作,方便查看。

painless

ES 使用的是 painless 语言。

更新数组

1
2


索引操作

删除单个索引

1
DELETE /index_name

删除所有索引

1
2
3
# 两张选其一即可
DELETE /_all
DELETE /*

索引复制

1
2
3
4
5
6
7
8
9
10
POST /_reindex?wait_for_completion=false

{
"source": {
"index": "source_index"
},
"dest": {
"index": "target_index"
}
}

文档操作

删除单个文档

1
DELETE /index/_doc/id

文档重建

1
2
3
4
5
6
PUT /index/type/id

{
"ip": "10.10.10.10",
"name": "lina"
}

显示版本信息

ES文档都一个_version的计数器,用来记录文档的变更情况。需要注意的是ES并没有保存历史文档,_version只是一个计数器。需要查看version, 增加查询参数: version=true

查询

根据 _id查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"query": {
"bool": {
"must": [
{
"terms": {
"_id": [
"12345678",
"12345679"
]
}
}
]
}
}
}

指定时间范围,这里的 date 是文档中的字段

1
2
3
4
5
6
7
8
9
10
{
"query": {
"range" : {
"date" : {
"gte" : "2019-05-01T00:00:00",
"lte" : "2019-05-01T23:59:59"
}
}
}
}

数组匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 这里 hosts 是一个数组类型
{
"query": {
"bool": {
"should": {
"term": {
"hosts": {
"value": "www.test.gov.cn"
}
}
}
}
}
}

bool 查询

Bool 查询结构如下:

1
2
3
4
5
6
7
8
{
"query": {
"bool": {
"must": [],
"should": []
}
}
}

其中 must 对应 AND 操作, should 对应 should操作。需要注意的是,在有 filtermust时,should的值不会影响的搜索结构。如果需要 mustshould 同时满足,可以使用 minimum_should_match字段:

1
2
3
4
5
6
7
8
9
{
"query": {
"bool": {
"minimum_should_match": 1,
"must": [],
"should": []
}
}
}

查询聚合

text 类型的字段默认不支持聚合,可以使用如下方式(在 field 名字后面加上 .keyword):

1
2
3
4
5
6
7
8
{
"size": 0,
"aggs" : {
"patterns" : {
"terms" : { "field" : "pattern.keyword" }
}
}
})

聚合排序

使用自己的 key 排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"aggregations": {
"startcount": {
"terms": {
"field": "startat",
"script": "round(_value/1000)",
"size": 1000,
"order": {
"_term": "asc"
}
}
}
}
}

常用统计

  • 去重统计

    cardinality 是基于HyperLogLog++(HLL)一个近似算法,可以通过 precision_threshold来控制精度,precision_threshold接受 0–40,000 之间的数字。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "aggs": {
    "attacker_sum": {
    "cardinality": {
    "field": "attacker_id",
    "precision_threshold": 1000000
    }
    }
    }
    }