01-ElasticSearch Rest 方式使用

Rest风格说明

Rest 是一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制。

基本Rest命令说明

method url地址 描述
PUT(创建,修改) localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST(创建) localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST(修改) localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE(删除) localhost:9200/索引名称/类型名称/文档id 删除文档
GET(查询) localhost:9200/索引名称/类型名称/文档id 查询文档通过文档ID
POST(查询) localhost:9200/索引名称/类型名称/文档id/_search 查询所有数据

测试

1、创建一个索引

1
2
3
4
5
PUT /test1/type1/1
{
"name" : "流柚",
"age" : 18
}

2、字段数据类型

  • 字符串类型
    • text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储;
    • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
  • 数值型
    • long、Integer、short、byte、double、float、half floatscaled float
  • 日期类型
    • date
  • te布尔类型
    • boolean
  • 二进制类型
    • binary
  • 等等…

3、指定字段的类型(使用PUT)

类似于建库(建立索引和字段对应类型),也可看做规则的建立

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT /test2

{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}

4、获取3建立的规则

1
GET test2

5、获取默认信息

_doc 默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替

如果自己的文档字段没有被指定,那么ElasticSearch就会给我们默认配置字段类型

扩展:通过get _cat/ 可以获取ElasticSearch的当前的很多信息!

  1. GET _cat/indices
  2. GET _cat/aliases
  3. GET _cat/allocation
  4. GET _cat/count
  5. GET _cat/fielddata
  6. GET _cat/health :查看健康度
  7. GET _cat/indices
  8. GET _cat/master
  9. GET _cat/nodeattrs
  10. GET _cat/nodes
  11. GET _cat/pending_tasks
  12. GET _cat/plugins
  13. GET _cat/recovery
  14. GET _cat/repositories
  15. GET _cat/segments
  16. GET _cat/shards
  17. GET _cat/snapshots
  18. GET _cat/tasks
  19. GET _cat/templates
  20. GET _cat/thread_pool

6、修改

修改一共有两种方案

6.1 旧的(使用put覆盖原来的值)

注意:

  • 版本+1(_version)
  • 但是如果漏掉某个字段没有写,那么更新是没有写的字段会消失
1
2
3
4
5
6
7
8
9
10
11
12
13
PUT /test3/_doc/1

{
"name":"joe123",
"age":13,
"birth":"1997-01-01"
}

// 如果漏掉某个字段没有写,那么更新是没有写的字段会消失
PUT /test3/_doc/1
{
"name":"流柚",
}

6.2 新的(使用post的_update)

注意:

  • version不会改变
  • 需要注意doc
  • 不会丢失字段
1
2
3
4
5
6
7
POST /test3/_doc/1/_update
{
"doc":{
"name" : "post修改,version不会加一"
"age" : 2
}
}

7、删除索引

DELETE /test1

8、查询(简单条件)

1
GET /test3/_doc/_search?q=name:流柚

9、复杂查询

test3索引中的内容

9.1 查询匹配

  • match:匹配(会使用分词器解析(先分析文档,然后进行查询))
  • _source:过滤字段
  • sort:排序
  • formsize 分页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 查询匹配
GET /blog/user/_search
{
"query":{
"match":{
" name":"流"
}
},
"_source": ["name""desc"],
"sort": [
{
"age": {
"order": "asc"`
}
}
],
"from": 0
"size": 1
}

9.2 多条件查询(bool)

  • must 相当于 and,所有条件都要符合
  • should 相当于 or,只要符合一个就可以
  • must_not 相当于 not (... and ...)
  • filter 过滤
    • gt:大于
    • gte:大于等于
    • lt:小于
    • lte:小于等于
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
GET _search

{
"query": {
"bool": {
"must": [
{
"match": {
"age": "3"
}},
{
"match": {
"name": "牛"
}}
]
"filter":{
"range": {
age":{
"gte": 1,
lte": 3`
}
}
}
}
}
}

9.3 匹配数组

  • 貌似不能与其它字段一起使用
  • 可以多关键字查(空格隔开)— 匹配字段也是符合的
  • match 会使用分词器解析(先分析文档,然后进行查询)
1
2
3
4
5
6
7
8
GET /blog/user/_search
{
"query": {
"match": {
"desc": "年龄 牛 大"
}
}
}

9.4 精确查询

  • 精确查询(必须全部都有,而且不可分,即按一个完整的词查询)

  • term查询是直接通过倒排索引指定的词条进程精确的查找的。

    • term:直接取精确的
    • match:会使用分词器解析。先分析文档,然后再通过分析的文档进行查询。
  • 两个类型:text,keyword

    • keyword不会被分词器解析,text会被分词器解析
1
2
3
4
5
6
7
8
GET /blog/user/_search
{
"query":{
"term":{
"desc":"年 "
}
}
}

9.5 text和keyword

  • text:
    • 支持分词全文检索、支持模糊、精确查询,不支持聚合,排序操作;
    • text类型的最大支持的字符长度无限制,适合大字段存储;
  • keyword:
    • 不进行分词直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
    • keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果
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
// 测试keyword和text是否支持分词
// 设置索引类型
PUT /test
{
"mappings": {
"properties": {
"text":{
"type":"text"
},
"keyword":{
"type":"keyword"
}
}
}
}
// 设置字段数据
PUT /test/_doc/1
{
"text":"测试keyword和text是否支持分词",
"keyword":"测试keyword和text是否支持分词"
}
// text 支持分词
// keyword 不支持分词
GET /test/_doc/_search
{
"query":{
"match":{
"text":"测试"
}
}
}// 查的到
GET /test/_doc/_search
{
"query":{
"match":{
"keyword":"测试"
}
}
}// 查不到,必须是 "测试keyword和text是否支持分词" 才能查到
GET _analyze
{
"analyzer": "keyword",
"text": ["测试liu"]
}// 不会分词,即 测试liu
GET _analyze
{
"analyzer": "standard",
"text": ["测试liu"]
}// 分为 测 试 liu
GET _analyze
{
"analyzer":"ik_max_word",
"text": ["测试liu"]
}// 分为 测试 liu

9.6 高亮查询

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
/// 高亮查询
GET blog/user/_search
{
"query": {
"match": {
"name":"流"
}
}
,
"highlight": {
"fields": {
"name": {}
}
}
}
// 自定义前缀和后缀
GET blog/user/_search
{
"query": {
"match": {
"name":"流"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}


01-ElasticSearch Rest 方式使用
https://flepeng.github.io/041-ElasticSearch-31-语法-01-ElasticSearch-Rest-方式使用/
作者
Lepeng
发布于
2022年3月2日
许可协议