【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.pswp.cn/web/66245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66245.shtml
英文地址,請注明出處:http://en.pswp.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. 管理體系…

【0393】Postgres內核 checkpointer process ③ 構建 WAL records 工作緩存區

1. 初始化 ThisTimeLineID、RedoRecPtr 函數 InitXLOGAccess() 內部會初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局變量。 下面是這四個變量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…

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 是首批通過去噪完整文本在多種語言上預訓練序列到序列模型的方…

潯川社團官方文章被 Devpress 社區收錄!

潯川社團官方文章被 Devpress 社區收錄&#xff01; 親愛的潯川社團成員們以及關注我們的朋友們&#xff1a; 在這個充滿活力與機遇的社團發展歷程中&#xff0c;我們迎來了一則令人振奮的喜訊&#xff01;潯川社團精心創作的官方文章&#xff0c;成功被 Devpress 社區收錄啦&a…

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.…

簡單組合邏輯

多路選擇器 在多路數據傳輸過程中&#xff0c;能夠將任意一路選出來的電路叫做數據選擇器&#xff0c;也稱多路選擇器。對于一個具有2^n個輸入和一個輸出的多路選擇器&#xff0c;有n個選擇變量&#xff0c;多路選擇器也是FPGA內部的一個基本資源&#xff0c;主要用于內部信號的…

【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;對接于舊項目原…

神經網絡基礎-價格分類案例

文章目錄 1. 需求分析2. 導入所需工具包3. 構建數據集4. 構建分類網絡模型5. 訓練模型6. 模型訓練7. 評估模型8. 模型優化 學習目標&#xff1a; 掌握構建分類模型流程動手實踐整個過程 1. 需求分析 小明創辦了一家手機公司&#xff0c;他不知道如何估算手機產品的價格。為了…