undefined

ES的基本操作

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 查询所有数据

字段数据类型

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

一、创建

创建一个索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# PUT /索引名/类型名/文档id {请求体}
PUT /test1/type1/1
{
"name": "noahyzhang",
"age": 3
}
# 创建索引(指定字段类型)
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birhday": {
"type": "date"
}
}
}
}

查看索引信息

1
GET /test2

_doc 是es 索引的默认类型,type 在未来的版本中会逐渐被弃用,因此产生一个默认类型进行代替

如果文档中字段类型没有被指定,那么es就会给默认配置字段类型

二、修改

  1. 使用 PUT 方式(不推荐方式)覆盖原来的值

    • 版本+1(_version)

    • 但是如果漏掉某个字段没有写,那么更新后没有写的字段会消失

1
2
3
4
5
6
7
8
9
10
PUT /test3/_doc/1
{
"name": "hello",
"age": 18
}
# 修改文档1,只写了name字段,会导致更新后 age 字段丢失
PUT /test3/_doc/1
{
"name": "world"
}
  1. 使用 POST 方式
    • 注意 json 请求中的 doc
    • 不会丢失字段
1
2
3
4
5
6
POST /test3/_doc/1/_update
{
"doc": {
"name": "post修改"
}
}

三、删除

1
2
# 删除索引
delete /test1

四、查询

简单条件,在所有文档中查询

1
2
GET /test/_doc/_search?q=name:noahyzhang
GET /test/_search?q=name:noahyzhang

复杂查询

  1. 查询匹配
    • match:匹配(会使用分词器解析(先分析文档,然后进行查询))
    • _source:过滤字段,表示哪些字段返回
    • sort:排序
    • from、size:分页。from 从索引的那一个开始,size 返回多少条数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查询
GET /blog/user/_search
{
"query": {
"match": {
"name": "张意"
}
},
"_source": ["age", "name"],
"sort": [{
"age": {
"order": "desc"
}
}],
"from": 0,
"size": 2
}
  1. 多条件查询(bool)
    • must 相当于 and
    • should 相当于 or
    • must_not 相当于 not(… and …)
    • filter 过滤,例如可以按范围 range 查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
GET /blog/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 1,
"lte": 20
}
}
}
]
}
}
}
  1. 匹配数组
    • 貌似不能和其他字段一起使用
    • 可以多关键字查(空格隔开)
    • match 会使用分词器解析(先分析文档,然后进行查询)
1
2
3
4
5
6
7
8
GET /blog/user/_search
{
"query": {
"match": {
"name": "好 大"
}
}
}
  1. 精确匹配

    • term 直接通过 倒排索引 指定词条进行精确查询。必须全部都有,而且不可分割,即按一个完整的词查询
    • 适合查询 number、date、keyword,不适合 text
    1
    2
    3
    4
    5
    6
    7
    8
    GET /blog/user/_search
    {
    "query": {
    "term": {
    "name": "大"
    }
    }
    }

    当以term方式查询字符串时,使用 analyze API 可以看到字符串被分成子字符串,且全部为小写(大写会转换成小写),丢失连字符和哈希符。因此可能找不到任何文档,因为它并不在倒排索引中,正如前面呈现出的分析结果,索引里有四个子字符串。

    解决:创建索引时配置中文分词器(ik_max_word)、设置不分析字符串(这里还要再看下)

  2. 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
    # 创建索引
    PUT /test1
    {
    "mappings": {
    "properties": {
    "text": {
    "type": "text"
    },
    "keyword": {
    "type": "keyword"
    }
    }
    }
    }
    # 插入数据
    PUT /test1/_doc/1
    {
    "text": "测试keyword和text是否支持分词",
    "keyword": "测试keyword和text是否支持分词"
    }
    # 可以查询的到,text 支持分词
    GET /test1/_doc/_search
    {
    "query": {
    "match": {
    "text": "测试"
    }
    },
    "_source": ["text"]
    }
    # 不能查询到,keyword 不支持分词
    GET /test1/_doc/_search
    {
    "query": {
    "match": {
    "keyword": "测试"
    }
    },
    "_source": ["keyword"]
    }
    # 不会分词,即 测试nihao
    GET _analyze
    {
    "analyzer": "keyword",
    "text": ["测试nihao"]
    }
    # 会分词,即 测 试 nihao
    GET _analyze
    {
    "analyzer": "standard",
    "text": ["测试nihao"]
    }