ES-DSL基本使用

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

修改数据

  1. ES的修改和新增其实是一样的,没有数据就创建。
// 如果ES中没有此数据,则创建;如果存在,则覆盖
POST test1/_doc/1
{
    "uid" : "1234",
    "phone" : "12345678909",
    "message" : "qq",
    "msgcode" : "1",
    "sendtime" : "2019-03-14 01:57:04"
}
  1. 根据条件修改
POST test1/_update_by_query
{
  "query": {
    // term 精确匹配,下面会有说明
    "term": {
      "phone": "12345678909"
    }
  } ,
  "script": {
    // 将message字段内容修改为xuwujing
    "source": "ctx._source['message'] = 'xuwujing'"
  }
}

删除数据

  1. 根据主键删除
DELETE test1/1
  1. 根据条件删除
POST test/_delete_by_query
{
  "query":{
        "term":{
              "phone":"12345678909"
          }
    }
}
  1. 删除字段
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" } }
}

你可能感兴趣的:(ES-DSL基本使用)