当前位置: 首页 > news >正文

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语句的匹配顺序非常重要&#xf…...

【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 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出&#xff0c…...

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。这种包含平方项、三角函数或指数函数的方程,传统手工计算不仅耗时还容易出错。我去年做机器人运动学分析时&#xf…...

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. 五笔输入法:为什么值得初学者投入时间? 在拼音输入法大行其道的今天,很多初学者可能会疑惑:为什么要花时间学习看起来更复杂的五笔输入法?其实答案很简单——效率。我十年前刚开始接触五笔时也有同样的困惑&#xf…...