ES相关DSL语句(持续更新)

2023-10-30

索引操作

创建索引
创建索引使用PUT请求,后面跟上索引名称就好了,由于7.x默认type为_doc,所以后面不必跟上type了。在PUT简单请求同时,可以加上JSON请求体,进行复杂创建。

创建索引user,可以通过参数setting设置分片和副本数,通过number_of_shards设置一共有3个分片,通过number_of_replicas给每个分片设置2个副本,默认不指定的话,这两个参数都是1。通过mappings规定文档各个Filed插入类型。

PUT /user
{
  "settings": {
    "index": {
      "number_of_shards": 3,  
      "number_of_replicas": 2 
    }
  },
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": {"type": "short"},
      "city":{"type": "keyword"}
    }
  }
}

删除索引

DELETE /user

查看索引

GET /user

也可以通过在索引后面加参数来查看某一具体参数

GET /user/_settings
GET /user/_mappings
GET /user/_aliases

修改索引部分设置
可以通过PUT请求修改部分索引的settings,例如,分片副本数量可以修改,但是分片数量不可以通过这种方式修改

PUT /user/_settings
{
  "number_of_replicas": 3 
}

文档操作

创建好索引,来看下文档的增删改查,这是日常业务用的最多的地方。

插入文档
新增文档使用PUT、POST请求

PUT /<target>/_doc/<_id>

POST /<target>/_doc/

PUT /<target>/_create/<_id>

POST /<target>/_create/<_id>

target为索引名称,_doc为默认type。通过前两种请求可看出,id可以自行指定,也可以由ES自动生成。_create可以保证只有当文档不存在的时候进行插入,而_doc还可以用于文档更新。

POST /user/_doc/1
{
  "name":"111",
  "age":26,
  "city":"bj"
}

更新文档
更新文档可以使用PUT或者POST请求关键字,全量更新

{
  "name":"ee",
  "age":3,
  "city":"sh"
}

还可以通过_update命令局部更新,所谓局部更新,是讲请求体内不需要加入全部字段,只加入需要修改的字段就好,其他字段不变。全量更新会替换整个文档。

POST /user/_update/1
{
  "doc":{
    "age": 26
  }
}

此外还可以通过脚本修改,例如将所有存在age字段的文档,其值改成5岁。

POST /user/_update_by_query
{
  "script": {
    "source": "ctx._source['age']=5" 
  },
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "age"
          }
        }
      ]
    }
  }
}

删除文档
删除文档可以使用DELEETE请求,删除指定id的文档,也可以使用_delete_by_query,删除指定条件下的文档。

DELETE /user/_doc/1
POST /user/_delete_by_query
{
  "query": {
    "match": {
      "name": "ee"
    }
  }
}

查找文档

根据id查询某文档

GET /user/_doc/1

查找某索引下的全部文档

GET /user/_search?pretty

pretty参数在浏览器中才会发挥作用,格式化返回json的。以上这条命令默认返回10条数据,想返回更多数据可以添加size字段。

GET /user/_search?pretty&size=20

批量操作

批量操作是指,一批命令同时执行(减少IO),这些命令不一定是同种类型。

使用_bulk命令可以进行文档的批量增删改。

POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }
{ "create" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }
{ "delete" : { "_index" : "user", "_id" : "4" } }

以上命令更新了id为1文档的年龄,新增id为2、3、4的文档,再删除id为4的文档.
上边的命令堆在一起不方便看,下面单独写看,方便读者查看。

批量新增

POST _bulk
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }

{ "index" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }

create命令是只有文档不存在,才会插入,index会判断如果存在就更新,不存在就插入。

批量更新

POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "update" : { "_index" : "user", "_id" : "2" } }
{ "doc" : {"age" : 20} }

和新增一样,update命令下一行需要紧跟这data数据。

批量删除

POST _bulk
{ "delete" : { "_index" : "user", "_id" : "3" } }
{ "delete" : { "_index" : "user", "_id" : "4" } }

批量查找
批量查找,使用_mget关键字,批量查找如果不跨越索引,也具有简写形式

GET /_mget
{
  "docs": [
    {
      "_index": "user",
      "_id": "1"
    },
    {
      "_index": "user",
      "_id": "2"
    }
  ]
}

# 还可以简写形式
POST /user/_mget
{
  "ids": [
    "1",
    "2",
    "3"
  ]
}

DSL查询

Elasticsearch提供了一个完整的基于JSON的查询DSL(领域特定语言)来定义查询。可以将查询DSL看作查询的AST(抽象语法树),它由两种类型的子句组成:Leaf query clauses(叶查询子句)和Compound query clauses(复合查询子句)以上摘自官网,简单来说,DSL就是将查询条件放到JSON中,进行查询。

  • Leaf query clauses在特定字段上查找特定的值,例如match、term、range查询等等。 Compound query
  • clauses将叶查询子句和其他符合查询子句结合起来,例如bool查询等等。

match
match是一个标准查询,当查询一个文本的时候,会先将文本分词。当查询确切值的时候,会搜索给定的值,例如数字、日期、布尔或者被not_analyzed的字符串。

GET /user/_search
{
  "query": {
    "match": {
      "name":"小明"
    }
  }
}

上面的操作会先将“小明”分词为“小”、“明”(当然具体还要看你的分词器),然后再去所有文档中查找与之相匹配的文档,并根据关联度排序返回。

match_phrase
match_phrase会保留空格,match会把空格忽略。

GET /user/_search
{
  "query": {
    "match_phrase": {
      "name":"小 明"
    }
  }
}

注意,分词是空格会给前一个元素,比如上面的字符串分子之后是,“小 ”,“明”。

multi_match
多字段查询,一个查询条件,看所有多个字段是否有与之匹配的字段。后面我们也可以使用should更加灵活。

GET /user/_search
{
  "query": {
    "multi_match": {
      "query":    "哈哈", 
      "fields": [ "name","city" ] 
    }
  }
}

match_all
匹配所有,并可设置这些文档的_score,默认_score为1,

GET /user/_search
{
  "query": {
    "match_all": { "boost" : 1.2 }
  }
}

boost参数可以省略,默认是1。

term
term是一种完全匹配,主要用于精确查找,例如数字、ID、邮件地址等。

GET /user/_search
{
  "query": {
    "term": {
      "age": 18
    }
  }
}

terms
terms是term多条件查询,参数可以传递多个,以数组的形式表示。

GET /user/_search
{
  "query": {
    "terms": {
      "age":[18,21]
    }
  }
}

wildcard
通配符,看示例容易理解,通配符可以解决分词匹配不到的问题,例如’haha’ 可以通过’*a’匹配。

GET /user/_search
{
  "query": {
    "wildcard": {
      "name":"*a"
    }
  }
}

exists
查看某文档是否有某属性,返回包含这个Filed的文档。

GET /user/_search
{
  "query": {
    "exists": {
      "field": "name"
    }
  }
}

fuzzy
返回与查询条件相同或者相似的匹配内容。

GET /user/_search
{
  "query": {
    "fuzzy": {
      "name":"mjjlt"
    }
  }
}

搜索条件是mjjlt,可以搜出来name为pjjlt的文档.

ids
多id查询,这个id是主键id,即你规定或者自动生成那个。

GET /user/_search
{
  "query": {
    "ids": {
      "values":[1,2,3]
    }
  }
}

prefix
前缀匹配

GET /user/_search
{
  "query": {
    "prefix": {
      "name":"pj"
    }
  }
}

range
范围匹配。参数可以是 gt(大于)、gte(大于等于)、lt(小于)、lte(小于等于)

GET /user/_search
{
  "query": {
    "range": {
      "age":{
          "gt":1,
          "lt":30
      }
    }
  }
}

regexp
正则匹配。value是正则表达式,flags是匹配格式,默认是ALL,开启所有

GET /user/_search
{
  "query": {
    "regexp": {
      "name":{
          "value": "p.*t",
          "flags": "ALL"
      }
    }
  }
}

bool
bool 可以用来组合其他子查询。其中常包含的子查询包含:must、filter、should、must_not

must
must内部的条件必须包含,内部条件是and的关系。如查看所有name中包含“小”并且age是32的用户文档。

GET /user/_search
{
  "query": {
    "bool" : {
      "must": [
        {"term" : { "name" : "小" }},
        {"term" : { "age" : 32 }}
      ]
    }
  }
}

filter
filter是文档通过一些条件过滤下,这是四个关键词中唯一和关联度无关的,不会计算_score,搜索速度较快.经常使用的过滤器会产生缓存。

GET /user/_search
{
  "query": {
    "bool" : {
      "filter": {
        "term" : { "name" : "小" }
      }
    }
  }
}

must_not
这个和must相反,文档某字段中一定不能包含某个值,相当于“非”。

should
should可以看做or的关系,例如下面查询name包含"小"或者年龄是18岁的用户。

GET /user/_search
{
  "query": {
    "bool" : {
      "should": [
        {"term" : { "name" : "小" }},
        {"term" : { "age" : 18 }}
      ]
    }
  }
}

聚合查询

Elasticsearch除全文检索功能外提供的针对Elasticsearch数据做统计分析的功能。可以查询某组数据的最大最小值,分组查询某些数据。

  • Metric(指标): 指标分析类型,如计算最大值、最小值、平均值等等 (对桶内的文档进行聚合分析的操作)
  • Bucket(桶): 分桶类型,类似SQL中的GROUP BY语法 (满足特定条件的文档的集合)
  • Pipeline(管道):管道分析类型,基于上一级的聚合分析结果进行在分析

Metric(指标)数据

常用数学操作
这里常用的数学操作有min(最小)、max(最大)、sum(和)、avg(平均数)。注意这些操作只能输出一个分析结果。使用方式大同小异。

GET /user/_search
{
    "aggs" : {
        "avg_user_age" : 
        { 
          "avg" : { "field" : "age" } 
        }
    }
}

以上示例查询所有用户的平均年龄,返回所有文档和聚合查询结果。aggs是聚合查询关键词,avg_user_age是查询名称,用户可以自行定义。

cardinality
计算某字段去重后的数量

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "cardinality" : { "field" : "age" } 
        }
    }
}

可以计算,所有文档中年龄不相同的文档个数。

percentiles
对指定字段的值按从小到大累计每个值对应的文档数的占比,返回指定占比比例对应的值。
默认统计百分比为[ 1, 5, 25, 50, 75, 95, 99 ]

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "percentiles": { "field" : "age" } 
        }
    }
}

# 返回值(省略文档部分,只分析结果部分)
  "aggregations" : {
    "avg_user" : {
      "values" : {
        "1.0" : 12.0,
        "5.0" : 12.0,
        "25.0" : 20.25,
        "50.0" : 29.0,
        "75.0" : 57.75,
        "95.0" : 123.0,
        "99.0" : 123.0
      }
    }
  }

可以看出,前1%的用户小于12岁,5%的用户小于12岁,25%的用户小于20.25岁,50%的用户小于29岁。。。

percentile_ranks
percentiles是通过百分比求出文档某字段,percentile_ranks是给定文档中的某字段求百分比。

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "percentile_ranks": 
            { 
              "field" : "age",
              "values" : [18, 30]
            } 
        }
    }
}

# 返回值(省略文档部分,只分析结果部分)
  "aggregations" : {
    "avg_user" : {
      "values" : {
        "18.0" : 18.51851851851852,
        "30.0" : 54.44444444444445
      }
    }
  }

可以看出,小于等于18岁的用户有18.52%,小于等于30岁的用户有54.4%。

top_hits
top_hits可以得到某条件下top n的文档。

GET /user/_search
{
  "aggs": {
    "avg_user" : {
      "top_hits": {
          "sort": [
          {
            "age": {
              "order": "asc"
            }
          }
        ],
        "size": 1
      }
    }
  },
  "size": 0
}

取年龄最小的那一个。

Bucket(桶)

类似于分组的概念。

terms
根据给定的filed分组,返回每组多少文档。

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "terms": {
                  "field": "city"
                }
        }
    }
}

以上根据城市分组,看每个城市有多少用户。

ranges
根据区间分组

GET /user/_search
{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "age",
        "ranges": [
          { "to": 20 },
          { "from": 20, "to": 30 },
          { "from": 30 }
        ]
      }
    }
  }
}

由于添加数据的时候,字段topTime没设置值,ES数据中该字段没值,通过DSL命令,将topTime字段全文设置为空字符串

POST /user/_update_by_query
{
  "script": {
    "source": "ctx._source['topTime'] = ' '"
  }
}

多字符串字段排序,保证多个字符串的值不能为null,否则会出现一些问题,先按照topTime倒叙排序后在按照firstTime倒叙排

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2000, 
  "sort": [
     {
      "topTime.keyword": {
        "order": "desc"
      }
    },
    {
      "firstTime.keyword": {
        "order": "desc"
      }
    }
  ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES相关DSL语句(持续更新) 的相关文章

随机推荐

  • 关于小程序本地图片加载失败(渲染层错误)的问题

    今天 因为被分配到要写一个小程序页面 但是在图片载入上面却出现了一个这样的问题 图片上面的src是可以直接点击进去的 但是在小程序编译加载的时候却 而前辈们的大图片基本上都是通过网络路径进行加载 正巧这几张图片在网络路径中没有 只能通过本地
  • C++_运算符重载

    什么是运算符的重载 运算符与类结合 产生新的含义 为什么要引入运算符重载 作用 为了实现类的多态性 多态是指一个函数名有多种含义 怎么实现运算符的重载 方式 类的成员函数 或 友元函数 类外的普通函数 规则 不能重载的运算符有 和 和 和
  • STM32 基础系列教程 23 - USB_cdc

    前言 学习stm32 USB接口使用 学会用CUBE工具快速创建USB设备工程及调试 关于usb的相关知道请读者提前准备并学习 当然如果不想深究其中原理的话 跟着本文来操作就可以实现基于USB的设备开发了 需要提示的是 stm32在使用us
  • 2023年Python面试题_后台开发

    Flask 中请求上下文和应用上下文的区别和作用 current app g 是应用上下文 request session 是请求上下文 手动创建上下文的两种方法 with app app context app current app g
  • php判断已登录用户名和密码,PHP验证登录用户名和密码

    include once discuz include common inc php CTDF USERINFO array CTDF USERINFO sid sid CTDF USERINFO uid di 登录页面 login htm
  • 大学生必备之GPA计算(满绩为5)

    平均学分绩点 Grade Point Average 即GPA 是以学分与绩点作为衡量学生学习的量与质的计算单位 以取得一定的学分和平均学分绩点作为毕业和获得学位的标准 实施多样的教育规格和较灵活的教学管理制度 平均学分绩点的计算方法是 是
  • 长沙师范大学计算机学院,中心-湖南师范大学信息科学与工程学院

    信息科学与工程学院实验中心 现设有计算机专业实验室 信息技术实验室和计算机基础实验室 目前实验中心共有专职的实验人员10人 兼职3人 其中高级实验师3人 讲师3人 实验师6人 其它1人 研究生导师2人 计算机专业实验室现有实验用房11间 计
  • SpringBoot当中使用JDBC配置druid数据源

    本篇文章主要讲解SpringBoot当中使用JDBC配置druid数据源 感兴趣的跟小编一起来学习呀 目录 1 导入依赖 2 application yml配置 3 DruidConfig配置 4 controller 5 测试 1 导入依
  • QT部件透明阴影效果与不规则窗体

    透明效果 原始效果 设置整个窗体透明 调用setWindowOpacity 方法 传入一个0 1之间的值来表示透明度 1表示不透明 0表示完全透明 在构造函数中添加 setWindowOpacity 0 5 0 1之间 设置窗体透明 部件不
  • Trie代码java

    还要判断节点是否是一个映射 比如 pan pandas 所以需要一个boolen来判断不是叶子结点是否为一个单词 211 Add and Search Word Data structure design Medium 81251Favor
  • 当SAP遇见RPA:RPA如何自动化SAP系统?

    对中国企业而言 如何实现海量数据的交互 存储 分析 真正发挥数据价值进行技术和业务创新 是数字化转型的关键 也是需要应对的挑战 2019年初 ERP巨头SAP发布了 中国加速计划 计划在未来五年 持续加大对中小企业市场的研发投入 赋能中国企
  • 微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】

    今天在开发一个小功能 copy了之前写的代码 但是在实现功能时 出现了如下问题 先在这简单总结一下解决方案 在调用方法时 在 中前后多加了空格 在 js 中没有定义该方法 在 js 中方法定义的位置可能不对 比如放在了 data 中 组件化
  • vue-quill-editor踩坑记录--富文本内容回显样式不对

    使用vue quill editor写的富文本 内容在H5使用v html显示时 样式跟在富文本写的时候样式不一样 字体大小显示不出来 原因 有些类名 在v html页面是没有找到的 解决 全局或者局部引入vue quill editor的
  • js用户密码强度验证函数

    原文地址 http blog csdn net dreamzml article details 9225529 s调用此函数 返回密码强度级别 html view plain copy print function getStrength
  • mysql索引覆盖-百万数据表优化

    文章目录 前言 一 业务场景 二 问题分析 三 回表代价 四 解决方案 总结 前言 写博客是自己对知识梳理 目前是写给自己看 算是自己学习后的作业 也是为了养成一个良好的习惯 一 业务场景 先看看以下关于查询用户订单的慢SQL的问题该如何优
  • volatile 关键字-这一篇就够了

    下文笔者将详细介绍volatile这一篇文章 将使你真真的了解到volatile关键字的用法 如下所示 volatile关键字 的功能 我们都知道volatile关键字有两个功能 1 保证变量的内存可见性 2 禁止指令重排序 可见性 例 变
  • 自学软件测试,1个月内如何快速学到可以找工作的程度?

    首先说下写这篇文章的目的 测试猿课堂在招生的过程中 发现有部分学员因为一些自身的情况 想先短时间学一下软件测试的基础知识 达到可以就业的程度就立马找工作 然后边上班边学习 这种情况可以理解 希望能通过这篇文章 帮助更多急于转行 但同时又希望
  • 二十.刷题.12

    题目 打印出所有水仙花数 所谓水仙花数是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个水仙花数 因为153 1的三次方 5的三次方 3的三次方 include
  • 常用大数据框架对比

    最近看到一篇写大数据框架的文章 写的非常好 也根据自己的经验做一些总结吧 大数据框架的选型对刚接触分布式运算的人来说确实有点迷茫 希望这篇文章可以对大家有所帮助 简介 大数据是收集 整理 处理大量大规模数据集 并从中获得见解所需的非传统战略
  • ES相关DSL语句(持续更新)

    索引操作 创建索引 创建索引使用PUT请求 后面跟上索引名称就好了 由于7 x默认type为 doc 所以后面不必跟上type了 在PUT简单请求同时 可以加上JSON请求体 进行复杂创建 创建索引user 可以通过参数setting设置分