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,然后根據需要更改 host 和 api_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。