分布式搜索引擎ES-DSL搜索详解
1.DSL搜索-入门语法
建立索引: xxx(自定义名称)
自定义mapping:
POST /shop/_mapping
{"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {"type": "keyword"},"nickname": {"type": "text","analyzer": "ik_max_word"},"money": {"type": "float"},"desc": {"type": "text","analyzer": "ik_max_word"},"sex": {"type": "byte"},"birthday": {"type": "date"},"face": {"type": "text","index": false}}
}
请求参数的查询(QueryString)
查询[字段]包含[内容]的文档
测试搜索:
GET /shop/_doc/_search?q=desc:新华网
拼接查询:称为queryString方式查询
GET /shop/_doc/_search?q=nickname:新&q=age:25
text与keyword搜索对比测试(keyword不会被倒排索引,不会被分词)
GET /shop/_doc/_search?q=nickname:super
GET /shop/_doc/_search?q=username:super
GET /shop/_doc/_search?q=username:super hero
这种方式称之为QueryString查询方式,参数都是放在url中作为请求参数的。
DSL基本语法
QueryString用的很少,一旦参数复杂就难以构建,所以大多查询都会使用dsl来进行查询更好。
Domain Specific Language
特定领域语言
基于JSON格式的数据查询
查询更灵活,有利于复杂查询
DSL格式语法:
查询
POST /shop/_doc/_search
{"query": {"match": {"desc": "新华网"}}
}
判断某个字段是否存在
{"query": {"exists": {"field": "desc"}}
}
语法格式为一个json object,内容都是key-value键值对,json可以嵌套。
key可以是一些es的关键字,也可以是某个field字段,后面会遇到
搜索不合法问题定位
DSL查询的时候经常会出现一些错误查询,出现这样的问题大多都是json无法被es解析,他会像java那样报一个异常信息,根据异常信息去推断问题所在,比如json格式不对,关键词不存在未注册等等,甚至有时候不能定位问题直接复制错误信息到百度一搜就能定位问题了。
2.DSL搜索-查询所有与分页
match_all
在索引中查询所有的文档
GET /shop/_doc/_search
或
POST /shop/_doc/_search
{"query": {"match_all": {}},"_source": ["id", "nickname", "age"]
}
可视化操作:
分页查询
默认查询是只有10条记录,可以通过分页来展示
POST /shop/_doc/_search
{"query": {"match_all": {}},"from": 0,"size": 10
}
{"query": {"match_all": {}},"_source": ["id","nickname","age"],"from": 5,"size": 5
}
Head可视化操作
3.DSL搜索-term与match
term精确搜索与match分词搜索
搜索的时候会把用户搜索内容,比如“中国强大”作为一整个关键词去搜索,而不会对其进行分词后再搜索
POST /shop/_doc/_search
{"query": {"term": {"desc": "新华网"}}
}
对比
{"query": {"match": {"desc": "新华网"}}
}
注:match会对新华网先进行分词(其实就是全文检索),在查询,而term则不会,直接把新华网作为一个整的词汇去搜索。
head 可视化操作对比:
terms 多个词语匹配检索
相当于是tag标签查询,可以完全匹配做类似标签的查询
POST /shop/_doc/_search
{"query": {"terms": {"desc": ["新华网", "学习", "骚年"]}}
}
4.其他常用语法
(1)match_phrase 短语匹配
match:分词后只要有匹配就返回,match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)
slop:允许词语间跳过的数量
POST /shop/_doc/_search
{"query": {"match_phrase": {"desc": {"query": "大学 毕业 研究生","slop": 2}}}
}
(2)match 扩展
operator
or:搜索内容分词后,只要存在一个词语匹配就展示结果
and:搜索内容分词后,都要满足词语匹配
POST /shop/_doc/_search
{"query": {"match": {"desc": "新华网"}}
}
等同于
{"query": {"match": {"desc": {"query": "xbox游戏机","operator": "or"}}}
}
相当于 select * from shop where desc=‘xbox’ or|and desc=‘游戏机’
minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。
minimum_should_match 也能设置具体的数字,表示个数
POST /shop/_doc/_search
{"query": {"match": {"desc": {"query": "好玩的xbox游戏机","minimum_should_match": "60%"}}}
}
根据文档主键ids搜索
GET /shop/_doc/1001
查询多个
POST /shop/_doc/_search
{"query": {"ids": {"type": "_doc","values": ["1001", "1010", "1008"]}}
}
(3)multi_macth/boost
multi_match
满足使用match在多个字段中进行查询的需求
POST /shop/_doc/_search
{"query": {"multi_match": {"query": "皮特帕克慕课网","fields": ["desc", "nickname"]}}
}
boost
权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。
POST /shop/_doc/_search
{"query": {"multi_match": {"query": "皮特帕克慕课网","fields": ["desc", "nickname^10"]}}
}
(4)布尔查询
可以组合多重查询
must:查询必须匹配搜索条件,譬如 and
should:查询匹配满足1个以上条件,譬如 or
must_not:不匹配搜索条件,一个都不要满足
实操1:
POST /shop/_doc/_search
{"query": {"bool": {"must": [{"multi_match": {"query": "新华网","fields": ["desc", "nickname"]}},{"term": {"sex": 1}},{"term": {"birthday": "1996-01-14"}}]}}
}{"query": {"bool": {"should(must_not)": [{"multi_match": {"query": "学习","fields": ["desc", "nickname"]}},{"match": {"desc": "游戏"} },{"term": {"sex": 0}}]}}
}
实操2:
{"query": {"bool": {"must": [{"match": {"desc": "新"} },{"match": {"nickname": "新"} }],"should": [{"match": {"sex": "0"} }],"must_not": [{"term": {"birthday": "1992-12-24"} }]}}
}
为指定词语加权
特殊场景下,某些词语可以单独加权,这样可以排得更加靠前。
POST /shop/_doc/_search
{"query": {"bool": {"should": [{"match": {"desc": {"query": "律师","boost": 18}}},{"match": {"desc": {"query": "进修","boost": 2}}}]}}
}
(5)过滤器
对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。
使用场景:
query:根据用户搜索条件检索匹配记录
post_filter:用于查询后,对结果数据的筛选
实操:查询账户金额大于80元,小于160元的用户。并且生日在1998-07-14的用户
gte:大于等于
lte:小于等于
gt:大于
lt:小于
(除此以外还能做其他的match等操作也行)
POST /shop/_doc/_search
{"query": {"match": {"desc": "新华网游戏"} },"post_filter": {"range": {"money": {"gt": 60,"lt": 1000}}}
}
(6)排序
es的排序同sql,可以desc也可以asc。也支持组合排序。
实操:
POST /shop/_doc/_search
{"query": {"match": {"desc": "新华网游戏"}},"post_filter": {"range": {"money": {"gt": 55.8,"lte": 155.8}}},"sort": [{"age": "desc"},{"money": "desc"}]
}
对文本排序
由于文本会被分词,所以往往要去做排序会报错,通常我们可以为这个字段增加额外的一个附属属性,类型为keyword,用于做排序。
创建新的索引
POST /shop2/_mapping
{"properties": {"id": {"type": "long"},"nickname": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": {"type": "keyword"}}}}
}
插入数据
POST /shop2/_doc
{"id": 1001,"nickname": "美丽的风景"
}
{"id": 1002,"nickname": "漂亮的小哥哥"
}
{"id": 1003,"nickname": "飞翔的巨鹰"
}
{"id": 1004,"nickname": "完美的天空"
}
{"id": 1005,"nickname": "广阔的海域"
}
排序
{"sort": [{"nickname.keyword": "desc"}]
}
(7)高亮显示
高亮显示
POST /shop/_doc/_search
{"query": {"match": {"desc": "新华网"}},"highlight": {"pre_tags": ["<tag>"],"post_tags": ["</tag>"],"fields": {"desc": {}}}
}
相关文章:

分布式搜索引擎ES-DSL搜索详解
1.DSL搜索-入门语法 建立索引: xxx(自定义名称) 自定义mapping: POST /shop/_mapping {"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {&quo…...
vue zip文件下载请求封装与使用
axios封装(重点是响应拦截) 这里把响应超时时间注释是文件下载接口返回需要较长时间 import axios from axios import {ElMessageBox} from "element-plus"; import router from "/router";const service axios.create({baseURL: …...
Windows波形音频MMEAPI简介
Windows波形音频MMEAPI简介 使用MMEAPI时需要导入头文件:#include<mmeapi.h> mmeapi.h文件的主要内容 mmeapi.h 文件是 Windows 多媒体 API 的一部分,主要用于处理波形音频(Waveform Audio)的输入和输出。以下是该文件的…...
sklearn聚类算法用于图片压缩与图片颜色直方图分类
上期文章:机器学习之SKlearn(scikit-learn)的K-means聚类算法 我们分享了sklearn的基本知识与基本的聚类算法,这里主要是机器学习的算法思想,前期文章我们也分享过人工智能的深度学习,二者有如何区别,可以先参考如下几个实例来看看机器学习是如何操作的 不同K值下的聚…...

Llama 3.1要来啦?!测试性能战胜GPT-4o
哎呀,Meta声称将于今晚发布的Llama 3.1,数小时前就在Hugging Face上泄露出来了?泄露的人很有可能是Meta员工? 还是先来看泄露出来的llama3.1吧。新的Llama 3.1模型包括8B、70B、405B三个版本。 而经过网友测试,该base…...
C++使用opencv处理图像阴影部分
1. 直方图均衡化 直方图均衡化是一种增强图像对比度的方法,可以通过均衡化图像的灰度级分布来改善图像中阴影部分的亮度。 #include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取图像Mat image imread("input_image.jpg", IMREA…...

4.Java Web开发模式(javaBean+servlet+MVC)
Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中…...

centos7 mysql 基本测试(6)主从简单测试
centos7 xtrabackup mysql 基本测试(6)主从简单测试 mysql -u etc -p 1234aA~1 参考: centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库:主从复制与读写分离 https://blog.csd…...

信息安全工程师题
防火墙安全策略有两种类型:白名单策略、黑名单策略白名单策略:只允许符合安全规则的包通过防火墙,其他通信包禁止黑名单策略:禁止与安全规则相冲突的包通过防火墙,其他通信包允许实现网络地址转换的方式主要有静态NAT、…...

springcloud rocketmq 新增的消费者组从哪里开始消费
如果新建一个新的消费者组,是否会消费历史消息,导致重复消费? 直接在 console 界面新增消费者组,但是没有办法绑定订阅关系,没有找到入口,在 控制台项目源码 rocketmq-externals 也没有找到可以确定订阅关系…...

Redis-缓存
什么是缓存? 缓存就像自行车和越野车的避震器,降低硬着陆造成的损害 缓存就是系统的避震器,,防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数…...

MySQL练习05
题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…...

[C++][STL源码剖析] 详解AVL树的实现
目录 1.概念 2.实现 2.1 初始化 2.2 插入 2.2.1 旋转(重点) 左单旋 右单旋 双旋 2.❗ 双旋后,对平衡因子的处理 2.3 判断测试 完整代码: 拓展:删除 1.概念 二叉搜索树虽可以缩短查找的效率,但…...
Kubernetes存储 - Node本地存储卷
官方文档 Kubernetes管理的Node本地存储目前有三种,分别是EmptyDir,HostPath,Local,EmptyDir是一种与Pod同生命周期的Node临时存储;HostPath是Node的目录;Local是基于持久卷(PV)管理的Node目录。接下来详细说明这几种类型如何以存…...
Cocos Creator2D游戏开发-(2)Cocos 常见名词
场景(Scene): 它一个容器,容纳游戏中的各个元素,如精灵,标签,节点对象。它负责着游戏的运行逻辑,以帧为单位渲染这些内容。就是你理解到的那个场景; 个人理解就是一个画面, 一个游戏不同的关卡,会有不同的…...

【不同设备间的数据库连接】被连接设备如何开权限给申请连接的设备
为了方便叙述,简称申请连接数据库的设备为a,被连接的为b 1.确保在同一局域网下,检查a的ip 如果你设置的动态ip,那么每重启一次这个ip都会变。两种选择,每次都给b同步一下你的最新ip,或者a设置成静态ip。具…...
Whisper离线部署问题处理
Whisper是OpenAI开发一款开源语音识别模型,可以帮我们低成本的拥有语音识别的能力。具体的安装部署方法,我在这里就不详细说了,网上有很多相关文章: 使用OpenAI的Whisper 模型进行语音识别 (baidu.com) 我这里主要想说的是&…...
【Hive SQL】数据探查-数据抽样
文章目录 数据随机抽样1、随机数排序抽样(rand())2、数据块抽样(tablesample())3、分桶抽样 数据随机抽样 在大规模数据量的数据分析及建模任务中,往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源,…...

微信答题小程序产品研发-需求分析与原型设计
欲知应候何时节,六月初迎大暑风。 我前面说过,我决意仿一款答题小程序,所以我做了大量的调研。 题库软件产品开发不仅仅是写代码这一环,它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 需求分析…...

基础模板Mybatis-plus+Springboot+Mysql开发配置文件
1.pom.xml <dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>// mybatisplus功能<dependency&g…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...