ES 是面向文档操作的。文档相当于数据库中的单行数据。命令行中加上
_doc(除查询所有文档命令)
PUT 索引名/_doc/文档ID {}
需要手动指定ID
_doc表示文档,即数据当索引不存在时,会自动创建索引
如果创建的文档数据已存在,会成为更新操作,因为有唯一的文档ID
// 需要手动指定ID;_doc表示文档,即数据
PUT test_index_2/_doc/1003
{
"name": "test3",
"age": 23
}


POST 索引名/_doc/文档ID(可有可无) {}
可以不指定文档ID,会自动生成文档ID
可以指定文档ID
当索引不存在时,会自动创建索引
不指定文档ID,重复创建时,每次都是新建,会产生新数据
指定文档ID,重复创建时,成为更新操作
// 不指定文档ID;会自动创建文档ID
POST test_index_4/_doc
{
"name": "test3",
"age": 23
}



// 指定文档ID
POST test_index_4/_doc/1010
{
"name": "test3",
"age": 23
}


| 区别 | PUT | POST |
|---|---|---|
| 文档ID | 需要手动指定 | 可以手动指定; 可以省略(自动创建) |
| 索引不存在时 | 自动创建索引 | 自动创建索引 |
| 指定文档ID,重复创建 | 更新操作 | 更新操作 |
| 不指定文档ID,重复创建 | — 不可以 — | 创建操作,产生新数据 |
GET 索引名称/_doc/文档ID
GET test_index_3/_doc/1004

GET | POST 索引名称/_search
可以使用
GET或POST索引名称后面加
_search,不需要_doc
GET test_index_3/_search
POST test_index_3/_search

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": "男"
}
DELETE 索引名称/_doc/文档ID
- 必须指定文档ID
DELETE test_index_3/_doc/1004


可以使用
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 |
分词匹配
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"
}
}
}


完全匹配
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"
}
}
}
}

match_all不需要指定条件
GET test_index/_search
{
"query": {
"match_all": {}
}
}
"_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"]
}

类似于
or;有一个条件满足即可
GET test_index/_search
{
"query": {
// 布尔 boolean
"bool": {
// 条件集
"should": [
// 条件1:名字中含有 si
{
"match": {
"name": "si"
}
},
// 条件2:年龄是 28
{
"term": {
"age": 28
}
}
]
}
}
}

POST test_index/_search
{
// 分词匹配;名字中含有 zhang 或 si 的都可以
"query": {
"match": {
"name": "zhang si"
}
},
// 按年龄倒序排列
"sort": [
{
"age": {
"order": "desc"
}
}
]
}

POST test_index/_search
{
"query": {
"match": {
"name": "zhang si"
}
},
// 起始文档序号;从0开始;
// 起始文档序号 = (页码 -1) * 页面文档数size
"from": 0,
// 页面文档数
"size": 2
}

GET、POST都可以
增加新数据
| id | name | age |
|---|---|---|
| 1012 | zhang san 456 | 25 |
| 1013 | li si 456 | 25 |
按年龄分组搜索,查询每个年龄的人数
GET test_index/_search
{
"aggs": { // 聚合查询
”ageGroup“: { // 查询结果名称
"terms": {
"field": "age" // age字段
}
}
}
}

"size": 0

按年龄分组,再求出该组中的年龄之和
GET test_index/_search
{
"aggs": {
"ageGroup": {
"terms": {
"field": "age"
},
"aggs": {
"ageSum": {
"sum": {
"field": "age"
}
}
}
}
},
"size": 0
}

GET test_index/_search
{
"aggs": { // 聚合查询
"avgAge": { // 查询结果名称
"avg": { // avg 表示求平均值
"field": "age"
}
}
},
"size": 0 // 只要聚合结果,不要具体文档数据
}

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 // 只要聚合结果,不要具体文档数据
}
