分布式搜索引擎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…...

java-poi实现excel自定义注解生成数据并导出
因为项目很多地方需要使用导出数据excel的功能,所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…...

LeetCode707 设计链表
前言 题目: 707. 设计链表 文档: 代码随想录——设计链表 编程语言: C 解题状态: 代码功底不够,只能写个大概 思路 主要考察对链表结构的熟悉程度,对链表的增删改查,比较考验代码功底以及对链表…...

[Mysql-DDL数据操作语句]
目录 DDL语句操作数据库 库: 查看:show 创建:creat 删除:drop 使用(切换):use 表: 查看:desc show 创建:create 表结构修改 rename as add drop modify change rename as …...

google 浏览器插件开发简单学习案例:TodoList;打包成crx离线包
参考: google插件支持: https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件,具体网页可以参考下面链接 TodoList网页: https://blog.csdn.net/weixin_42357472/article/de…...

如何学习Doris:糙快猛的大数据之路(从入门到专家)
引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…...

梯度下降算法,gradient descent algorithm
定义:是一个优化算法,也成最速下降算法,主要的部的士通过迭代找到目标函数的最小值,或者收敛到最小值。 说人话就是求一个函数的极值点,极大值或者极小值 算法过程中有几个超参数: 学习率n,又称…...

Spring boot 2.0 升级到 3.3.1 的相关问题 (六)
文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 (六)spring-data-redis 和 Spring AOP 警告的问题问题描述问题调研结论解决方案方案1-将冲突的Bean 提升为InfrastructureBean方案2 其他相关资料 Spring boot 2.0 升级到 3.3.1 的相关问题 ÿ…...

C++模版基础知识与STL基本介绍
目录 一. 泛型编程 二. 函数模板 1. 概念 2. 函数模版格式 3. 函数模版的原理 4. 模版函数的实例化 (1). 隐式实例化 (2.) 显式实例化 5. 模版参数的匹配原则 三. 类模板 1. 类模板的定义格式 2. 类模板的实例化 四. STL的介绍 1. 什么是STL? 2. STL的版…...

Android 防止重复点击
1.第一种方式: // 两次点击按钮之间的点击间隔不能少于1000毫秒 private static final int MIN_CLICK_DELAY_TIME 700; private static long lastClickTime; /** * 是否是快速点击 * return */ public static boolean isFastClick() { …...

使用阿里云云主机通过nginx搭建文件服务器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备基础环境二、安装配置nginx三、阿里云安全组配置安全组配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4ee96f38312e4771938e40f463987…...