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
}
}

查询更新

1
2
3
4
5
6
7
8
9
10
POST video/default/_update_by_query

{
"doc": {
"duration": 214
},
"query":{
"term": {"title":"java"}
}
}

脚本更新

把duration字段的值加10

1
2
3
4
5
6
7
8
9
10
POST video/default/1/_update
{
"script":{
"inline":"ctx._source.duration += params.num",
"lang":"painless",
"params":{
"num" : 10
}
}
}

inline是执行的脚本,ctx是脚本语言中的一个执行对象,可以使用ctx来获取_source、_index、_type、_id、_version、_routing、_parent等,painless是elasticsearch内置的一种脚本语言,params是参数集合

查询

全部数据

查询全部数据,包含所有索引,默认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

query_string查询

query_string查询会搜索_all字段,也就是查询所有字段,其内部使用的是lucene的查询语法,允许使用AND和OR这样的布尔操作符

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

{
"query":{
"query_string":{
"query":"事故"
}
}
}
1
2
3
4
5
6
7
{
"query":{
"query_string":{
"query":"publishTime:[2018 TO 2022] AND (keywords:人物 OR location:内地)"
}
}
}

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查询会对查询语句进行分词,默认情况下查询语句中的任何一个词项被匹配,文档都会被搜索到

默认operator是or,可以改为and,此时表示要包含所有的分词

1
2
3
4
5
6
7
8
9
10
11
{
"query":{
"match":{
"keywords":{
"query":"人物 老人",
"operator":"and"
}

}
}
}

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

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"
}
}
}
}

macth_phrase查询首先会把查询内容分词,然后还需要满足 分词后的所有词项都要出现在该字段中且字段中的词项顺序要一致才可以搜索到

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"
}
}
}

term查询查的是词项,如果文档中的字段分词后没有该词项,是不会搜索到的

range范围

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

exists是否存在某字段

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

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

prefix前缀查询

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

wildcard通配符查询

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

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

fuzzy模糊查询

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

高亮显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GET video/default/_search
{
"query": {
"match_phrase": {
"keywords": "战争"
}
},
"highlight": {
"fields": {
"keywords": {
"pre_tags":["<red>"],
"post_tags":["</red>"]
}
}
}
}

搜索结果中会将对应字段中的文本默认来使用<em></em>标识匹配到的单词,使用pre_tags和post_tags可以来修改标识标签

多文档查询

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

查询删除

1
2
3
4
5
6
7
8
9
POST video/_delete_by_query

{
"query":{
"term":{
"title":"python"
}
}
}

批量操作

可以使用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"
}
}
}

欢迎关注我的其它发布渠道