ES的DSL语句

2023-11-06

1.相关概念

mysql与elasticsearch的概念对比:

MySQL Elasticsearch 说明
Table Index 索引(index),就是文档的集合,类似数据库的表(table)
Row Document 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
Column Field 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQL DSL DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD
  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性

  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用mysql实现

  • 对查询性能要求较高的搜索需求,使用elasticsearch实现

  • 两者再基于某种方式,实现数据的同步,保证一致性

2.索引操作

2.1 mapping映射属性

mapping是对索引库中文档的约束,常见的mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

    • 数值:long、integer、short、byte、double、float、

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:参与搜索则需要创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

2.2 创建索引库

2.3 查询、删除索引库

GET /example

DELETE /example

 2.4 修改索引库

3.文档操作

3.1 新增文档

3.2 查询、删除文档

GET /example/_doc/ 1

DELETE /example/_doc/ 1

3.3 修改文档

3.4 查询文档

3.4.1  基本语法

3.4.2  查询所有

  • 查询出所有数据,一般测试用。例如:match_all

  • size控制每页展示数量,默认为20,size与query平级

3.4.3 全文检索查询

  • 利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

    • match:根据一个字段查询

    • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差

    • 搜索字段多,对查询性能影响大,因此建议采用copy_to,然后单字段查询的方式。

3.4.4 精确查询

  • 根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

    • range:根据值的范围查询

    • term:根据词条精确值查询

3.4.5 地理(geo)查询

  • 根据经纬度查询。例如:

    • geo_distance:附近查询,查询到指定中心点小于某个距离值的所有文档

    • geo_bounding_box:矩形范围查询,指定矩形的左上右下两个点的坐标

3.4.6 复合(compound)查询

  • 复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:

    • bool:布尔查询,利用逻辑关系组合多个其它的查询,实现复杂搜索

    • function_score:算分函数查询,可以控制文档相关性算分,控制文档排名

(1)算分函数查询

语法说明:

function score的运行流程如下:

  • 1)根据原始条件查询搜索文档,并且计算相关性算分,称为原始算分(query score)

  • 2)根据过滤条件,过滤文档

  • 3)符合过滤条件的文档,基于算分函数运算,得到函数算分(function score)

  • 4)将原始算分(query score)和函数算分(function score)基于运算模式做运算,得到最终结果,作为相关性算分。

 (2) 布尔查询

布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询。子查询的组合方式有:

  • must:必须匹配每个子查询,类似“与”

  • should:选择性匹配子查询,类似“或”

  • must_not:必须不匹配,不参与算分,类似“非”

  • filter:必须匹配,不参与算分

需要注意的是,搜索时,参与打分的字段越多,查询的性能也越差。因此这种多条件查询时,建议这样做:

  • 搜索框的关键字搜索,是全文检索查询,使用must查询,参与算分

  • 其它过滤条件,采用filter查询。不参与算分

3.5  搜索结果处理

查询之后对结果进行处理,和 “query” 是并列关系

3.5.1 排序

普通排序:

地理坐标排序:

3.5.2 分页

 深度分页问题:

  • 当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。
  • 针对深度分页,ES提供了两种解决方案:
    • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。

    • scroll:原理将排序后的文档id形成快照,保存在内存。官方已经不推荐使用。

分页查询的常见实现方案以及优缺点:

  • from + size:
    • 优点:支持随机翻页
    • 缺点:深度分页问题,默认查询上限(from + size)是10000
    • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
  • after search:
    • 优点:没有查询上限(单次查询的size不超过10000)
    • 缺点:只能向后逐页查询,不支持随机翻页
    • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
  • scroll:
    • 优点:没有查询上限(单次查询的size不超过10000)
    • 缺点:会有额外内存消耗,并且搜索结果是非实时的
    • 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

3.5.3 高亮

注意:

  • 高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。

  • 默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮

  • 如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false,例如对copy_to了的字段

4. 聚合

聚合是对文档数据的统计、分析、计算

聚合常见的有三类:

  • 桶(Bucket)聚合:用来对文档做分组

    • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组

    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

  • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

    • Avg:求平均值

    • Max:求最大值

    • Min:求最小值

    • Stats:同时求max、min、avg、sum等

  • 管道(pipeline)聚合:其它聚合的结果为基础做聚合

参与聚合的字段类型必须是: keyword 、数值、 日期、 布尔

4.1 bucket 聚合 

aggs与query,size,bool平级

默认情况下,Bucket聚合会统计Bucket内的文档数量,并且按照count降序排序,可以自定义。

添加query条件,可以对限定条件的结果聚合。

 结果:

 4.2 Metric聚合

还可以给聚合结果做个排序,方式同上。

聚合类型可以指定为某一个,也可以直接写stats,min max avg count 都会显示

5. 设计索引库数据结构范例

#查询索引库
GET /hmall
#删除索引库
DELETE /hmall
# 查一个值
GET /hmall/_search
{
  "size": 1
}
# 创建索引库
PUT /hmall
{
   "settings":{
  "analysis":{
   "analyzer":{
    "my_analyzer":{
     "tokenizer":"ik_max_word",
      "filter":"py"
    },
    "completion_analyzer":{
      "tokenizer":"keyword",
      "filter":"py"
    }
   },
"filter":{
  "py":{
    "type":"pinyin",
    "keep_full_pinyin":false,
    "keep_joined_full_pinyin":true,
    "keep_original":true,
    "limit_first_letter_length":16,
    "remove_duplicated_term":true,
    "none_chinese_pinyin_tokenize":false
    }
   }
  }
 },
  "mappings": {
    "properties": {
      "category":{
        "type": "text",
        "index": true,
        "copy_to": "all"
      },
      "brand":{
        "type": "text",
        "index": true,
        "copy_to": "all"
      },
      "price":{
        "type": "long",
        "index": true
      },
      "sold":{
        "type": "integer",
        "index": true
      },
      "id":{
        "type": "long",
        "index": true
      },
      "name":{
        "type": "text",
        "index": true,
        "copy_to": "all"
      },
      "commentCount":{
        "type": "integer",
        "index": true
      },
      "image":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_max_word"
      },
      "suggestion":{
        "type":"completion",
        "analyzer": "completion_analyzer",
        "search_analyzer": "keyword"
      }
    }
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES的DSL语句 的相关文章

随机推荐

  • (四) 区块链数据结构 – 脚本

    脚本是交易数据中的核心部分 可用于锁定输出和解锁输入 当向某人支付比特币时 我们要为交易输入设置解锁脚本 向别人证明我们有全力使用该输入 同时我们还需要对交易输出添加锁定脚本 确保只有接收者能解锁该输出 脚本 比特币系统专门设计了一套脚本语
  • games101——作业1

    文章目录 作业要求 代码框架 已有代码解读 作业部分代码 进阶部分代码 编译 结果 作业要求 在接下来的三次作业中 我们将要求你去模拟一个基于 CPU 的光栅化渲染器的简化版本 这次作业简要来说就是补全两个函数的内容 一个是 get mod
  • 数据结构实验9:并查集的使用

    问题描述 给定一个图 图中有N个顶点 1 lt N lt 500 编号依次为1 2 3 N 部分顶点之间存在一条无向边 请找出图中所有的极大连通子图 其中 极大联通子图可以描述为该子图中任意两个顶点之间都存在一条路径 且加入任何一个不在该子
  • 会议论文_干货

    研鹿论文 沿路有我 写好论文就找我 有很多同学对会议论文和期刊论文的界定并不是那么明确 那么小鹿今天就为大家详细介绍一下吧 1 会议论文是针对某个学术会议投稿的 且由学术会议的会务组决定是否录用 期刊论文则是针对某学术期刊投稿的 且是由期刊
  • python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程 协程 多线程 多进程 CPU密集型计算与IO密集型计算 多线程 多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者 消费者爬虫 Lock解决线程安全问题 使用线程池ThreadPoolExecutor 多
  • 深度学习的局部响应归一化LRN(Local Response Normalization)理解

    1 其中LRN就是局部响应归一化 这个技术主要是深度学习训练时的一种提高准确度的技术方法 其中caffe tensorflow等里面是很常见的方法 其跟激活函数是有区别的 LRN一般是在激活 池化后进行的一中处理方法 AlexNet将LeN
  • github 配置了公钥依旧提示git@github.com‘s password: Permission denied, please try again. 的解决办法

    最近在给新电脑配置GitHub的ssh时 一切都是按照流程进行github上文档的配置流程进行配置 但是把公钥配置到github后 在对仓库进行操作的时候依旧出现一下提示 git github com s password Permissi
  • c++链表实现多项式相加

    文章目录 链表实现多项式相加 数据结构 结构体定义 链表 多项式 初始化 Insert 插入单个节点 多项式的某一项 input 输入 sum 求和函数 print 输出函数 测试代码 测试结果 链表实现多项式相加 例如 已知多项式 L 1
  • 良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建准实时聊天问答程序

    一步一步教你搭建准实时聊天问答程序 微信小程序 H5网页 本文将详细介绍如何基于你自己的开源项目搭建一个准实时聊天问答程序 包括微信小程序和H5网页版 该项目服务端主要使用了Java Spring Boot Netty WebSocket等
  • 傻瓜式鸿蒙3.0使用Google(无需电脑)

    首先声明 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 可以先给
  • jsp+mysql分页技巧:巧用limit 进行分页查询

    发现问题 今天检查web程序 浏览 彩信xxxx日志 时 突然发现该web程序中不能浏览了 出错了 如下 500 Servlet Exception java lang OutOfMemoryError Resin 3 0 6 built
  • 文件描述符的阻塞与非阻塞设置

    默认文件描述符是阻塞的 即文件IO是阻塞的 设置为非阻塞 int setNonBlock int fd int flags fcntl fd F GETFL if flags 1 return flags flags O NONBLOCK
  • Qt递归获取指定文件夹下的所有文件

    方法一 使用类QDirIterator来进行遍历 简介 大概是说 适合于大目录遍历 支持递归但是不支持排序 QDirIterator NoIteratorFlags默认值 没有标志 迭代器将返回path符合QDir Filters的条目 Q
  • Android图形显示系统6 图像缓冲区(下)

    一 概述 我们再次回顾下上一篇文章 Android图形显示系统5 图像缓冲区 上 描述的图像缓冲区 Android 图形缓冲区由哪些部分组成 Android 的图形缓冲区由 Surface BufferQueue Layer Graphic
  • 树14--二叉搜索树的第k个结点

    树14 二叉搜索树的第k个结点 jz62 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 给定一棵二叉搜索树 请找出其中的第k小的TreeNode结点 测试用例 输入 5 3 7 2 4 6 8 3 返回值 4 说明 按节点数
  • JSP 页面传值方法总结

    1 URL 链接后追加参数 a href next jsp paramA A paramB B URL 后面追加参数 a
  • 【华为面试题】空间换时间

    题目 代码 function findCenterIndex nums 当数组只有一个元素时 该元素即为中心位置 if nums length 1 return 0 初始化左侧乘积和右侧乘积 let leftProduct 1 let to
  • Unity笔记—7(Unity常用API整理之Transform组件)

    Unity笔记 7 Unity常用API整理之Transform组件 文章目录 Unity笔记 7 Unity常用API整理之Transform组件 前言 一 Transform类 位置转换 核心知识点 属性 方法 继承的方法和属性 来自C
  • 各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper

    目录 配置文件 ini 介绍 语法 demo 库 json 语法 demo 库 xml 介绍 语法 demo yaml demo toml properties HOCON plist plist 是捆上了手脚的 xml Viper 22k
  • ES的DSL语句

    1 相关概念 mysql与elasticsearch的概念对比 MySQL Elasticsearch 说明 Table Index 索引 index 就是文档的集合 类似数据库的表 table Row Document 文档 Docume