【Elasticsearch】全文搜索与相关性排序

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

【Elasticsearch】全文搜索与相关性排序

引言

在当今数字化信息爆炸的时代,高效准确的搜索功能成为了众多应用不可或缺的一部分。无论是电商平台上查找心仪的商品,还是在海量文档库中迅速定位所需资料,强大的搜索能力都能极大提升用户体验和工作效率。而 Elasticsearch 作为一款流行的分布式搜索引擎,以其卓越的全文搜索和灵活的相关性排序功能脱颖而出,成为了众多开发者和企业的首选。

全文搜索,简单来说,就是在文本数据中根据用户输入的关键词找到与之相关的文档。但这一过程背后却蕴含着复杂而精妙的技术原理。从用户输入关键词的那一刻起,Elasticsearch 需要经过多个步骤来理解用户意图,并从海量数据中筛选出最相关的结果。这其中涉及到文本分析,即将输入的文本转化为计算机能够理解和处理的形式;倒排索引的构建与使用,它是实现快速搜索的关键数据结构。

相关性排序则是另一个关键环节。搜索结果的排序直接影响用户获取信息的效率和满意度。Elasticsearch 提供了丰富的排序策略,可以根据关键词的匹配程度、文档的新鲜度、字段的权重等多种因素进行综合排序。通过合理运用这些排序机制,我们能够让搜索结果更加符合用户的期望,将最有价值的信息呈现给用户。

在接下来的文章中,我们将深入探索 Elasticsearch 的全文搜索原理和相关性排序机制。通过详细的理论阐述、实际案例分析以及代码示例,帮助读者全面掌握这两项核心技术,为开发出高效智能的搜索应用奠定坚实的基础。

一、Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的开源搜索引擎。它旨在提供分布式环境下的全文搜索、结构化搜索以及分析功能。Elasticsearch 具备高可用性、可扩展性和高性能等特点,能够处理 PB 级别的数据。

1.1 分布式架构

Elasticsearch 采用分布式架构,允许将数据分散存储在多个节点上。一个 Elasticsearch 集群可以包含多个节点,每个节点可以存储数据的一部分。这种分布式存储方式不仅提高了数据的可靠性和可用性,还能够通过并行处理提高搜索性能。

1.2 RESTful API

Elasticsearch 通过 RESTful API 与外部系统进行交互。开发者可以使用 HTTP 请求来创建索引、插入文档、执行搜索查询等操作。这种简单易用的 API 使得 Elasticsearch 能够方便地集成到各种应用程序中。

二、Elasticsearch 的 Maven 依赖

在使用 Elasticsearch 进行开发时,我们需要在项目中引入相应的 Maven 依赖。以下是一些常用的依赖:

2.1 Elasticsearch 客户端依赖

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.4</version>
</dependency>

这个依赖提供了高级 REST 客户端,用于与 Elasticsearch 集群进行交互。它封装了底层的 HTTP 操作,提供了更方便的 API 来执行各种操作,如索引管理、文档操作和搜索查询等。

2.2 Elasticsearch 核心依赖

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.4</version>
</dependency>

Elasticsearch 核心依赖包含了 Elasticsearch 的核心功能和类库。它是整个 Elasticsearch 运行的基础,提供了数据存储、索引构建、搜索算法等核心功能。

2.3 其他依赖

根据项目的具体需求,可能还需要引入其他依赖,如 JSON 处理库、日志库等。例如,Jackson 库用于处理 JSON 数据,在 Elasticsearch 中用于文档的序列化和反序列化:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4</version>
</dependency>

日志库如 Log4j 或 SLF4J 可以帮助我们记录 Elasticsearch 客户端的运行日志,方便调试和监控:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.32</version>
</dependency>
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

三、全文搜索原理

3.1 文本分析过程

文本分析是 Elasticsearch 全文搜索的第一步,它的目的是将输入的文本转化为适合搜索的形式。文本分析主要包括以下几个阶段:

3.1.1 字符过滤(Character Filter)

字符过滤阶段会对输入的原始文本进行预处理,例如去除 HTML 标签、转换特殊字符等。Elasticsearch 提供了多种字符过滤器,如 html_strip 字符过滤器可以去除文本中的 HTML 标签。

3.1.2 分词(Tokenizer)

分词是将文本分割成一个个独立的词(token)的过程。不同的语言和应用场景需要不同的分词器。例如,对于英文文本,常用的分词器有 standard 分词器,它会根据空格和标点符号进行分词;对于中文文本,常用的分词器有 ik 分词器,它能够对中文进行智能分词。

3.1.3 词元转换(Token Filter)

词元转换阶段会对分词后的词元进行进一步处理,例如将词元转换为小写、去除停用词(如“的”“是”“在”等无实际意义的词)、进行词干提取(将单词转换为其基本形式)等。

3.2 倒排索引的构建

倒排索引是 Elasticsearch 实现快速搜索的核心数据结构。它与传统的正向索引相反,正向索引是从文档到词的映射,而倒排索引是从词到文档的映射。

假设我们有以下三个文档:

  • 文档 1:“Elasticsearch is a powerful search engine”
  • 文档 2:“Lucene is the foundation of Elasticsearch”
  • 文档 3:“Search engines are essential for information retrieval”

经过文本分析后,我们得到了一系列的词元。倒排索引会将每个词元映射到包含该词元的文档列表。例如,“Elasticsearch”这个词元会映射到文档 1 和文档 2;“search”这个词元会映射到文档 1 和文档 3。

在 Elasticsearch 中,倒排索引以段(Segment)的形式存储在磁盘上。每个段都是一个独立的倒排索引,随着新文档的不断插入,会生成多个段。为了提高搜索效率,Elasticsearch 会定期将多个段合并成一个更大的段。

3.3 倒排索引的使用

当用户发起一个搜索请求时,Elasticsearch 首先会对用户输入的关键词进行文本分析,得到相应的词元。然后,根据这些词元在倒排索引中查找包含这些词元的文档列表。

例如,用户搜索“Elasticsearch search”,Elasticsearch 会对这两个关键词进行文本分析,得到“elasticsearch”和“search”这两个词元。接着,在倒排索引中查找这两个词元对应的文档列表,最后将两个文档列表进行合并和排序,得到最终的搜索结果。

四、相关性排序

4.1 根据关键词匹配程度排序

关键词的匹配程度是影响相关性排序的重要因素之一。Elasticsearch 使用 BM25 算法来计算文档与关键词的匹配程度。BM25 算法考虑了多个因素,如词频(关键词在文档中出现的次数)、文档长度、逆文档频率(关键词在整个索引中出现的文档数的倒数)等。

以下是一个简单的搜索请求示例,使用 match 查询来搜索“Elasticsearch”,并按照默认的相关性排序返回结果:

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("content", "Elasticsearch"));
searchRequest.source(searchSourceBuilder);RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

4.2 根据文档新鲜度排序

在一些应用场景中,我们希望最新的文档排在前面。Elasticsearch 可以通过文档的时间戳字段来实现按新鲜度排序。

假设我们的文档中有一个 timestamp 字段记录文档的创建时间,以下是一个按新鲜度排序的搜索请求示例:

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort(new FieldSortBuilder("timestamp").order(SortOrder.DESC));
searchRequest.source(searchSourceBuilder);RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

4.3 根据字段权重排序

不同的字段在搜索结果中的重要性可能不同。我们可以通过设置字段的权重来影响相关性排序。例如,在一个商品搜索应用中,商品标题字段可能比商品描述字段更重要,我们可以给标题字段设置更高的权重。

以下是一个设置字段权重的搜索请求示例:

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("keyword", "title^3", "description"));
searchRequest.source(searchSourceBuilder);RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

在这个示例中,title^3 表示给 title 字段设置了 3 倍的权重。

4.4 综合排序

在实际应用中,我们通常需要综合考虑多个因素进行排序。例如,我们希望先按关键词匹配程度排序,然后在匹配程度相同的情况下按文档新鲜度排序。

以下是一个综合排序的搜索请求示例:

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("content", "keyword"));
searchSourceBuilder.sort(new FieldSortBuilder("timestamp").order(SortOrder.DESC));
searchRequest.source(searchSourceBuilder);RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

五、总结

通过深入了解 Elasticsearch 的全文搜索原理和相关性排序机制,我们能够充分发挥其强大的搜索功能,为用户提供更加高效准确的搜索体验。在实际应用中,我们需要根据具体的业务需求,合理运用文本分析、倒排索引以及各种排序策略,不断优化搜索性能和结果质量。

Elasticsearch 作为一款功能强大的搜索引擎,在不断发展和完善。开发者需要持续关注其官方文档和最新版本,掌握新的特性和功能,以应对日益复杂的搜索需求。希望本文能够帮助读者更好地理解和应用 Elasticsearch 的全文搜索与相关性排序技术,为开发出优秀的搜索应用提供有益的参考。

参考资料文献

  1. Elasticsearch 官方文档
  2. 《Elasticsearch 实战》,Riverside Publishing
  3. 《Lucene 实战》,Manning Publications Co.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【React】插槽渲染机制

目录 通过 children 属性结合条件渲染通过 children 和 slot 属性实现具名插槽通过 props 实现具名插槽 在 React 中&#xff0c;并没有直接类似于 Vue 中的“插槽”机制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通过 props和 children 来实现类似插槽的功能…

【Go】Go Gorm 详解

1. 概念 Gorm 官网&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;这是官网的介绍&#xff0c;简单来说 Gorm 就是一款高性能的 Golang ORM 库&#xff0c;便于开发人员提高效率 那…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库&#xff0c;如下图&#xff1a; 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境&#xff1a; 1. 安装和配置Prometheus&#xff1a; - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

【Apache Doris】周FAQ集锦:第 29 期

引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目&#xff0c;希望帮助社…

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…

计算机网络 (42)远程终端协议TELNET

前言 Telnet&#xff08;Telecommunication Network Protocol&#xff09;是一种网络协议&#xff0c;属于TCP/IP协议族&#xff0c;主要用于提供远程登录服务。 一、概述 Telnet协议是一种远程终端协议&#xff0c;它允许用户通过终端仿真器连接到远程主机&#xff0c;并在远程…

汽车网络信息安全-ISO/SAE 21434解析(上)

目录 概述 第四章-概述 1. 研究对象和范围 2. 风险管理 第五章-组织级网络安全管理 1. 网络安全治理&#xff08;cybersecurity governance&#xff09; 2. 网络安全文化&#xff08;cybersecurity culture) 3. 信息共享&#xff08;Information Sharing) 4. 管理体系…

cursor+deepseek构建自己的AI编程助手

文章目录 准备工作在Cursor中添加deepseek 准备工作 下载安装Cursor &#xff08;默认安装在C盘&#xff09; 注册deepseek获取API key 在Cursor中添加deepseek 1、打开cursor&#xff0c;选择设置 选择Model&#xff0c;添加deepseek-chat 注意这里去掉其他的勾选项&…

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器&#xff0c;使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

STM32网络通讯之CubeMX实现LWIP项目设计(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.…

【Unity-Game4Automation PRO 插件】

Game4Automation PRO 插件 是一个用于 Unity 引擎 的工业自动化仿真工具&#xff0c;它提供了对工业自动化领域的仿真和虚拟调试支持&#xff0c;特别是在与工业机器人、生产线、PLC 系统的集成方面。该插件旨在将工业自动化的实时仿真与游戏开发的高质量 3D 可视化能力结合起来…

【安卓开发】【Android】总结:安卓技能树

【持续更新】 对笔者在安卓开发的实践中认为必要的知识点和遇到的问题进行总结。 一、基础知识部分 1、Android Studio软件使用 软件界面 最新的版本是瓢虫&#xff08;Ladybug&#xff09;&#xff0c;bug的确挺多。笔者更习惯使用电鳗&#xff08;Electric Eel&#xff0…

鸿蒙打包发布

HarmonyOS应用/元服务发布&#xff08;打包发布&#xff09; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥&#xff1a;包含非对称加密中使用的公钥和私钥&#xff0c;存储在密钥库文件中&#xff0c;格式…

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比

先说结论&#xff1a; Swgger 3.0 与Swagger 2.0 区别很大&#xff0c;Swagger3.0用了最新的注释实现更强大的功能&#xff0c;同时使得代码更优雅。 就个人而言&#xff0c;如果新项目推荐使用Swgger 3.0&#xff0c;对于工具而言新的一定比旧的好&#xff1b;对接于旧项目原…

SAP 固定资产常用的数据表有哪些,他们是怎么记录数据的?

在SAP系统中&#xff0c;固定资产管理&#xff08;FI-AA&#xff09;涉及多个核心数据表&#xff0c;用于记录资产主数据、折旧、交易等。以下是常用的数据表及其记录数据的逻辑&#xff1a; 1. ANKT - 资产主数据表 功能&#xff1a;存储资产主数据的文本描述。 字段&#x…

光伏储能电解水制氢仿真模型Matlab/Simulink

今天更新的内容为光伏储能制氢技术&#xff0c;这个方向我之前在21年就系统研究并发表过相关文章&#xff0c;经过这几年的发展&#xff0c;绿色制氢技术也受到更多高校的注意&#xff0c;本篇博客也是在原先文章的基础上进行更新。 首先让大家熟悉一下绿氢制取技术这个概念&a…

Redis 3.2.1在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要&#xff0c;也可以从官网下载&#xff1a;https://github.com/MicrosoftArchive/redis/releases 这个是微软以前维护的Windows版Redis安装包&#xff0c;如果想要比较新的版本可以从别人维护的项目里下&#xff08;https://…

基于springboot+vue.js+uniapp技术开发的一套大型企业MES生产管理系统源码,支持多端管理

企业级智能制造MES系统源码&#xff0c;技术架构&#xff1a;springboot vue-element-plus-admin 企业级云MES全套源码&#xff0c;支持app、小程序、H5、台后管理端 MES指的是制造企业生产过程执行系统&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统。MES系…