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 float、scaled float
- 日期类型:date
- 布尔类型:boolean
- 二进制类型:binary
一、创建
创建一个索引
1 | PUT /索引名/类型名/文档id {请求体} |
查看索引信息
1 | GET /test2 |
_doc
是es 索引的默认类型,type 在未来的版本中会逐渐被弃用,因此产生一个默认类型进行代替
如果文档中字段类型没有被指定,那么es就会给默认配置字段类型
二、修改
使用 PUT 方式(不推荐方式)覆盖原来的值
版本+1(_version)
但是如果漏掉某个字段没有写,那么更新后没有写的字段会消失
1 | PUT /test3/_doc/1 |
- 使用 POST 方式
- 注意 json 请求中的 doc
- 不会丢失字段
1 | POST /test3/_doc/1/_update |
三、删除
1 | 删除索引 |
四、查询
简单条件,在所有文档中查询
1 | GET /test/_doc/_search?q=name:noahyzhang |
复杂查询
- 查询匹配
- match:匹配(会使用分词器解析(先分析文档,然后进行查询))
- _source:过滤字段,表示哪些字段返回
- sort:排序
- from、size:分页。from 从索引的那一个开始,size 返回多少条数据
1 | 查询 |
- 多条件查询(bool)
- must 相当于 and
- should 相当于 or
- must_not 相当于 not(… and …)
- filter 过滤,例如可以按范围 range 查找
1 | GET /blog/user/_search |
- 匹配数组
- 貌似不能和其他字段一起使用
- 可以多关键字查(空格隔开)
- match 会使用分词器解析(先分析文档,然后进行查询)
1 | GET /blog/user/_search |
精确匹配
- term 直接通过 倒排索引 指定词条进行精确查询。必须全部都有,而且不可分割,即按一个完整的词查询
- 适合查询 number、date、keyword,不适合 text
1
2
3
4
5
6
7
8GET /blog/user/_search
{
"query": {
"term": {
"name": "大"
}
}
}当以term方式查询字符串时,使用 analyze API 可以看到字符串被分成子字符串,且全部为小写(大写会转换成小写),丢失连字符和哈希符。因此可能找不到任何文档,因为它并不在倒排索引中,正如前面呈现出的分析结果,索引里有四个子字符串。
解决:创建索引时配置中文分词器(ik_max_word)、设置不分析字符串(这里还要再看下)
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"]
}