美文网首页
ES-DSL基本使用

ES-DSL基本使用

作者: leeliang | 来源:发表于2020-12-29 15:05 被阅读0次

    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基本使用

          本文链接:https://www.haomeiwen.com/subject/vswfoktx.html