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 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,…...
RMBG-2.0与LangChain集成:智能内容生成系统搭建
RMBG-2.0与LangChain集成:智能内容生成系统搭建 1. 引言 你有没有遇到过这样的情况:做电商需要批量处理商品图片,做新媒体需要快速生成内容素材,做设计需要智能抠图换背景?传统方法要么费时费力,要么效果…...
3D点云分割实战:如何用稀疏卷积SparseConvNet提升模型效率(附Facebook开源库指南)
3D点云分割实战:稀疏卷积SparseConvNet的高效实现与调优指南 在自动驾驶、机器人导航和增强现实等领域,3D点云数据的处理正成为计算机视觉的新前沿。与密集的2D图像不同,点云数据天生具有稀疏性——场景中大部分区域是空白,仅有少…...
coze-loop应用指南:在数据分析、Web开发等场景下的优化技巧
coze-loop应用指南:在数据分析、Web开发等场景下的优化技巧 1. 工具介绍与核心功能 coze-loop是一款基于Ollama框架的AI代码优化工具,它将复杂的代码优化过程简化为三步操作:选择目标、粘贴代码、获取优化建议。这个工具特别适合需要快速提…...
如何突破Cursor AI试用限制:3种方法重新获得Pro功能
如何突破Cursor AI试用限制:3种方法重新获得Pro功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...
Python实战:利用SymPy与SciPy高效破解复杂非线性方程组
1. 为什么需要SymPy和SciPy解非线性方程组? 遇到工程计算或科研问题时,我们常需要解像这样的方程组:xy10且yz34。这种包含平方项、三角函数或指数函数的方程,传统手工计算不仅耗时还容易出错。我去年做机器人运动学分析时…...
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力 【免费下载链接】liebling Beautiful and clean Ghost theme that is easy and comfortable to use. To get the latest version please head over the releases page 👉&#…...
Git Diff View:三分钟学会实用的代码差异对比组件
Git Diff View:三分钟学会实用的代码差异对比组件 【免费下载链接】git-diff-view A Diff View component for React / Vue, just like Github 项目地址: https://gitcode.com/gh_mirrors/gi/git-diff-view 你是否曾经在代码审查中为理解复杂的Git差异而头疼…...
别再瞎调优先级了!STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点
别再瞎调优先级了!STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点 刚接触FreeRTOS的嵌入式开发者,往往会在STM32CubeMX的图形化配置界面里迷失方向。那些看似简单的下拉菜单和复选框,背后却藏着让系统崩溃的陷阱。我曾见过一个工程师将任…...
AI编程助手Trae使用详解
Trae是字节跳动推出的AI原生集成开发环境,支持macOS和Windows双平台,内置Claude-3.5、GPT-4o、DeepSeek等顶级AI模型,具备代码补全、智能问答等核心功能。相比传统编辑器,Trae的最大特点是深度集成了AI协作能力,可以实…...
打字侠全面支持三大五笔输入法:初学者快速上手指南
1. 五笔输入法:为什么值得初学者投入时间? 在拼音输入法大行其道的今天,很多初学者可能会疑惑:为什么要花时间学习看起来更复杂的五笔输入法?其实答案很简单——效率。我十年前刚开始接触五笔时也有同样的困惑…...
