ElasticSearch DSL语法

news2024/11/15 12:00:28

一、文档批量操作

1.批量获取文档数据

批量获取文档数据是通过_mget的API来实现的

img

(1)在URL中不指定index和type

  • 请求方式:GET

  • 请求地址:_mget

  • 功能说明 : 可以通过ID批量获取不同index和type的数据

  • 请求参数:

  • docs : 文档数组参数

  • _index : 指定index

  • _type : 指定type(7.x的版本不推荐使用)

  • _id : 指定id

  • _source : 指定要查询的字段

img

(2)在URL中指定index

  • 请求方式:GET

  • 请求地址:/{{indexName}}/_mget

  • 功能说明 : 可以通过ID批量获取不同index和type的数据

  • 请求参数:

  • docs : 文档数组参数

  • _index : 指定index

  • _type : 指定type(7.x的版本不推荐使用)

  • _id : 指定id

  • _source : 指定要查询的字段

img

(3)在URL中指定index和type

  • 请求方式:GET

  • 请求地址:/{{indexName}}/{{typeName}}/_mget

  • 功能说明 : 可以通过ID批量获取不同index和type的数据

  • 请求参数:

  • docs : 文档数组参数

  • _index : 指定index

  • _type : 指定type

  • _id : 指定id

  • _source : 指定要查询的字段

img

2.批量操作文档数据

批量对文档进行写操作是通过_bulk的API来实现的

  • 请求方式:POST

  • 请求地址:_bulk

  • 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)

  • 第一行参数为指定操作的类型及操作的对象(index,type和id)

  • 第二行参数才是操作的数据

{“actionName”:{“_index”:“indexName”, “_type”:“typeName”,“_id”:“id”}}

{“field1”:“value1”, “field2”:“value2”}

  • actionName:表示操作类型,主要有create,index,delete和update

(1)批量创建文档create

img

(2)普通创建或全量替换index

img

  • 如果原文档不存在,则是创建
  • 如果原文档存在,则是替换(全量修改原文档)

(3)批量删除delete

img

(4)批量修改update

img

二.DSL语言高级查询

1.Query DSL概述

img

2.无查询条件

无查询条件是查询所有,默认是查询所有的,或者使用match_all表示所有

img

3.有查询条件

3.1 叶子条件查询(单字段查询条件)

3.1.1 模糊匹配

模糊匹配主要是针对文本类型的字段,文本类型的字段会对内容进行分词,对查询时,也会对搜索条件进行分词,然后通过倒排索引查找到匹配的数据,模糊匹配主要通过match等参数来实现

  • match : 通过match关键词模糊匹配条件内容
  • prefix : 前缀匹配
  • regexp : 通过正则表达式来匹配数据

img

img

match的复杂用法

match条件还支持以下参数:

  • query : 指定匹配的值

  • operator : 匹配条件类型

  • and : 条件分词后都要匹配

  • or : 条件分词后有一个匹配即可(默认)

  • minmum_should_match : 指定最小匹配的数量

3.1.2 精确匹配

  • term : 单个条件相等
  • terms : 单个字段属于某个值数组内的值
  • range : 字段属于某个范围内的值
  • exists : 某个字段的值是否存在
  • ids : 通过ID批量查询

img

3.2 组合条件查询(多条件查询)

组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询条件

  • bool : 各条件之间有and,or或not的关系

  • must : 各个条件都必须满足,即各条件是and的关系

  • should : 各个条件有一个满足即可,即各条件是or的关系

  • must_not : 不满足所有条件,即各条件是not的关系

  • filter : 不计算相关度评分,它不计算_score即相关度评分,效率更高

  • constant_score : 不计算相关度评分

must/filter/shoud/must_not 等的子条件是通过 term/terms/range/ids/exists/match 等叶子条件为参数的

注:以上参数,当只有一个搜索条件时,must等对应的是一个对象,当是多个条件时,对应的是一个数组

3.3 连接查询(多文档合并查询)

  • 父子文档查询:parent/child
  • 嵌套文档查询: nested

3.4 DSL查询语言中存在两种:查询DSL(query DSL)和过滤DSL(filter DSL)

query DSL

在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。

filter DSL

在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”

答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用must_not或者filter

另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

3.5 Query方式查询:案例

  • 根据名称精确查询姓名 term, term查询不会对字段进行分词查询,会采用精确匹配

注意: 采用term精确查询, 查询字段映射类型属于为keyword.

img

  • 根据备注信息模糊查询 match, match会根据该字段的分词器,进行分词查询

img

  • 多字段模糊匹配查询与精准查询 multi_match

img

  • 未指定字段条件查询 query_string , 含 AND 与 OR 条件

img

  • 指定字段条件查询 query_string , 含 AND 与 OR 条件

img

  • 范围查询

注:json请求字符串中部分字段的含义

​ range:范围关键字

​ gte 大于等于

​ lte 小于等于

​ gt 大于

​ lt 小于

​ now 当前时间

img

  • 分页、输出字段、排序综合查询

img

_source :

3.6 Filter过滤器方式查询,它的查询不会计算相关性分值,也不会对结果进行排序, 因此效率会高一点,查询的结果可以被缓存。

Filter Context 对数据进行过滤

img

总结:

  1. match

match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。

  1. term

term: 这种查询和match在有些时候是等价的,比如我们查询单个的词hello,那么会和match查询结果一样,但是如果查询"hello world",结果就相差很大,因为这个输入不会进行分词,就是说查询的时候,是查询字段分词结果中是否有"hello world"的字样,而不是查询字段中包含"hello world"的字样。当保存数据"hello world"时,elasticsearch会对字段内容进行分词,“hello world"会被分成hello和world,不存在"hello world”,因此这里的查询结果会为空。这也是term查询和match的区别。

  1. match_phase

match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that world不满足,world hello也不满足条件。

  1. query_string

query_string:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。

三.文档映射

1.ES中映射可以分为动态映射和静态映射

动态映射:

在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。

而Elasticsearch中不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

动态映射规则如下:

img

静态映射:

静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。

2 动态映射

2.1 删除原创建的索引

DELETE /es_db

2.2 创建索引

PUT /es_db

2.3 创建文档(ES根据数据类型, 会自动创建映射)

img

2.4 获取文档映射

GET /es_db/_mapping

img

3 静态映射

3.1 删除原创建的索引

DELETE /es_db

3.2 创建索引

img

3.3 设置文档映射

img

“index”: true – name是否需要进行分词 true-需要

“store”:true – 是否存储 true 时会将查询到的数据存储起来

如果一个字段的mapping中含有store属性为true,那么有一个单独的存储空间为这个字段做存储,而且这个存储是独立于_source的存储的。它具有更快的查询。存储该字段会占用磁盘空间。如果需要从文档中提取(即在脚本中和聚合),它会帮助减少计算。在聚合时,具有store属性的字段会比不具有这个属性的字段快。 此选项的可能值为false和true。

3.5 获取文档映射

img

img

由于ElasticSearch使用索引名称作为磁盘上的目录名称,这些名称必须符合不同操作系统的约定。
同时需遵守下列规则:

  • 索引名必须为小写字母
  • 不能包括 , /, *, ?, “, <, >, |, 空格, 逗号, #
  • 7.0版本之后不能使用冒号:
  • 不能以这些字符 -, _, + 开头
  • 不能包括 . 或 …
  • 长度不能超过 255 个字符

四.核心类型(Core datatype)

字符串:string,string类型包含 text 和 keyword。

text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。

keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。

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

日期型:date

布尔型:boolean

五.keyword 与 text 映射类型的区别

将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、排序)

img

将 book 字段设置为 text 映射能模糊查询, 能分词查询,不能聚合、排序)

img

term: 不会被拆开

match:会被拆开

六.创建静态映射时指定text类型的ik分词器

1.设置ik分词器的文档映射

先删除之前的es_db

再创建新的es_db

定义ik_smart的映射

PUT /es_db

{

“mappings”:{

“properties”:{

“name”:{“type”:“keyword”,“index”:true,“store”:true},

“sex”:{“type”:“integer”,“index”:true,“store”:true},

“age”:{“type”:“integer”,“index”:true,“store”:true},

“book”:{“type”:“text”,“index”:true,“store”:true,“analyzer”:“ik_smart”,“search_analyzer”:“ik_smart”},

“address”:{“type”:“text”,“index”:true,“store”:true}

}

}

}

2.分词查询

POST /es_db/_doc/_search

{

“query”: {

“match”: {“address”: “广”}

}

}

POST /es_db/_doc/_search

{

“query”: {

“match”: {“address”: “广州”}

}

}

七.对已存在的mapping映射进行修改

具体方法

1)如果要推倒现有的映射, 你得重新建立一个静态索引

2)然后把之前索引里的数据导入到新的索引里

3)删除原创建的索引

4)为新索引起个别名, 为原索引名

img

注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机

八.Elasticsearch乐观并发控制

在数据库领域中,有两种方法来确保并发更新,不会丢失数据:

1、悲观并发控制

这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。

2、乐观并发控制

Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

img

4、实现_version乐观锁更新文档

img

本次操作使用的版本时7.12.1 version关键字已经被淘汰了不能使用。

5、ES新版本(7.x)不使用version进行并发版本控制 if_seq_no=版本值&if_primary_term=文档位置

_seq_no:文档版本号,作用同_version

_primary_term:文档所在位置

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat介绍在IDEA中创建JavaWeb工程

文章目录 一、WEB服务器服务器概述使用Java代码手写web服务器 二、服务器软件Web服务器服务器软件的使用步骤 三、TomcatTomcat的下载Tomcat的安装与卸载Tomcat的启动与关闭常见问题 四、新建Java Web项目并将项目部署到tomcat中新建Java Web项目将项目部署到Tomcat中出现的问题…

在你的 Vue + Electron 项目里,引入 ESLint

因为我的项目是基于 Electron 平台的 Web 应用&#xff0c;使用 Vue 3 实现&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的时候&#xff0c;要考虑好几种规范的问题。 文章目录 零、简介1. 规则2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定义…

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

你是否知道Python的列表翻转、排序和多维列表

1.reverse() 表示翻转列表中的元素&#xff0c;不会生成新列表 list1 [2343, 55, 4, 345, 676, 768] list1.reverse() print(list1) # [768, 676, 345, 4, 55, 2343] 2.sort() 对原列表元素进行排序&#xff0c;默认是升序 list1 [2343, 55, 4, 345, 676, 768] list1…

在Python中使用多线程(通俗版本)

一、多线程的介绍&#xff1a; 1.进程 通常一个进程包含一个或者多个线程&#xff0c;每个进程有自己独立的一块内存空间&#xff0c;所有的线程共享这一块空间&#xff0c;例如&#xff1a;在Windows操作系统中&#xff0c;一个运行的xx.exe就是一个进程。 2.线程 一个进程…

lua调用C++函数

第一步搭建lua的环境. win10 lua环境搭建-CSDN博客 我使用的环境是win10vs2015lua54 先来个最简单的lua调用C函数, 无参数无返回值的 第一步:定义C函数. int CTest(lua_State* L) // 返回值是固定的int类型,返回0表示没有返回参数,返回1表示有一个返回参数 {std::cout &l…

什么是支持向量机(Support vector machine)和其原理

作为机器学习的基础算法&#xff0c;SVM被反复提及&#xff0c;西瓜书、wiki都能查到详细介绍&#xff0c;但是总是觉得还差那么点&#xff0c;于是决定自己总结一下。 一、什么是SVM&#xff1f; 1、解决什么问题&#xff1f; SVM&#xff0c;最原始的版本是用于最简单的线…

【C++从0到王者】第五十站:B树

文章目录 一、内查找与外查找1.内查找2.外查找 二、B树概念三、B树的插入1.B树的插入分析2.B树插入总结3.插入代码实现4.B树满树和最空时候的对比5.B树的删除6.遍历B树7.B树的性能分析 一、内查找与外查找 1.内查找 像我们之前所用的在内存中的查找就是内查找 种类数据格式时…

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行 目录 Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行前言1 使用GUI-Guider设计UI1.1 创建工程1.2 设计UI 2 ESP工程导入UI2.1 移植LVGL2.2 移植UI文件2.3 调用UI文件2.4 烧录测试 结束语 前言 GU…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

杂记-买华强北电子产品的教训

之前不信邪&#xff0c;去华强北买了一个西部数据所谓全新的机械硬盘&#xff0c;1T&#xff0c;差不多300元。用了不到一年就坏了。然后去官网查S/N&#xff0c;结果查无device。Onedrive同步的时候&#xff0c;我把同步路径设置为机械硬盘&#xff0c;结果机械硬盘崩的时候&a…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

【和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告

【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告 文章目录 【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告1 业务背景2 数据说明3 数据探索性分析4 用户行为分析4.1 用户属性与行为关系分析4.2 转化行为在不同用户属性群体中的分布…

Android之MQTT的使用

MQTT的简单介绍 MQTT是广泛应用于物联网的传输协议&#xff0c;基于TCP MQTT有一个代理服务器&#xff0c;其客户端可以订阅主题或向一个主题发送消息&#xff0c;从而实现通信 MQTT 设计了 3 个 QoS 等级。 QoS 0&#xff1a;消息最多传递一次&#xff0c;如果当时客户端不…

Jmeter基础使用---Token鉴权接口关联

接口测试流程&#xff1a; 查看API接口文档&#xff0c;熟悉接口业务&#xff08;地址、端口、参数、鉴权、状态码&#xff09;设计接口测试用例&#xff08;正例&#xff1a;正确的结果&#xff1b;反例&#xff1a;鉴权异常、参数异常、兼容异常、其他异常&#xff09;使用接…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素&#xff0c;返回被删除的元素E set(int index,E element)修改指定索引处的元素&#xff0c;返回被修改的元素E get(int inde…

rtt的io设备框架面向对象学习-io设备管理层

目录 1.设备基类2.rtt基类2.1 rtt基类定义2.2 对象容器定义2.3 rtt基类构造函数 3.io设备管理接口4.总结 这层我的理解就是rtt基类和设备基类所在&#xff0c;所以抽离出来好点&#xff0c;不然每个设备类都要重复它。 1.设备基类 /include/rtdef.h中定义了设备基类struct rt_…

Spring:EnclosingClass工具类分辨

Spring&#xff1a;EnclosingClass工具类分辨 1 前言 通过Spring的工具分辨EnclosingClass类。 测试类如下&#xff1a; package com.xiaoxu.test.enclosingClass;/*** author xiaoxu* date 2024-01-18* java_demo2:com.xiaoxu.test.enclosingClass.Outter*/ public class …

计算机专业必看的几部电影推荐

计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;这些电影不仅带我们穿越到科…

模型部署 - onnx 的导出和分析 -(1) - PyTorch 导出 ONNX - 学习记录

onnx 的导出和分析 一、PyTorch 导出 ONNX 的方法1.1、一个简单的例子 -- 将线性模型转成 onnx1.2、导出多个输出头的模型1.3、导出含有动态维度的模型 二、pytorch 导出 onnx 不成功的时候如何解决2.1、修改 opset 的版本2.2、替换 pytorch 中的算子组合2.3、在 pytorch 登记&…