當你逐步熟悉 Elastic 時,你將使用 Elasticsearch Relevance Engine? (ESRE),該引擎旨在為 AI 搜索應用程序提供支持。 借助 ESRE,你可以利用一套開發人員工具,包括 Elastic 的文本搜索、向量數據庫和我們用于語義搜索的專有轉換器模型。
Elastic 提供了多種搜索技術,從文本搜索的行業標準 BM25 開始。 它為特定搜索提供精確匹配,匹配精確的關鍵字,并通過調整進行改進。
當你開始向量搜索時,請記住向量搜索有兩種形式:“密集(dense)”(又名 kNN 向量搜索)和 “稀疏(sparse)”,例如 Elastic 的學習稀疏編碼器 (ELSER)。
Elastic 還為語義搜索提供了開箱即用的 Learned Sparse Encoder 模型。 該模型在各種數據集上都表現出色,例如財務數據、天氣記錄、問答對等。 該模型的構建是為了提供跨領域的巨大相關性,而不需要額外的微調。
查看此交互式演示,了解當您根據 Elastic 的文本 BM25 算法測試 Elastic 的學習稀疏編碼器模型時,搜索結果如何變得更相關。
此外,Elastic還支持密集向量,對文本以外的非結構化數據(例如視頻、圖像、音頻)實現相似性搜索。
語義搜索和向量搜索的優點在于,這些技術允許客戶在搜索查詢中使用直觀的語言。 例如,如果向想搜索有關第二收入的工作場所指南,你可以搜索 “副業”,這不是你在正式人力資源文件中可能看到的術語。
在本指南中,我們將演示如何創建 Elasticsearch 集群、使用 Elastic Web 爬網程序提取數據以及只需單擊幾下即可實現語義搜索。
安裝
Elasticsearch?
我們可參考我之前的文章 “如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch” 來安裝 Elasticsearch。特別地,我們需要按照 Elastic Stack 8.x 的安裝指南來進行安裝。
在 Elasticsearch 終端輸出中,找到 elastic 用戶的密碼和 Kibana 的注冊令牌。 這些是在 Elasticsearch 第一次啟動時打印的。
我們記下這個密碼,并在下面的配置中進行使用。同時它也會生成相應的證書文件:
$ pwd
/Users/liuxg/elastic/elasticsearch-8.12.0
$ cd config/certs/
$ ls
http.p12 http_ca.crt transport.p12
安裝 Kibana
我們接下來安裝 Kibana。我們可以參考我之前的文章 “如何在 Linux,MacOS 及 Windows 上安裝 Elastic 棧中的 Kibana” 來進行我們的安裝。特別地,我們需要安裝 Kibana 8.2 版本。如果你還不清楚如何安裝 Kibana 8.2,那么請閱讀我之前的文章 “Elastic Stack 8.0 安裝 - 保護你的 Elastic Stack 現在比以往任何時候都簡單”。在啟動 Kibana 之前,我們可以修改 Kibana 的配置文件如下。添加如下的句子到 config/kibana.yml 中去:
config/kibana.yml
enterpriseSearch.host: http://localhost:3002
然后,我們使用如下的命令來啟動 Kibana:
我們在瀏覽器中輸入上面輸出的地址然后輸入相應的 enrollment token 就可以把 Kibana 啟動起來。
Java安裝
你需要安裝 Java。版本在?Java 8?或者?Java 11。我們可以參考鏈接來查找需要的 Java 版本。
App search 安裝
我們在地址 Download Elastic Enterprise Search | Elastic 找到我們需要的版本進行下載。并按照頁面上相應的指令來進行按照。如果你想針對你以前的版本進行安裝的話,請參閱地址 https://www.elastic.co/downloads/past-releases#app-search。
等我們下載完 Enterprise Search 的安裝包,我們可以使用如下的命令來進行解壓縮:
$ pwd
/Users/liuxg/elastic
$ ls
elasticsearch-8.12.0 kibana-8.12.0
elasticsearch-8.12.0-darwin-aarch64.tar.gz kibana-8.12.0-darwin-aarch64.tar.gz
enterprise-search-8.12.1.tar.gz logstash-8.12.0-darwin-aarch64.tar.gz
filebeat-8.12.0-darwin-aarch64.tar.gz metricbeat-8.12.0-darwin-aarch64.tar.gz
$ tar xzf enterprise-search-8.12.1.tar.gz
$ cd enterprise-search-8.12.1
$ ls
LICENSE NOTICE.txt README.md bin config lib metricbeat
如上所示,它含有一個叫做 config 的目錄。我們在啟動? Enterprise Search 之前,必須做一些相應的配置。我們需要修改 config/enterprise-search.yml 文件。在這個文件中添加如下的內容:
config/enterprise-search.yml
allow_es_settings_modification: true
secret_management.encryption_keys: ['6c49f8004bfd5cb8c754c8e2f1cbe1f2793624545d052ab48fb37adc481f7d9b']
elasticsearch.username: elastic
elasticsearch.password: "q2rqAIphl-fx9ndQ36CO"
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.12.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601
在上面,請注意 elasticsearch.password 是我們在 Elasticsearch 安裝過程中生成的密碼。elasticsearch.ssl.certificate_authority 必須根據自己的 Elasticsearch 安裝路徑中生成的證書進行配置。在上面的配置中,如果我們沒有配置 secret_management.encryption_keys。我們可以使用上面的配置先運行,然后讓系統幫我們生成。在配置上面的密碼時,我們需要添加上引號。我發現在密碼中含有 * 字符會有錯誤的信息。我們也可以參考鏈接來生成上面的?secret_management.encryption_keys。
$ openssl rand -hex 32
6c49f8004bfd5cb8c754c8e2f1cbe1f2793624545d052ab48fb37adc481f7d9b
我們使用如下的命令來啟動:
bin/enterprise-search
在啟動的過程中,我們可以看到生成的用戶名及密碼信息:
username: enterprise_searchpassword: uy5o6eyssksychcx
我們記下這個用戶名及密碼。在啟動的過程中,我們還可以看到一個生成的?secret_session_key:
我們也把它拷貝下來,并添加到配置文件中去:
allow_es_settings_modification: true
secret_management.encryption_keys: ['6c49f8004bfd5cb8c754c8e2f1cbe1f2793624545d052ab48fb37adc481f7d9b']
elasticsearch.username: elastic
elasticsearch.password: "q2rqAIphl-fx9ndQ36CO"
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.12.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601secret_session_key: fcb5ecfd38095e81c66a36dd5ee0ea076dcb80d9a7dc7f67d46a19ba2390e07d0c71cb6895d8dba05425aa024f2dbad24fafd7310461cf14aa72492ddc39dde7feature_flag.elasticsearch_search_api: true
為了能夠使得我們能夠在 App Search 中使用 Elasticsearch 搜索,我們必須設置
feature_flag.elasticsearch_search_api: true。?我們再次重新啟動 enterprise search:
./bin/enterprise-search
這次啟動后,我們再也不會看到任何的配置輸出了。這樣我們的 enterprise search 就配置好了。
啟動白金試用
由于使用 ELSER 需要用到機器學習的功能,我們需要啟動白金試用:
部署 ELSER
上面的下載過程講持續一段時間。這個依賴于你的網絡速度。
從上面的顯示中,我們可以看出來,ELSER v2 的部署已經是成功的。
配置 Elastic 網絡爬蟲
現在你已經創建了部署,是時候將數據導入 Elasticsearch 了。 讓我們使用 Elastic 的網絡爬蟲來完成此操作。 首先,在 “Search” 選項卡下,
要設置網絡爬蟲,請查看此指南或按照以下說明操作:
現在創建一個索引。 為了本指南的目的,我們通過 elastic.co 攝取博客。
為索引命名后,選擇 “Create inddex”。 接下來,你將 Validate Domain,然后選擇 Add domain。
在右下角添加域后,你將選擇 “Edit”,以便你可以根據需要添加 subdomain。
接下來,您將選擇抓取規則并添加抓取規則,如下所示 .*
我們將提供抓取規則,以僅定位包含整個 elastic.co 網站上的博客的頁面。由于你要抓取的頁面將有鏈接到的頁面,因此你應該添加附加規則以禁止這些鏈接和任何其他鏈接。
接下來,當你稍后選擇字段時,某些字段會超過 512 個標記計數,例如 body_content。 你應該利用提取規則僅過濾掉博客的相關部分。我們將配置一個提取規則,以便僅提取 “main” 頁面元素的內容,該元素包含要爬網的每個博客文章的內容。
使用 Elastic Learned Sparse Encoder 豐富你的數據
按照以下說明開始使用 Elastic Learned Sparse Encoder(Elastic 的開箱即用語義搜索模型)。
為此,你將選擇 Pipeline 并通過選擇頂部的 Copy and customize?來?Unlock your custom pipelines。 接下來,在?Machine Learning Inference Pipelines下,選擇?Deploy?以下載模型并將其安裝到你的 Elasticsearch 部署中。
現在,你需要選擇要應用 ?ELSER text expansion?的字段。 選擇 “title” 和 “main” 作為源字段,然后添加。
接下來,單擊 Continue。
現在你已經創建了 pipeline,請選擇右上角的 “Crawl”,然后選擇 “Crawl all domains on this index”。
我們需要一定的時間才能完成。
為了能夠驗證我們是否已經正確地配置了 Crawler,我們可以在 Kibana 中進行查看:
從上面的輸出中,我們可以看到我們的配置是正確的。我們可以看到想要的字段已經相應的 text expansion 字段。
整個網站的爬蟲是需要一定的時間。我們需要耐心等待。
使用 Elasticsearch
創建搜索查詢
現在是時候搜索你要查找的信息了。 有兩種推薦的方法可以做到這一點:第一種是使用開發工具。 如果你是正在實施搜索(即針對你的 Web 應用程序)的開發人員,你應該使用開發工具來測試和優化索引數據的搜索結果。
在下面,我們了解如何利用開發工具。
GET search-blogs/_search
{"_source": ["title"],"query": {"multi_match": {"query": "Implement a vector database","fields": ["title", "main"]}}
}
這是一個正常的搜索。它沒有使用向量搜索。
接下來,我們使用 ELSER 來進行向量搜索:
GET search-blogs/_search
{"_source": ["title"],"query": {"text_expansion": {"ml.inference.main_expanded.predicted_value": {"model_id": ".elser_model_2","model_text": "Implement a vector database"}}}
}
從上面的搜索結果上看,我們可以看到搜索的結果有一點不一樣。通常向量搜索可以帶給我們更好的語義搜索的結果。
使用 kNN 向量搜索進行攝取和搜索?
我們可以閱讀文章 “ChatGPT 和 Elasticsearch:OpenAI 遇見私有數據(二)” 以了解更多。
更多閱讀:Enterprise:Web Crawler 基礎 (一) (二)?