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
指定版本修改 1 2 3 PUT video/default/1?version=2
更新数据
该操作会覆盖掉对应文档的全部内容
局部更新 有时候可能只传入修改的字段,而没有改动的不传入,或者是新增一个新的字段,此时并不想在请求体总中把所有字段都传过去,可以使用局部更新
1 2 3 4 5 6 7 POST video/default/1/_update { "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" : "保卫战" }
检查文档是否存在 有时候并不需要返回对应的文档内容,只是想确定一下文档是否存在
如果存在的话结果只会返回响应码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 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 } ] }
如果查的是同一个索引的多条记录,可以在地址栏指定索引
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 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
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 }
排序 1 2 3 4 5 6 7 { "sort" : { "duration" : { "order" : "asc" } } }