1、文档基础操作
ES 是面向文档操作的。文档相当于数据库中的单行数据。命令行中加上
_doc
(除查询所有文档命令)
1.1、PUT POST创建文档
1.1.1、PUT 创建文档
PUT 索引名/_doc/文档ID {}
需要手动指定ID
_doc
表示文档,即数据当索引不存在时,会自动创建索引
如果创建的文档数据已存在,会成为更新操作,因为有唯一的文档ID
// 需要手动指定ID;_doc表示文档,即数据
PUT test_index_2/_doc/1003
{
"name": "test3",
"age": 23
}
1.1.2、POST 创建文档
POST 索引名/_doc/文档ID(可有可无) {}
可以不指定文档ID,会自动生成文档ID
可以指定文档ID
当索引不存在时,会自动创建索引
不指定文档ID,重复创建时,每次都是新建,会产生新数据
指定文档ID,重复创建时,成为更新操作
- 不指定文档ID(自动生成随机文档ID)
// 不指定文档ID;会自动创建文档ID
POST test_index_4/_doc
{
"name": "test3",
"age": 23
}
- 指定文档ID;与 PUT 操作一致
// 指定文档ID
POST test_index_4/_doc/1010
{
"name": "test3",
"age": 23
}
1.1.3、区别
区别 | PUT | POST |
---|---|---|
文档ID | 需要手动指定 | 可以手动指定; 可以省略(自动创建) |
索引不存在时 | 自动创建索引 | 自动创建索引 |
指定文档ID,重复创建 | 更新操作 | 更新操作 |
不指定文档ID,重复创建 | — 不可以 — | 创建操作,产生新数据 |
1.2、GET 查询文档
1.2.1、查询特定文档
GET 索引名称/_doc/文档ID
GET test_index_3/_doc/1004
1.2.2、查询所有文档
GET | POST 索引名称/_search
可以使用
GET
或POST
索引名称后面加
_search
,不需要_doc
GET test_index_3/_search
POST test_index_3/_search
1.3、PUT POST修改文档
PUT | POST 索引名称/_doc/文档ID
可以使用
PUT
或POST
必须指定文档ID
更新时可以为文档添加新的属性字段
如果当前ID的文档不存在,就是创建操作
// 如果当前ID的文档不存在,就是创建操作
PUT test_index_3/_doc/1004
{
"name": "test3",
"age": 23
}
// 更新时添加新的字段 sex
POST test_index_3/_doc/1004
{
"name": "test3",
"age": 23,
"sex": "男"
}
1.4、DELETE 删除文档
DELETE 索引名称/_doc/文档ID
- 必须指定文档ID
DELETE test_index_3/_doc/1004
2、文档高级搜索
可以使用
GET
或POST
准备数据:
id | name | age |
---|---|---|
1004 | zhang san | 24 |
1005 | zhangsan | 25 |
1006 | li si | 26 |
1007 | lisi | 27 |
1008 | zhang san 123 | 28 |
1009 | li si 123 | 29 |
1010 | zhang ming | 30 |
1011 | liu san | 31 |
2.1、分词匹配搜索
分词匹配
match
名字name中包含
zhang
或san
的都可以查出来其中
zhangsan
不能匹配zhang
或san
,因为zhangsan
、zhang
、san
是三个不同的关键字,所以1005
文档查不出来
// 可以使用 GET 或 POST
// 分词匹配;名字name中包含 zhang 或 san 的都可以查出来
Get test_index/_search
{
"query": {
"match": {
"name": "zhang san"
}
}
}
2.2、完全匹配搜索
完全匹配
term
名字name中包含
zhang san
的才可以查出来;zhang san
是一个整体
;虽然有名字为
zhang san
的文档,但该文档保存时,是以分词的形式,即zhang
和san
是分开的,所以作为整体是查不到的
// 完全匹配;名字name中包含 `zhang san` 的才可以查出来
// `zhang san` 是一个整体
Get test_index/_search
{
"query": {
"term": {
"name": {
"value": "zhang san"
}
}
}
}
// 关键字 zhangsan,是一个整体,中间无空格
POST test_index/_search
{
"query": {
"term": {
"name": {
"value": "zhangsan"
}
}
}
}
2.3、搜索全部数据
match_all
不需要指定条件
GET test_index/_search
{
"query": {
"match_all": {}
}
}
2.4、指定字段搜索
"_source": ["字段名1","字段名2"]
GET test_index/_search
{
"query": {
"match": {
"name": "zhang li"
}
},
"_source": ["name"]
}
POST test_index/_search
{
"query": {
"term": {
"name": {
"value": "zhang"
}
}
},
"_source": ["name","age"]
}
2.5、多条件搜索
类似于
or
;有一个条件满足即可
GET test_index/_search
{
"query": {
// 布尔 boolean
"bool": {
// 条件集
"should": [
// 条件1:名字中含有 si
{
"match": {
"name": "si"
}
},
// 条件2:年龄是 28
{
"term": {
"age": 28
}
}
]
}
}
}
2.6、排序搜索
POST test_index/_search
{
// 分词匹配;名字中含有 zhang 或 si 的都可以
"query": {
"match": {
"name": "zhang si"
}
},
// 按年龄倒序排列
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
2.7、分页搜索
POST test_index/_search
{
"query": {
"match": {
"name": "zhang si"
}
},
// 起始文档序号;从0开始;
// 起始文档序号 = (页码 -1) * 页面文档数size
"from": 0,
// 页面文档数
"size": 2
}
3、文档聚合搜索
GET
、POST
都可以
增加新数据
id | name | age |
---|---|---|
1012 | zhang san 456 | 25 |
1013 | li si 456 | 25 |
3.1、分组搜索
按年龄分组搜索,查询每个年龄的人数
GET test_index/_search
{
"aggs": { // 聚合查询
”ageGroup“: { // 查询结果名称
"terms": {
"field": "age" // age字段
}
}
}
}
"size": 0
3.2、求和
按年龄分组,再求出该组中的年龄之和
GET test_index/_search
{
"aggs": {
"ageGroup": {
"terms": {
"field": "age"
},
"aggs": {
"ageSum": {
"sum": {
"field": "age"
}
}
}
}
},
"size": 0
}
3.3、平均值
GET test_index/_search
{
"aggs": { // 聚合查询
"avgAge": { // 查询结果名称
"avg": { // avg 表示求平均值
"field": "age"
}
}
},
"size": 0 // 只要聚合结果,不要具体文档数据
}
3.4、查前几个
GET test_index/_search
{
"aggs": {
"top2": { // 查询结果名称
"top_hits": { // 查前几个
"size": 2
}
}
},
"size": 0
}
- 指定字段、排序
GET test_index/_search
{
"aggs": {
"top2": {
"top_hits": {
"_source": ["name"], // 只显示 name
"sort": [
{
"age": {
"order": "desc" // 按年龄倒序排列
}
}
],
"size": 2 // 查前2个
}
}
},
"size": 0 // 只要聚合结果,不要具体文档数据
}