0%

elasticsearch基本操作

elasticsearch基本操作

基于6.8.x版本

统计操作

计算集群中的文档数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET _count?pretty
{
"query":{
"match_all": {}
}
}


{
"count": 5091327,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
}
}

添加数据

video为索引名,default为类型名,1为文档id,如果没有索引,会自动根据文档字段来创建索引

1
2
3
4
5
6
7
8
9
PUT video/default/1

{
"keywords": "探索 战争 红色",
"doc_title": "保卫战",
"doc_id": "ff22e9ff5d65b198e3967226a7b13a73",
"number": 25,
"age": ["0-8","9-18","18-40","40-60"]
}

如果文档已存在,该操作会变为更新,更新之后_version会加一

指定新增

有时候为了确保是添加数据,会使用_create来表示该操作为新增数据

1
2
3
PUT video/default/4/_create

// 如果创建成功,会返回响应码201,如果该文档已存在,会返回响应码409

指定版本修改

1
2
3
PUT video/default/1?version=2

// 只有当前版本与所传入版本相同时才会更新成果,否则会返回响应码409

更新数据

1
POST video/default/1

该操作会覆盖掉对应文档的全部内容

局部更新

有时候可能只传入修改的字段,而没有改动的不传入,或者是新增一个新的字段,此时并不想在请求体总中把所有字段都传过去,可以使用局部更新

1
2
3
4
5
6
7
POST video/default/1/_update

{
"doc": { // 一定要有doc
"duration": 214
}
}

查询

全部数据

查询全部数据,包含所有索引,默认10条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GET _search


{
"took": 116, // 查询花费的时间
"timed_out": false,
"_shards": { // 参与查询的分片数
"total": 20,
"successful": 20,
"skipped": 0,
"failed": 0
},
"hits": { // 其内包含匹配到的数据
"total": 89753307, // 匹配到的文档总数
"max_score": 1.0,
"hits": [
{
// 数据
}
]
}
}

按照索引查询

1
2
3
4
5
6
7
8
// 单索引查询
GET index1/_search
// 多索引查询,用逗号隔开
GET index1,index2/_search
// 通配符
GET dws*/_search
// 所有索引
GET _all/_search

按类型查询

1
2
3
4
5
6
7
8
// 单索引类型查询
GET index1/default/_search
// 多索引类型查询,用逗号隔开
GET index1,index2/default/_search
// 通配符
GET dws*/default/_search
// 所有索引
GET _all/default/_search

根据文档id查询

查询到的数据原始json在_source字段中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GET video/default/1

{
"_index": "video",
"_type": "default",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"keywords": "探索 战争 红色",
"doc_title": "保卫战",
"doc_id": "ff22e9ff5d65b198e3967226a7b13a73",
"number": 25,
"age": [
"0-8",
"9-18",
"18-40",
"40-60"
]
}
}

部分字段

根据上一个查询可以看出,其实返回的很多数据对于页面来说是没有必要的,为了减少网络传播,可以只返回_source字段值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET video/default/1/_source

{
"keywords": "探索 战争 红色",
"doc_title": "保卫战",
"doc_id": "ff22e9ff5d65b198e3967226a7b13a73",
"number": 25,
"age": [
"0-8",
"9-18",
"18-40",
"40-60"
]
}

有时候也会只需要显示部分字段

1
2
3
4
5
6
GET video/default/1/_source?_source=keywords,doc_title

{
"keywords": "探索 战争 红色",
"doc_title": "保卫战"
}

检查文档是否存在

有时候并不需要返回对应的文档内容,只是想确定一下文档是否存在

1
HEAD video/default/1

如果存在的话结果只会返回响应码200,如果不存在则会返回响应码404

搜索该类型下所有数据

默认情况下是返回前10条结果

1
GET video/default/_search

match标准查询

match查询是一个标准查询,不管是全文本查询还是精确查询都可以使用

1
2
// keywords中包含 "战争"的数据 条件放入q参数下
GET video/default/_search?q=keywords:战争

当然也可以使用DSL查询,将查询条件放入json请求体中,match查询接受text/numerics/date类型的字段

1
2
3
4
5
6
7
8
9
GET video/default/_search
{
"query": {
"match": {
"keywords": "战争" // 只要包含其中的一个字就可以匹配到
}
}
}

如果想要查询所有可以使用match_all

1
2
3
4
5
{
"query":{
"match_all":{}
}
}

默认情况下是按照相关性进行排序的

match_phrase短语查询

短语查询分析文本,默认情况下使用字段映射时定义的分析器

1
2
3
4
5
6
7
{
"query": {
"match_phrase" : {
"message" : "this is a test"
}
}
}

也可以使用自定义的分析器

1
2
3
4
5
6
7
8
9
10
{
"query": {
"match_phrase" : {
"message" : {
"query" : "this is a test",
"analyzer" : "my_analyzer"
}
}
}
}

match_phrase_prefix短语前缀匹配

短语前缀匹配

1
2
3
4
5
6
7
{
"query": {
"match_phrase_prefix" : {
"message" : "quick brown f"
}
}
}

multi_match多字段查询

多字段查询

1
2
3
4
5
6
7
8
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "subject", "message" ]
}
}
}

其执行方式取决于type的设置,默认使用best_fields

  • best_fields 查找匹配任何字段的文档,但是使用最佳匹配字段的_score
  • most_fields 查找匹配任何字段的文档,结合每个字段的_score
  • cross_fields 用相同的分析器处理字段,把这些字段当做一个大字段,查找任何字段的每个单词
  • phrase 每个字段上运行短语匹配查询,结合每个字段的_score
  • phrase_prefix 在每个字段上运行短语前缀查询,结合每个字段的_score

term精确匹配

term用于数字、日期、布尔或not_analyzed的字符串

1
2
3
4
5
6
7
{
"query": {
"term":{
"doc_id":"ff"
}
}
}

range范围

1
2
3
4
5
6
7
8
9
10
11
12
{
"query":{
"range":{
"age":{
"gte":20, // 大于等于
"gt":20,//大于
"lte":40,//小于等于
"lt":40 // 小于
}
}
}
}

是否存在某字段

如果文档中存在某字段则会将对应的文档返回回来

1
2
3
4
5
6
7
{
"query": {
"exists": {
"field": "tag"
}
}
}

前缀查询

1
2
3
4
{ "query": {
"prefix" : { "user" : "ki" }
}
}

通配符查询

通配符*表示任意字符,通配符?表示任意单个字符

1
2
3
4
5
6
7
8
9
10
11
{
"query": {
"wildcard": {
"user": {
"value": "ki*y",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}

模糊查询

1
2
3
4
5
{
"query": {
"fuzzy" : { "user" : "ki" }
}
}

高亮显示

1
2
3
4
5
6
7
8
9
10
11
12
13
GET video/default/_search
{
"query": {
"match_phrase": {
"keywords": "战争"
}
},
"highlight": {
"fields": {
"keywords": {}
}
}
}

搜索结果中会将对应字段中的文本来使用标识匹配到的单词

多文档查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET _mget

{
"docs": [
{
"_index": "video",
"_type": "default",
"_id": 1
},
{
"_index": "book",
"_type": "default",
"_id": 2
}
]
}

// 要指定_index、_type、_id

如果查的是同一个索引的多条记录,可以在地址栏指定索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET video/default/_mget

{
"docs": [
{
"_id": 1
},
{
"_id": 2
}
]
}

// 或者使用更简单的
{
"ids": [
1,
2
]
}

分页查询

size是条数,from是跳过的条数

1
GET _search?size=2&from=100

或者使用dsl请求

1
2
3
4
5
6
GET _search

{
"size":2,
"from":100
}

聚合

删除操作

删除索引

1
DELETE index1

删除文档

1
DELETE video/default/4

批量操作

可以使用bulk操作来使用单一请求实现多个文档的增删改,格式如下

1
2
3
4
5
6
{action: {data}}\n
{request body}\n
{action: {data}}\n
{request body}\n

// 每行数据必须以\n结尾,包括最后一行,每行数据都不能包含未被转义的换行符

action有四种

  • create 当文档不存在时创建
  • index 创建新文档或替换已存在的文档
  • update 局部更新文档
  • delete 删除一个文档
1
2
3
4
5
6
7
8
9
10
11
12
13
POST _bulk

{"create":{"_index":"book","_type":"default","_id":12}}
{"title":"三国演义","price":32}
{"delete":{"_index":"video","_type":"default","_id":3}}
{"update":{"_index":"video","_type":"default","_id":2}}
{"doc":{"duration":1429}}
{"index":{"_index":"book","_type":"default"}}
{"title":"红楼梦","price":78}


// delete操作没有请求体
// 每一个操作都是独立的,并不会互相影响

排序

1
2
3
4
5
6
7
{
"sort": {
"duration": { // 按时长排序
"order": "asc"
}
}
}