ES版本:6.8
本篇文章主要介绍在ES中如何进行数据的增删查改
新增数据
ES可以直接新增数据,没有索引会自动创建索引,但是不推荐这种方式,因为会根据默认值创建分片和副本数。
// test1索引名,_doc是类型,1表示主键值(也可以省略,ES会默认生成一个)
POST test1/_doc/1
{
"uid" : "1234",
"phone" : "12345678909",
"message" : "qq",
"msgcode" : "1",
"sendtime" : "2019-03-14 01:57:04"
}
创建索引
ES常用基本类型有text、keyword、byte、short、integer、long、float、double、boolean、date。其中text简单理解为需要分词,keyword不会分词可以进行排序或聚合
如下,指定settings和mappings来创建索引
PUT test1
{
"settings": {
//分片数
"number_of_shards": 10,
// 副本数
"number_of_replicas": 1,
// 刷新频率
"refresh_interval": "1s"
},
"mappings": {
"_doc": {
"properties": {
"uid": {
"type": "long"
},
"phone": {
"type": "long"
},
"message": {
"type": "keyword"
},
"msgcode": {
"type": "long"
},
"sendtime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
查询所有索引信息
GET _cat/indices
查询数据
// 查询索引test1,返回settings,mapping等
GET test1
// 查询test1索引下的settings,里面是索引相关信息,比如分区数副本数等
GET test1/_settings
// 查询test1索引下的mapping,里面是字段的一些信息
GET test1/_mapping
修改数据
- ES的修改和新增其实是一样的,没有数据就创建。
// 如果ES中没有此数据,则创建;如果存在,则覆盖
POST test1/_doc/1
{
"uid" : "1234",
"phone" : "12345678909",
"message" : "qq",
"msgcode" : "1",
"sendtime" : "2019-03-14 01:57:04"
}
- 根据条件修改
POST test1/_update_by_query
{
"query": {
// term 精确匹配,下面会有说明
"term": {
"phone": "12345678909"
}
} ,
"script": {
// 将message字段内容修改为xuwujing
"source": "ctx._source['message'] = 'xuwujing'"
}
}
删除数据
- 根据主键删除
DELETE test1/1
- 根据条件删除
POST test/_delete_by_query
{
"query":{
"term":{
"phone":"12345678909"
}
}
}
- 删除字段
POST test1/_doc/_update_by_query
{
"script": {
"lang": "painless",
"source": "ctx._source.remove(\"msgcode\")"
}
}
查询
查询所有
// match_all查询集群所有索引库信息,包括隐藏的索引库
GET _search
{
"query": {
"match_all": {}
}
}
查询某个索引下的数据,语法为:GET 索引库名称/索引库类型/_search
, 其中索引库类型也可以不写,如下
// 查询test1所有数据
GET test1/_doc/_search
// 查询test2下主键为2的数据
GET test1/_doc/2
term查询
term用于精确匹配,比如数字,日期,布尔值等
例如:
// 查询phone为12345678909的所有记录
GET test1/_doc/_search
{
"query": {
"term": {
"phone": "12345678909"
}
}
}
// terms查询,类似SQL中的in
GET test1/_doc/_search
{
"query": {
"terms": {
"uid": [
1234,
12345,
123456
]
}
}
}
range查询
范围查询,gt大于,lt小于,gte大于等于,lte小于等于
// 查询uid大于1234,小于等于12345的记录
GET test1/_doc/_search
{
"query": {
"range": {
"uid": {
"gt": 1234,
"lte": 12345
}
}
}
}
exists查询
// 查询存在msgcode字段的记录
GET test1/_doc/_search
{
"query": {
"exists": {
"field":"msgcode"
}
}
}
bool查询
可以用来合并多个过滤条件
- must:多个查询条件的完全匹配,相当于 and。
- must_not:多个查询条件的相反匹配,相当于 not。
- should:至少有一个查询条件匹配, 相当于 or。
GET /test1/_search
{
"query": {
"bool": {
"must": {
"term": {
"phone": "12345678909"
}
},
"must_not": {
"term": {
"uid": 12345
}
},
"should": [
{
"term": {
"uid": 1234
}
},
{
"term": {
"uid": 123456
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
}
wildcard查询
wildcard类似于SQL的like查询,需要带上**
GET /test1/_search
{
"query": {
"wildcard": {
"message":"*wu*"
}
}
}
regexp查询
regexp即正则查询
GET /test1/_search
{
"query": {
"regexp": {
"message":"xu[0-9]"
}
}
}
全文检索
ES根据查询条件计算每个匹配的记录的得分,即_scope字段,默认根据得分排序返回
match
- match是标准的全文检索
- 在匹配之前会先对查询关键字进行分词
- 可以指定分词器来覆盖mapping中设置的搜索分词器
如下例子,会根据ik_smart分词器将超级羽绒服
关键字分词为超级、羽绒服然后再去es中查询与这两个分词相匹配的文档,依据相关度即分值得到以下结果
GET idx_pro/_search
{
"query": {
"match": {
"name": {
"query": "超级羽绒服",
"analyzer": "ik_smart"
}
}
}
}
match_phrase
match是根据分词后的结果进行匹配,match_phrase来直接进行短语匹配.如下例子,会查询address字段中包含mill lane短语的记录
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
如果缓存match,则只有address包含mill或lane,这些记录都会返回
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}