Elasticsearch 高级搜索技巧和最佳实践
Elasticsearch 高级搜索技巧和最佳实践
Elasticsearch 是一个开源的分布式搜索和分析引擎,它支持实时地存储、搜索和分析大规模数据。它被广泛应用于各行各业,用于构建高性能的搜索引擎、日志分析系统、电子商务推荐系统等。
本文将介绍 Elasticsearch 的高级搜索技巧和最佳实践,包括如何构建复杂的查询、使用各种查询类型以及优化搜索性能。同时会提供相关的编程代码和配置示例,以帮助读者更好地理解这些搜索技巧和最佳实践。
### 1. 基本搜索及其参数
#### 匹配查询
匹配查询是 Elasticsearch 中最基本的查询类型,它会将查询字符串与索引中的字段进行匹配,并返回匹配的结果。以下是一个使用匹配查询的例子:
json
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
上述示例中,我们在 `my_index` 索引中查询所有包含 "Elasticsearch" 的文档。
#### 多字段查询
有时我们需要在多个字段中进行查询,并返回匹配任意字段的结果。以下是一个使用多字段查询的例子:
json
GET /my_index/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["title", "content"]
}
}
}
上述示例中,我们在 `title` 和 `content` 字段中查询包含 "Elasticsearch" 的文档。
#### 前缀查询
前缀查询用于匹配以指定前缀开头的文本。以下是一个使用前缀查询的例子:
json
GET /my_index/_search
{
"query": {
"prefix": {
"title": "ela"
}
}
}
上述示例中,我们在 `title` 字段中查询以 "ela" 开头的文档。
#### 通配符查询
通配符查询允许我们使用通配符来匹配文本。以下是一个使用通配符查询的例子:
json
GET /my_index/_search
{
"query": {
"wildcard": {
"title": "el*sear*"
}
}
}
上述示例中,我们在 `title` 字段中查询匹配模式 "el*sear*" 的文档。
#### 正则表达式查询
正则表达式查询允许我们使用正则表达式来匹配文本。以下是一个使用正则表达式查询的例子:
json
GET /my_index/_search
{
"query": {
"regexp": {
"title": "el[a-z]*sear[a-z]*"
}
}
}
上述示例中,我们在 `title` 字段中查询匹配正则表达式模式 "el[a-z]*sear[a-z]*" 的文档。
#### 范围查询
范围查询用于匹配一个指定范围内的数值或日期。以下是一个使用范围查询的例子:
json
GET /my_index/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
上述示例中,我们在 `price` 字段中查询价格在 100 到 200 之间的文档。
以上仅为基本搜索的一些示例,Elasticsearch 还提供了更多强大的查询类型和参数供我们使用。接下来我们将介绍复合查询。
### 2. 复合查询
复合查询是由多个查询组合而成的查询,它可以更灵活地满足我们的搜索需求。
#### Bool 查询
Bool 查询是 Elasticsearch 中最常用的复合查询类型,它将多个子查询通过逻辑运算符组合在一起。以下是一个使用 Bool 查询的例子:
json
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "term": { "title": "Elasticsearch" } },
{ "range": { "price": { "gte": 100 } } }
],
"must_not": [
{ "term": { "category": "deprecated" } }
],
"should": [
{ "term": { "tags": "search" } },
{ "term": { "tags": "analysis" } }
],
"filter": {
"range": { "date": { "gte": "2022-01-01" } }
}
}
}
}
上述示例中,我们使用 Bool 查询构建了一个复合查询。其中 `must` 条件表示必须满足的查询,`must_not` 条件表示不能满足的查询,`should` 条件表示应该满足的查询,`filter` 条件用于缩小范围。这样结合不同的条件和逻辑运算符,我们可以实现更精确的查询。
#### Constant Score 查询
Constant Score 查询是一个简单的复合查询类型,它会给每个符合条件的文档指定一个固定的分数,不考虑实际匹配度。以下是一个使用 Constant Score 查询的例子:
json
GET /my_index/_search
{
"query": {
"constant_score": {
"filter": {
"term": { "category": "search" }
},
"boost": 1.2
}
}
}
上述示例中,我们使用 Constant Score 查询对所有包含 "search" 的文档进行匹配,并为它们设置一个固定的分数 1.2。
#### Dis Max 查询
Dis Max 查询是一个复合查询类型,它将多个子查询分别计算得分,并返回最高分的文档。以下是一个使用 Dis Max 查询的例子:
json
GET /my_index/_search
{
"query": {
"dis_max": {
"queries": [
{ "term": { "title": "Elasticsearch" } },
{ "term": { "content": "Elasticsearch" } }
],
"tie_breaker": 0.2
}
}
}
上述示例中,我们使用 Dis Max 查询对 `title` 和 `content` 字段进行匹配,并返回得分最高的文档。`tie_breaker` 参数用于调整子查询得分的权重。
#### Function Score 查询
Function Score 查询是一个复合查询类型,它通过将自定义的函数应用于每个文档的得分,来调整搜索结果的排序或过滤。以下是一个使用 Function Score 查询的例子:
json
GET /my_index/_search
{
"query": {
"function_score": {
"query": { "match_all": {} },
"functions": [
{ "filter": { "term": { "category": "search" } }, "weight": 2 },
{ "filter": { "term": { "category": "analysis" } }, "weight": 1 }
],
"boost_mode": "sum"
}
}
}
上述示例中,我们使用 Function Score 查询对所有文档进行匹配,并通过自定义的函数给不同的 `category` 字段设置不同的权重,最后将得分求和作为最终的排序依据。
### 3. 高亮搜索结果
在搜索结果中高亮显示匹配的关键词可以帮助用户更好地定位结果。以下是一个使用高亮的搜索示例:
json
GET /my_index/_search
{
"query": {
"match": {
"content": "Elasticsearch"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
上述示例中,我们在 `content` 字段中搜索包含 "Elasticsearch" 的文档,并使用高亮显示匹配的关键词。
### 4. 排序与分页
通过排序可以将搜索结果按照指定的字段进行排序,而分页可以将搜索结果按照指定的页码和每页大小进行分页显示。以下是一个排序和分页的搜索示例:
json
GET /my_index/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "price": "asc" }
],
"from": 0,
"size": 10
}
上述示例中,我们对所有文档进行排序,按照 `price` 字段的升序排列。同时设置 `from` 和 `size` 参数,表示从第 0 条记录开始,每页显示 10 条记录。
### 5. 聚合查询
聚合查询可以对搜索结果进行统计和分析,并返回相应的聚合结果。以下是一个使用聚合查询的示例:
json
GET /my_index/_search
{
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
上述示例中,我们对 `price` 字段进行平均值计算,并返回聚合结果。
更多文章:技数未来网 (techdatafuture.com)
相关文章:
Elasticsearch 高级搜索技巧和最佳实践
Elasticsearch 高级搜索技巧和最佳实践 Elasticsearch 是一个开源的分布式搜索和分析引擎,它支持实时地存储、搜索和分析大规模数据。它被广泛应用于各行各业,用于构建高性能的搜索引擎、日志分析系统、电子商务推荐系统等。 本文将介…...
解决 .csv 文件上传到 pgsql 的字符报错问题
目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时,报错显示如下: ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…...
linux自动挂载并添加用户权限
目录 写在前面自动挂载完 写在前面 1、本文内容 linux挂载文件后,没有文件权限,使用uid和gid指定所需的所有者和所属组 2、平台/环境 linux 3、转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/132539384 自动挂载 开…...
【C++】学习STL中的stack和queue
❤️前言 今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。 正文 stack和queue的使用方式非常简单,我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。 stack和queue的模拟实现 stack和q…...
Java捕获异常
在Java中,凡是可能抛出异常的语句,都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中,然后使用catch捕获对应的Exception及其子类。 使用try ... catch ... finally时: 多个catch语句的匹配顺序非常重要…...
【LLM】快速开始 LangChain
theme: orange LangChain是一个软件开发工具包,它通过将组件链接在一起并公开简单统一的API,简化了大型语言模型和应用程序的集成。本篇文章将会简要介绍,让各位开发者对其有一个整体的认识。 前言 如果你是一名软件开发人员,努力…...
Unity中立体声平移的应用
实现的效果 若从左声道开始,播放效果逐渐从左声道过渡到右声道,再从右声道过渡到左声道,具体效果请戴上耳机播放下列视频。 StereoPanning 代码实现 public class AudioInfo {[HideInInspector] public float[] StereoTranslationValues;//立…...
jupyter常用的方法以及快捷键
选中状态 蓝色 按enter 进入编辑状态 编辑状态 绿色 按Esc 进入选中状态 Code模式运行是运行代码 Markdown模式运行是进入预览状态 - - - 是文本格式的一种精简的语法形式 Raw NBConvert 是默认文本状态 - - - 输入什么样 展示什么样 Y - - - 切换code模式 M - - - 切换Markdo…...
SQL Server 操作JSON数据库列
Sql Server 从 2016 开始支持了一些 json 操作,但在SqlServer中Json还是被存储为字符串,如下: use [tempdb]declare JSON nvarchar(max) set JSONN{"id": "WakefieldFamily","parents": [{ "familyName&q…...
拼多多开放平台的API接口可以获取拼多多电商数据。以下是API接口流程
使用拼多多开放平台的API接口可以获取拼多多电商数据。以下是一般的API接口流程: 1. 注册开发者账号:首先,您需要在拼多多开放平台注册一个开发者账号。通过开发者账号,您可以获得API密钥和其他必要的信息。 2. 鉴权与认证&…...
使用Docker安装和部署kkFileView
🎈1 参考文档 kkFileView官方文档 🚀2 安装kkFileView 拉取Redis镜像。 docker pull keking/kkfileview启动docker容器。 docker run -it -d -p 8012:8012 keking/kkfileview --restart always解释: docker run redis # 从kkfileview镜像运行…...
胆囊结石3mm严重吗(解析胆囊结石的危害和处理方法)
胆囊结石是指胆囊内形成的固体结晶,大小不一,主要由胆固醇、胆汁色素和钙盐等物质组成。胆囊结石是一种比较常见的疾病,据统计,我国胆囊结石的患病率约为5%~10%左右。那么,胆囊结石3mm严重吗?下面就来一起了解一下。 …...
全新UI站长在线工具箱系统源码带后台开源版
该系统的全开源版本可供下载,并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上传插件、添加增减删功能。 环…...
maven的依赖下载不下来的几种解决方法
前言 每次部署测试环境,从代码库拉取代码,都会出现缺少包的情况。然后找开发一通调试,到处拷包。 方案一:pom文件注释/取消注释 注释掉pom.xml里的报红色的依赖(同时可以把本地maven库repo里对应的包删除)&…...
CAR-T商品化的第一步
1、CAR-T细胞的体外扩增能力 CAR-T细胞疗法需要先从患者体内获得T淋巴细胞,然后通过体外转基因技术 transduce CAR靶向结构域。这一过程需要在细胞培养体系中得到充分的扩增,以获得足够的治疗CAR-T细胞数量。因此,CAR-T细胞的体外扩增能力直…...
yolov2相较于yolov1的改进
目录 前言 BN层取代了Dropout 使用了高分辨率分类器 K-means选定先验框的尺寸 网络结构—darknet19 细粒度的特征 前言 yolov2是在yolov1的基础上进行改进的,主要解决了yolov1定位不准确以及检测重叠的物体极差的情况,总的来说,它有以下…...
如何在Spring Boot应用中使用Nacos实现动态更新数据源
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
代码随想录算法训练营day1~18总结
时间、空间复杂度,解题过程中运用的函数补充说明 数组 day1: http://t.csdn.cn/dBSgY day2: http://t.csdn.cn/JTDvH 数组总结 链表 day3:http://t.csdn.cn/mJx9V day4:http://t.csdn.cn/qiGqz 链表总结 哈希表 day6:…...
【炼气境】HashMap原理以及如何使用
系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么?4、你知道 hash 的实现吗?为什么要这样实现?5、为什么要用异或运算符?6、HashMap 的 table 的容量如何确定?l…...
QT基础教程之七Qt消息机制和事件
QT基础教程之七Qt消息机制和事件 事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
