0%

【ElasticSearch】ES使用

ES使用


1 ES结构和索引

1.1 ES结构

  • 方便理解,可以将ES类比为数据库进行理解

  • Types的概念逐渐弱化,于6.x版本,一个index只允许一个type。于7.x版本之后,已将type概念删除


1.2 倒排索引

  • 正排索引:就是我们数据库中的数据结构,通过id去关联对应的数据
  • 倒排索引:则是通过数据的关键词,去关联对应的id

2 索引(index)使用

ES演示示例,都是通过发送请求来实现,可以用postman来进行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建索引
url:http://localhost:9200/(index名)
method: PUT

---

# 指定查询索引
url: http://localhost:9200/(index名)
method: GET

# 查询所有索引
url: http://localhost:9200/_cat/indices?v
method: GET

---

# 删除指定索引
url: http://localhost:9200/(index名)
method: DELETE

3 文档(document)使用

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
# 创建文档
url: http://localhost:9200/(index名)/_doc
method: post
body: {json数据}

# 创建指定id文档(两种url都可以)
url1: http://localhost:9200/(index名)/_doc/(id值)
url2: http://localhost:9200/(index名)/_create/(id值)
method: PUT/POST
body: {json数据}

---

# 查询指定id文档
url: http://localhost:9200/(index名)/_doc/(文档id)
method: GET

# 查询全部文档
url: http://localhost:9200/(index名)/_search
method: GET

---

# 全部更新文档
url: http://localhost:9200/(index名)/_doc/(文档id)
method: PUT
body: {json数据}

# 部分更新文档
url: http://localhost:9200/(index名)/_update/(文档id)
method: POST
body: {"doc": {json数据}}

---

# 删除文档
url: http://localhost:9200/(index名)/_doc/(文档id)
method: DELETE

4 文档进阶查询

1
2
3
url: http://localhost:9200/(index名)/_search
method: GET
body: {json数据}
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
// 示例json数据
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2,
"_source": ["name"],
"sort": {
"age": {
"order": "desc"
}
},
"highlight": {
"fields": {
"name": {}
}
},
"aggs": {
"count": {
"term": {
"field": "age"
}
}
}
}
  • 文档进阶查询主要在请求body上进行处理

4.1 where条件查询

1
2
3
4
5
{
"query": {
xxxx条件
}
}
  • (1)全文检索匹配条件

  • 当查询条件为字符串时,会进行分词查询,也就是将字符串值拆分,一个个去匹配

  • 非字符串时,就是普通的eq匹配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "match": {
    "字段名": "值"
    }

    // 全部匹配(无需参数)
    "match_all": {}

    // 精确匹配(不进行分词)
    "match_phrase": {
    "字段名": "值"
    }
  • (2)and查询

  • 类似sql的where 条件1 and 条件2

    1
    2
    3
    4
    5
    6
    "bool": {
    "must": [
    "match": {},
    "match": {}
    ]
    }
  • (3)or查询

  • 类似sql的where 条件1 or 条件2

    1
    2
    3
    4
    5
    6
    "bool": {
    "should": {
    "match": {},
    "match": {}
    }
    }
  • (4)过滤范围

  • 类似sql的不等于,但不作为匹配条件,用于数据最后过滤

  • gt=大于,lt=小于 不支持ge,le,eq,要等于就在查询条件match拼接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    "bool": {
    "filter": {
    "range": {
    "字段名": {
    "gt": "值"
    }
    }
    }
    }

4.2 分页查询

  • 使用起来类似sql的limit 0, 1
    1
    2
    "from": 起始位置(从0开始)
    "size": 数据大小

4.3 查询指定字段

  • 类似sql的select xx, xx
    1
    "_source": ["字段名1", "字段名2"]

4.4 排序

  • 类似sql的order by xxx asc/desc
    1
    2
    3
    4
    5
    "sort": {
    "字段名": {
    "order": "asc/desc"
    }
    }

4.5 聚合函数

  • 类似sql的select count(xx) from xxx group by xx
  • 聚合函数:term类似sql的count统计个数,sum求和,avg求平均值
    1
    2
    3
    4
    5
    6
    7
    "aggs": {
    "xxxx": { // 变量名,可以随意起
    "聚合函数": {
    "field": "字段名"
    }
    }
    }

4.6 查询结果高亮

1
2
3
4
5
"highlight": {
"fields": {
"字段名": {}
}
}

5 映射

  • 映射类似于mysql中的表结构,来规定表中的数据结构
  • type:为字段类型,text表示支持分词查询,password不知分词查询
  • index:是否允许索引,即是否可以充当查询条件
    1
    2
    3
    4
    5
    6
    "properties": {
    "字段名": {
    "type": "text/password",
    "index": true/false
    }
    }
1
2
3
4
5
6
7
8
9
10
# 创建映射
url: http://localhost:9200/(index名)_mapping
method: PUT
body: {properties数据}

---

# 查询映射
url: http://localhost:9200/(index名)_mapping
method: GET