Elasticsearch:構建 AI 驅動的搜索體驗

Elasticsearch 介紹

當你開始使用 Elastic 時,你將使用 Elasticsearch Relevance Engine?(ESRE),它專為 AI 搜索應用程序提供支持。借助 ESRE,你可以利用一整套開發者工具,包括 Elastic 的文本搜索、向量數據庫以及我們專有的用于語義搜索的 Transformer 模型。

Elastic 提供多種搜索技術,首先是 BM25,它是行業標準的文本搜索方法。BM25 可精準匹配特定搜索,找到精確的關鍵詞,并且可以通過調優提升效果。

在開始向量搜索時,需要了解向量搜索有兩種形式:“dense - 密集”(即 kNN 向量搜索)和 “sparse - 稀疏”。

Elastic 還提供開箱即用的 Learned Sparse Encoder 模型,用于語義搜索。該模型在多個數據集(如金融數據、天氣記錄、問答對等)上的表現優異。該模型無需額外的微調,即可在各個領域提供高相關性的搜索結果。

查看這個交互式演示,看看當 Elastic 的 Learned Sparse Encoder 模型與 Elastic 的 BM25 文字搜索算法對比時,搜索結果如何變得更加相關。

此外,Elastic 還支持密集向量,以實現對文本之外的非結構化數據(如視頻、圖像和音頻)的相似性搜索。

語義搜索和向量搜索的優勢在于,它們允許用戶使用直觀的語言進行搜索查詢。例如,如果你想查找關于第二收入的職場指南,你可以搜索 “side hustle”(side hustle),即使這一術語在正式的 HR 文件中并不常見。

在本指南中,我們將演示如何創建 Elasticsearch,使用 Elastic 網頁爬蟲攝取數據,并通過簡單幾步實現語義搜索。

安裝

Elasticsearch 及 Kibana

我們首先需要安裝 Elasticsearch 及 Kibana。我們可以參考如下的文章來進行安裝:

  • 如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安裝 Elastic 棧中的 Kibana

當我們安裝的時候,選擇 Elastic Stack 8.x 的文章來進行安裝。在本展示中,我們將使用 Elastic Stack 8.17.2 來進行展示。當我們首次運行 Elasticsearch 時,我們可以看到如下的界面:

請記下上面的 elastic 超級用戶的密碼,以備在下面進行使用。你還需要記下上面的 fingerprint 的值,以配置下面的 crawler。如果不記得上面的畫面,那么你可以在 Kibana 的配置文件 config/kibana.yml 文件中找到。

啟動白金試用

創建 API key

我們可以按照如下的步驟來創建一個 API key 供下面的步驟來進行使用:

我們可以拷貝上面的 API key 以供下面的配置進行使用:

安裝 ELSER 模型

如果你還沒有下載 ELSER 模型的話,請參考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR” 來進行安裝。安裝完畢后,我們可以看到如下的畫面:

如上所示,我們已經成功地安裝了 .elser_model_2 模型。

創建 ELSER 端點

我們使用如下的命令來創建一個叫做?my-elser-model 的端點:

PUT _inference/sparse_embedding/my-elser-model
{"service": "elasticsearch","service_settings": {"adaptive_allocations": { "enabled": true,"min_number_of_allocations": 1,"max_number_of_allocations": 10},"num_threads": 1,"model_id": ".elser_model_2" }
}

這個端點在下面的配置中進行使用。

創建 Elasticsearch 索引

我們首先打開 Kibana,并創建一個叫做?elasticsearch-labs-blog?的索引:

上面表明我們已經成功地創建了一個叫做?elasticsearch-labs-blog?的索引。

我們可以通過 Kibana Dev Toosl 來進行檢查:

接下來,添加一個?Semantic Text?類型的字段,我們給它取個非常有創意的名字:semantic_text

我們同樣來通過 Dev Tools 來進行查看:

我們可以看到上面有一個已經生成的 semantic_text 的字段。

寫入數據

配置 Elastic Open Web Crawler

你需要 Docker 來使用 Open Web Crawler

下面是一個簡單的配置文件,它指示爬蟲讀取 Elasticsearch Labs 博客,并將數據寫入 elasticsearch-labs-blog 索引,使用 elasticsearch.host 作為主機,并通過 elasticsearch.api_key 進行身份驗證。

將以下內容復制到一個文件中,并將其命名為 crawler-config-blog.yml,然后根據需要更改 hostapi_key

$ cd demos/
$ ls
azure         deepseek      vector_search
$ mkdir -p crawler-elser/config
$ cd crawler-elser/config
$ vi crawler-config-blog.yml

crawler-config-blog.yml

domains:- url: https://www.elastic.coseed_urls:- https://www.elastic.co/search-labs/blogcrawl_rules:- policy: allowtype: beginspattern: /search-labs/blog- policy: denytype: regexpattern: .*output_sink: elasticsearch
output_index: elasticsearch-labs-blog elasticsearch:host: https://192.168.101.142port: 9200api_key: MjhVbXhwVUJDMkt6RFJJSTJ1RlM6eGFZZ2dpX3pTMTJZNXRJVnJCazljZw==ca_fingerprint: 1deb6039c6b542724612dd267f6f1bc53f40add6350ca865a9948cc977eee545bulk_api.max_items: 5pipeline_enabled: false

:你需要根據自己的配置修改上面的 api_key 及?elasticsearch.ca_fingerprint 值。我們可以參考鏈接來進行配置。你可以使用 ifconfig 來獲取當前電腦上的私有 IP 地址。

現在創建一個 docker-compose.yml 文件。

docker-compose.yml

services:crawler:image: docker.elastic.co/integrations/crawler:latestvolumes:- ./config:/app/configstdin_open: truetty: true
$ pwd
/Users/liuxg/demos/crawler-elser
$ tree -L 2
.
├── config
│?? └── crawler-config-blog.yml
└── docker-compose.yml

并使用以下命令啟動服務:

docker-compose up -d

我們使用如下的命令來進行查看:

docker ps
$ docker ps
CONTAINER ID   IMAGE                                           COMMAND       CREATED              STATUS              PORTS     NAMES
a061113bb26f   docker.elastic.co/integrations/crawler:latest   "/bin/bash"   About a minute ago   Up About a minute             crawler-elser-crawler-1

現在你準備好開始爬取過程了:

docker-compose exec -it crawler bin/crawler crawl /app/config/crawler-config-blog.yml

幾分鐘后,你應該已經將整個 Elasticsearch labs 博客索引完成。

我們通過如下的命令來進行查看:

GET elasticsearch-labs-blog/_search

另外一種運行 crawler 的方式是通過閱讀文章 “Elasticsearch:使用 Open Crawler 和 semantic text 進行語義搜索”。

發生了什么?

博客內容被索引到 body 字段,然后這些內容被轉換為語義文本字段中的稀疏向量。這個轉換包括兩個主要步驟。首先,內容被劃分成較小的、可管理的塊,以確保文本被拆分成有意義的片段,這樣可以更有效地處理和搜索。接下來,每個文本塊使用文本擴展技術被轉換成稀疏向量表示。這個步驟利用 ELSER(Elastic Search Engine for Relevance)將文本轉換成捕捉語義含義的格式,從而實現更準確和相關的搜索結果。

通過將文本字段和 semantic_text 字段都索引到 Elasticsearch,這個過程結合了傳統的關鍵詞搜索和先進的語義搜索的優勢。這個混合搜索提供了全面的搜索功能,確保用戶可以基于原始文本和其潛在意義找到相關信息。

使用 Elasticsearch 來進行搜索

測試搜索查詢 現在是時候搜索你想要的信息了。如果你是一個實現搜索的開發者(例如,為你的網頁應用程序實現搜索),你應該使用 Console/Dev Tools 來測試和優化你索引數據的搜索結果。

我們從一個簡單的 multi_match 查詢開始,它將匹配 “title” 和 “body” 字段中的文本。由于這是一個經典的詞匯搜索(還不是語義搜索),像 “how to implement multilingual search”這樣的查詢將匹配你提供的單詞。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"query": {"multi_match": {"query": "how to implement multilingual search","fields": ["title","body"]}}
}
  "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 10.187533,"hits": [{"_index": "elasticsearch-labs-blog","_id": "9d9385fd1d6e37586d1d05e08197a3e52d7e211d","_score": 10.187533,"_source": {"title": "How to implement image similarity search in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 5.8747864,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 5.803198,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "787f3c1fe1192f92b6cd656c45afeb3b73dbcad0","_score": 5.469969,"_source": {"title": "Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "cad40b1b9a5e3d410cc3193ab61c6303e6ff79c6","_score": 5.3935347,"_source": {"title": "Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 5.39243,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},

在這種情況下,前 5 個匹配結果還不錯,但并不完美。

How to implement image similarity search in Elasticsearch - Elasticsearch Labs
Scalar quantization optimized for vector databases - Elasticsearch Labs
Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs
Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs

現在嘗試使用語義查詢,它會自動將文本 “how to implement multilingual search?” 轉換為向量表示,并對 semantic_text 字段執行查詢。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"query": {"semantic": {"field": "semantic_text","query": "how to implement multilingual search?"}}
}
 "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 23.57368,"hits": [{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 23.57368,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 22.532505,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9621418190a5fe3a472fbaa228676560d034566e","_score": 22.302826,"_ignored": ["meta_description.keyword"],"_source": {"title": "How to search languages with compound words - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "7a1464445379516bf694c5677b2835c96a1c13a6","_score": 21.983751,"_source": {"title": "Dataset translation with LangChain, Python & Vector Database for multilingual insights - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "626be320dfa0b30e915b59ce7355002692c54599","_score": 20.928116,"_source": {"title": "Agentic RAG with Elasticsearch & Langchain - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 20.376408,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},

你從這個語義搜索中得到的前五個結果看起來好多了。

Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs
How to search languages with compound words - Elasticsearch Labs
Dataset translation with LangChain, Python & Vector Database for multilingual insights - Elasticsearch Labs
gentic RAG with Elasticsearch & Langchain - Elasticsearch Labs

為什么不同時使用兩者呢?創建一個混合搜索查詢

使用倒排排名融合(RRF)是混合檢索系統中的一種技術,用于提高搜索結果的相關性。它將不同的檢索方法(如詞匯(傳統)搜索和語義搜索)結合起來,以增強整體搜索性能。

通過利用 RRF,查詢確保最終的文檔列表是來自兩種檢索方法的最佳結果的平衡組合,從而提高搜索結果的整體相關性和多樣性。這種融合技術彌補了單一檢索方法的局限性,提供了更全面、更準確的結果集。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"retriever": {"rrf": {"retrievers": [{"standard": {"query": {"multi_match": {"fields": ["title","body"],"query": "how to implement multilingual search"}}}},{"standard": {"query": {"semantic": {"field": "semantic_text","query": "how to implement multilingual search"}}}}]}}
}
  "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 0.03226646,"hits": [{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 0.03226646,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 0.031513646,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 0.031280547,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9621418190a5fe3a472fbaa228676560d034566e","_score": 0.03079839,"_ignored": ["meta_description.keyword"],"_source": {"title": "How to search languages with compound words - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "787f3c1fe1192f92b6cd656c45afeb3b73dbcad0","_score": 0.030330881,"_source": {"title": "Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "cad40b1b9a5e3d410cc3193ab61c6303e6ff79c6","_score": 0.029877368,"_source": {"title": "Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9d9385fd1d6e37586d1d05e08197a3e52d7e211d","_score": 0.016393442,"_source": {"title": "How to implement image similarity search in Elasticsearch - Elasticsearch Labs"}},

混合搜索的前5個結果包含了非常好的結果,所有結果都與如何使用 Elasticsearch 實現多語言搜索高度相關:

Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Scalar quantization optimized for vector databases - Elasticsearch Labs
Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs
How to search languages with compound words - Elasticsearch Labs
Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs

下一步

感謝你花時間自建 Elasticsearch 并為你的數據設置語義搜索。在你開始使用 Elastic 的旅程時,了解一些你在跨環境部署時作為用戶應該管理的操作、安保和數據組件。

準備好開始了嗎?在 Elastic Cloud 上啟動免費的 14 天試用,或嘗試這 15 分鐘的動手學習,了解搜索 AI 101。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73309.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73309.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙生態開發

鴻蒙生態開發概述 鴻蒙生態是華為基于開源鴻蒙(OpenHarmony)構建的分布式操作系統生態,旨在通過開放共享的模式連接智能終端設備、操作系統和應用服務,覆蓋消費電子、工業物聯網、智能家居等多個領域。以下從定義與架構、核心技術…

JVM如何處理Java中的精度轉換: 從源碼到字節碼

你好,我是 shengjk1,多年大廠經驗,努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注!你會有如下收益: 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么,評論或者私信告訴我! 文章目錄 一…

vue-next-admin修改配置指南

官方文檔地址:vue-next-admin 1.如何開啟側邊欄logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 設置為true即可默認打開 2.修改側邊欄頂部的logo與文字 先把想要的圖標存到我的項目然后下載 然后把后面的幾個文件拉…

gin學習

gin學習筆記,不僅包含了基本的增刪查改外,還包括參數傳遞,上傳下載,模版、session與中間件等,方便收藏自習可用 文章目錄 獲得個請求get打印字符串get請求xmlget請求跳轉http方法路由可以通過Context的Param方法來獲取…

Flutter運行錯誤:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通過Android Studio導入Flutter項目并運行,結果一直跑不起來,錯誤日志如下: 執行命令查看版本信息: flutter doctor --verbose通過輸出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【計算機網絡運輸層詳解】

文章目錄 一、前言二、運輸層的功能1. 端到端通信2. 復用與分用3. 差錯檢測4. 流量控制5. 擁塞控制 三、運輸層協議:TCP 和 UDP1. TCP:面向連接的可靠傳輸協議2. UDP:無連接的傳輸協議 四、端口號與進程通信1. 端口號分類2. 端口通信模型 五、…

51單片機和STM32 入門分析

51單片機和STM32是嵌入式開發中兩種主流的微控制器,它們在架構、性能、應用場景等方面存在顯著差異。以下是兩者的對比分析及選擇建議: 1. 51單片機與STM32的定義與特點 51單片機 定義:基于Intel 8051內核的8位微控制器,結構簡單…

開源視覺語言模型MiniMax-VL-01:動態分辨率+4M超長文本,性能比肩GPT-4o

在人工智能領域,構建能夠像人類一樣理解、思考和行動的智能體(AI Agent)一直是研究人員的終極目標之一。而實現這一目標的關鍵在于模型是否具備足夠強大的感知能力、記憶能力和推理能力。近期,國內人工智能公司MiniMax重磅開源了其…

excel 列單元格合并(合并列相同行)

代碼 首先自定義注解CellMerge,用于標記哪些屬性需要合并,哪個是主鍵**(這里做了一個優化,可以標記多個主鍵)** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable適配達夢7 (2.1)

經過第一版的問題解決,后端項目可以啟動,前端頁面也集成進去。 前端在流程設計頁面報錯 之后發現主要是組件中modelerStore這個值沒有 解決方法:在data增加對象 給component/process/designer.vue 中涉及到的每個子組件傳入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一鍵部署

新項目舊項目都需要給研發配置mysql監控,這里mysql監控對應aws 阿里云 騰訊云 華為云的云mysql產品或開源自建mysql。 exporter安裝雖然簡單,經常手動操作不免讓人心煩,一鍵完成省去繁瑣的常規操作。 配置信息對的情況下測試多次都可以正常安…

2025年移動端開發性能優化實踐與趨勢分析

啟動速度優化 本質:縮短首次可見幀渲染時間。 方法: iOS:利用Core ML本地模型輕量化部署,減少云端等待。Android:強制啟用SplashScreen API,通過setKeepOnScreenCondition控制動畫時長。冷啟動需將耗時操…

【MySQL篇】DEPENDENT SUBQUERY(依賴性子查詢)優化:從百秒到秒級響應的四種優化辦法

💫《博主介紹》:?又是一天沒白過,我是奈斯,從事IT領域? 💫《擅長領域》:??擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(…

全文 - MLIR Toy Tutorial Chapter 1: Toy Language and AST

Toy 語言 本教程,將會借助一個玩具語言來講解,這個語言我們稱其為 Toy。Toy 是一個基于張量的語言,它允許你定義函數,執行一些數學計算,并且打印結果。做這樣的設定,是因為我們希望讓教程保持簡明&#xff…

排序復習_代碼純享

頭文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序&#xff08;穩定&#xff09; void InsertSort(vecto…

CSS語言的雙向鏈表

CSS語言的雙向鏈表 引言 在計算機科學中&#xff0c;數據結構是一個極為重要的概念&#xff0c;而鏈表則是最常見的數據結構之一。鏈表可以分為單向鏈表和雙向鏈表&#xff0c;其中雙向鏈表因其靈活性和高效性而受到廣泛應用。在前端開發的領域&#xff0c;尤其是CSS&#xf…

簡單理解機器學習中top_k、top_p、temperature三個參數的作用

AI系列文章&#xff1a; AWS AI認證考試中經常提及幾個重要的工具介紹 簡單理解機器學習中top_k、top_p、temperature三個參數的作用 用Deepseek Kimi 快速生成高質量的ppt 在機器學習中&#xff0c;top_k、top_p 和 temperature 是用于控制生成模型&#xff08;如語言模型…

紅寶書第十三講:詳解JavaScript核心對象:Array、Object、Date、RegExp

紅寶書第十三講&#xff1a;詳解JavaScript核心對象&#xff1a;Array、Object、Date、RegExp 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、Object&#xff1a;萬物皆對象的“盒子” Object是JavaScript中…

昆侖技術重構AI大模型落地范式,長期作“加法”迎來國產生態化“拐點”

作者 | 曾響鈴 文 | 響鈴說 DeepSeek的爆火&#xff0c;在業內迅速掀起了一場國產化的變革。“國產大模型國產算力”軟硬協同的范式正在被重構&#xff0c;AI產業國產化的含金量持續提升&#xff0c;越來越多的企業在這一趨勢下加速走上數智化轉型路徑。 其中&#xff0c;以…

原開源鴻蒙倉庫停止更新

2月24日&#xff0c;gitee 上的開源鴻蒙組織&#xff0c;所有代碼停止更新&#xff0c;查看代碼倉顯示已關閉&#xff0c;不少小伙伴以為停止更新了&#xff0c;發生了什么&#xff1f; 原因很簡單&#xff0c;所有代碼倉遷移至 Gitcode&#xff0c;至于為什么改用 Gitcode&…