Elasticsearch:使用 ES|QL 進行搜索和過濾

本教程展示了 ES|QL 語法的示例。請參考 Query DSL 版本,以獲得等效的 Query DSL 語法示例。

這是一個使用 ES|QL 進行全文搜索和語義搜索基礎知識的實踐介紹。

有關 ES|QL 中所有搜索功能的概述,請參考《使用 ES|QL 進行搜索》。

在這個場景中,我們為一個烹飪博客實現搜索功能。該博客包含各種屬性的食譜,包括文本內容、分類數據和數字評分。

安裝

如果你還沒有安裝好自己的 Elasticsearch 及 Kibana,請參考如下的文章來進行安裝。你可以選擇 Elastic Stack 8.x 的安裝步驟來進行安裝:

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

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

如果你想使用 docker 來進行一鍵安裝,請參考文章 “使用 start-local 腳本在本地運行 Elasticsearch”。

運行 ES|QL 查詢

在本教程中,你將看到以下格式的 ES|QL 示例:

FROM cooking_blog
| WHERE description:"fluffy pancakes"
| LIMIT 1000

如果你想在 Dev Tools 控制臺中運行這些查詢,你需要使用以下語法:

POST /_query?format=txt
{"query": """FROM cooking_blog| WHERE description:"fluffy pancakes"| LIMIT 1000"""
}

如果你更喜歡使用你最喜歡的編程語言,請參考客戶端庫,以獲取官方和社區支持的客戶端列表。

步驟 1:創建索引

創建 cooking_blog 索引以開始:

PUT /cooking_blog

現在為索引定義映射:

PUT /cooking_blog/_mapping
{"properties": {"title": {"type": "text","analyzer": "standard", /* 1 */"fields": {             /* 2 */"keyword": {"type": "keyword","ignore_above": 256 /* 3 */}}},"description": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"author": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"date": {"type": "date","format": "yyyy-MM-dd"},"category": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"tags": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"rating": {"type": "float"}}
}
  1. 如果未指定 analyzer,文本字段默認使用 standard analyzer。這里包含它是為了演示目的。
  2. 這里使用 multi-fields 將文本字段同時索引為 text 和 keyword 數據類型。這使得在同一個字段上既能進行全文搜索,也能進行精確匹配 / 過濾。注意,如果使用動態映射,這些 multi-fields 會自動創建。
  3. ignore_above 參數會防止在 keyword 字段中索引長度超過 256 個字符的值。同樣,這是默認值,這里包含它是為了演示目的。它有助于節省磁盤空間,并避免 Lucene 的 term 字節長度限制所帶來的潛在問題。

提示:全文搜索依賴于文本分析。文本分析會對文本數據進行規范化和標準化處理,從而可以高效地存儲到倒排索引中,并實現近實時搜索。分析會在索引時和搜索時同時進行。本教程不會詳細介紹分析過程,但了解文本是如何被處理的對于創建高效的搜索查詢非常重要。

步驟 2:向索引添加示例博客文章

現在你需要使用 Bulk API 索引一些示例博客文章。注意,文本字段會在索引時進行分析,并生成 multi-fields。

POST /cooking_blog/_bulk?refresh=wait_for
{"index":{"_id":"1"}}
{"title":"Perfect Pancakes: A Fluffy Breakfast Delight","description":"Learn the secrets to making the fluffiest pancakes, so amazing you won't believe your tastebuds. This recipe uses buttermilk and a special folding technique to create light, airy pancakes that are perfect for lazy Sunday mornings.","author":"Maria Rodriguez","date":"2023-05-01","category":"Breakfast","tags":["pancakes","breakfast","easy recipes"],"rating":4.8}
{"index":{"_id":"2"}}
{"title":"Spicy Thai Green Curry: A Vegetarian Adventure","description":"Dive into the flavors of Thailand with this vibrant green curry. Packed with vegetables and aromatic herbs, this dish is both healthy and satisfying. Don't worry about the heat - you can easily adjust the spice level to your liking.","author":"Liam Chen","date":"2023-05-05","category":"Main Course","tags":["thai","vegetarian","curry","spicy"],"rating":4.6}
{"index":{"_id":"3"}}
{"title":"Classic Beef Stroganoff: A Creamy Comfort Food","description":"Indulge in this rich and creamy beef stroganoff. Tender strips of beef in a savory mushroom sauce, served over a bed of egg noodles. It's the ultimate comfort food for chilly evenings.","author":"Emma Watson","date":"2023-05-10","category":"Main Course","tags":["beef","pasta","comfort food"],"rating":4.7}
{"index":{"_id":"4"}}
{"title":"Vegan Chocolate Avocado Mousse","description":"Discover the magic of avocado in this rich, vegan chocolate mousse. Creamy, indulgent, and secretly healthy, it's the perfect guilt-free dessert for chocolate lovers.","author":"Alex Green","date":"2023-05-15","category":"Dessert","tags":["vegan","chocolate","avocado","healthy dessert"],"rating":4.5}
{"index":{"_id":"5"}}
{"title":"Crispy Oven-Fried Chicken","description":"Get that perfect crunch without the deep fryer! This oven-fried chicken recipe delivers crispy, juicy results every time. A healthier take on the classic comfort food.","author":"Maria Rodriguez","date":"2023-05-20","category":"Main Course","tags":["chicken","oven-fried","healthy"],"rating":4.9}

步驟 3:執行基本的全文搜索

全文搜索涉及在一個或多個文檔字段上執行基于文本的查詢。這些查詢會根據文檔內容與搜索詞的匹配程度為每個匹配的文檔計算相關性評分。Elasticsearch 提供了多種查詢類型,每種類型都有其自己的文本匹配方式和相關性評分機制。

ES|QL 提供兩種方式來執行全文搜索:

  1. 完整 match 函數語法: match(field, "search terms")
  2. 使用 match 運算符的簡潔語法: field::"search terms"

兩種方式是等效的,可以互換使用。簡潔語法更簡潔,而函數語法則允許更多配置選項。為了簡潔,我們將在大多數示例中使用簡潔語法。

有關函數語法可用的高級參數,請參考 match 函數參考文檔。

基本全文查詢

以下是在 description 字段中搜索 "fluffy pancakes" 的方法:

FROM cooking_blog  /* 1 */
| WHERE description:"fluffy pancakes" /* 2 */
| LIMIT 1000 /* 3 */
  1. 指定要搜索的索引
  2. 全文搜索默認使用 OR 邏輯
  3. 返回最多 1000 條結果

注意:結果的排序不是按相關性,因為我們尚未請求 _score 元數據字段。我們將在下一節中介紹相關性評分。

默認情況下,就像 Query DSL 的 match 查詢一樣,ES|QL 在詞項之間使用 OR 邏輯。這意味著它會匹配在 description 字段中包含 "fluffy" 或 "pancakes",或兩者都有的文檔。

提示:你可以使用 KEEP 命令控制響應中包含哪些字段:

FROM cooking_blog
| WHERE description:"fluffy pancakes"
| KEEP title, description, rating 
| LIMIT 1000

更多有關 ES|QL 的查閱,請閱讀 “Elasticsearch:ES|QL 查詢展示”。

在匹配查詢中要求所有詞項

有時你需要確保所有搜索詞都出現在匹配的文檔中。以下是使用函數語法和 operator 參數實現這一點的方法:

FROM cooking_blog
| WHERE match(description, "fluffy pancakes", {"operator": "AND"}) 
| LIMIT 1000
POST _query?format=csv
{"query": """FROM cooking_blog| WHERE match(description, "fluffy pancakes", {"operator": "AND"}) | LIMIT 1000"""
}

由于沒有文檔在 description 中同時包含 "fluffy" 和 "pancakes",因此這個更嚴格的搜索在我們的示例數據中返回零條結果。

指定匹配的最小詞項數

有時,要求所有詞項匹配過于嚴格,而默認的 OR 行為又過于寬松。你可以指定必須匹配的最小詞項數:

FROM cooking_blog
| WHERE match(title, "fluffy pancakes breakfast", {"minimum_should_match": 2})
| LIMIT 1000

此查詢搜索 title 字段,要求至少匹配 3 個詞項中的 2 個:"fluffy"、"pancakes" 或 "breakfast"。

步驟 4:語義搜索和混合搜索

索引語義內容

Elasticsearch 允許你根據文本的意義進行語義搜索,而不僅僅是依賴特定關鍵詞的存在。當你希望找到與給定查詢在概念上相似的文檔時,即使它們不包含精確的搜索詞,也非常有用。

當你的映射中包含 semantic_text 類型的字段時,ES|QL 支持語義搜索。這個示例映射更新添加了一個名為 semantic_description 的新字段,類型為 semantic_text:

PUT /cooking_blog/_mapping
{"properties": {"semantic_description": {"type": "semantic_text"}}
}

接下來,將包含內容的文檔索引到新字段中:

POST /cooking_blog/_doc
{"title": "Mediterranean Quinoa Bowl","semantic_description": "A protein-rich bowl with quinoa, chickpeas, fresh vegetables, and herbs. This nutritious Mediterranean-inspired dish is easy to prepare and perfect for a quick, healthy dinner.","author": "Jamie Oliver","date": "2023-06-01","category": "Main Course","tags": ["vegetarian", "healthy", "mediterranean", "quinoa"],"rating": 4.7
}

注意:在上面,我們并沒有指名是使用什么方法進行的向量化。在默認的情況下,它使用的是 ELSER 模型。你需要啟動 ELSER。詳細的部署,請參考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR”。

執行語義搜索

一旦文檔被底層模型處理并運行在推理端點上,你就可以執行語義搜索。以下是針對 semantic_description 字段的一個自然語言查詢示例:

FROM cooking_blog
| WHERE semantic_description:"What are some easy to prepare but nutritious plant-based meals?"
| LIMIT 5

執行混合搜索

你可以將全文搜索和語義查詢結合起來。在這個示例中,我們結合了全文搜索和語義搜索,并使用了自定義權重:

FROM cooking_blog METADATA _score
| WHERE match(semantic_description, "easy to prepare vegetarian meals", { "boost": 0.75 })OR match(tags, "vegetarian", { "boost": 0.25 })
| SORT _score DESC
| LIMIT 5

步驟 5:一次搜索多個字段

當用戶輸入搜索查詢時,他們通常不知道(或不關心)他們的搜索詞是否出現在特定字段中。ES|QL 提供了同時在多個字段中進行搜索的方法:

FROM cooking_blog
| WHERE title:"vegetarian curry" OR description:"vegetarian curry" OR tags:"vegetarian curry"
| LIMIT 1000

這個查詢在 title、description 和 tags 字段中搜索 "vegetarian curry"。每個字段的重要性相同。

然而,在許多情況下,某些字段(如標題)中的匹配可能比其他字段更相關。我們可以通過評分來調整每個字段的重要性:

FROM cooking_blog METADATA _score /* 1 */
| WHERE match(title, "vegetarian curry", {"boost": 2.0}) /* 2 */OR match(description, "vegetarian curry") OR match(tags, "vegetarian curry")
| KEEP title, description, tags, _score /* 3 */
| SORT _score DESC /* 4 */
| LIMIT 1000
  1. 請求 _score 元數據以獲取基于相關性的結果
  2. 標題匹配的重要性是其他字段的兩倍
  3. 在結果中包含相關性評分
  4. 必須明確按 _score 排序才能查看基于相關性的結果

提示:在 ES|QL 中使用相關性評分時,理解 _score 非常重要。如果你在查詢中不包含 METADATA _score,你將無法在結果中看到相關性評分。這意味著你將無法根據相關性進行排序或基于相關性評分進行過濾。

當你包含 METADATA _score 時,WHERE 條件中的搜索功能會貢獻相關性評分。過濾操作(如范圍條件和精確匹配)不會影響評分。

如果你想要最相關的結果排在前面,必須通過顯式使用 SORT _score DESC 或 SORT _score ASC 來按 _score 排序。

步驟 6:過濾和查找精確匹配

過濾允許你根據精確標準縮小搜索結果的范圍。與全文搜索不同,過濾是二元的(是/否),并且不會影響相關性評分。過濾執行比查詢更快,因為排除的結果不需要進行評分。

FROM cooking_blog
| WHERE category.keyword == "Breakfast" 
| KEEP title, author, rating, tags
| SORT rating DESC
| LIMIT 1000

使用 keyword 字段進行精確匹配(區分大小寫)。

注意:這里使用了 category.keyword。它指的是 category 字段的 keyword 多字段,確保進行精確的、區分大小寫的匹配。

在日期范圍內搜索帖子

通常,用戶希望找到在特定時間范圍內發布的內容:

FROM cooking_blog
| WHERE date >= "2023-05-01" AND date <= "2023-05-31" 
| KEEP title, author, date, rating
| LIMIT 1000

包含日期范圍過濾器。

查找精確匹配

有時,用戶希望搜索精確的術語,以消除搜索結果中的歧義:

FROM cooking_blog
| WHERE author.keyword == "Maria Rodriguez" 
| KEEP title, author, rating, tags
| SORT rating DESC
| LIMIT 1000

在 author 字段上進行精確匹配。

與 Query DSL 中的 term 查詢類似,這種查詢沒有靈活性,并且區分大小寫。

步驟 7:組合多個搜索條件

復雜的搜索通常需要組合多個搜索條件:

FROM cooking_blog METADATA _score
| WHERE rating >= 4.5 AND NOT category.keyword == "Dessert" AND (title:"curry spicy" OR description:"curry spicy") 
| SORT _score DESC
| KEEP title, author, rating, tags, description
| LIMIT 1000

將相關性評分與自定義條件結合

對于更復雜的相關性評分和組合條件,你可以使用 EVAL 命令來計算自定義評分:

FROM cooking_blog METADATA _score
| WHERE NOT category.keyword == "Dessert"
| EVAL tags_concat = MV_CONCAT(tags.keyword, ",") /* 1 */
| WHERE tags_concat LIKE "*vegetarian*" AND rating >= 4.5 /* 2 */ 
| WHERE match(title, "curry spicy", {"boost": 2.0}) OR match(description, "curry spicy") /* 3 */
| EVAL category_boost = CASE(category.keyword == "Main Course", 1.0, 0.0) /* 4 */ 
| EVAL date_boost = CASE(DATE_DIFF("month", date, NOW()) <= 1, 0.5, 0.0) /* 5 */
| EVAL custom_score = _score + category_boost + date_boost /* 6 */
| WHERE custom_score > 0 /* 7 */
| SORT custom_score DESC
| LIMIT 1000
  1. 將多值字段轉換為字符串
  2. 通配符模式匹配
  3. 使用全文本功能,將更新 _score 元數據字段
  4. 條件加權
  5. 加權最近內容
  6. 組合評分
  7. 基于自定義評分進行過濾

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

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

相關文章

Java 動態代理實現

Java 動態代理實現 一、JDK動態代理二、CGLIB動態代理三、動態代理的應用場景四、JDK代理與CGLIB代理比較 動態代理是Java中一種強大的技術&#xff0c;它允許在運行時創建代理對象&#xff0c;用于攔截對目標對象的方法調用。 一、JDK動態代理 JDK動態代理是Java標準庫提供的代…

Apache IoTDB V2.0.2/V1.3.4 發布|新增表模型權限管理、UDF、嵌套查詢功能

Release Announcement Version 2.0.2/1.3.4 Apache IoTDB V2.0.2、V1.3.4 已經發布&#xff01; V2.0.2 作為樹表雙模型正式版本&#xff0c;主要新增表模型權限管理、用戶管理以及相關操作鑒權&#xff0c;并新增了表模型 UDF、系統表和嵌套查詢等功能。 V1.3.4 主要新增模式…

鴻蒙開發11-ARKUI框架

ARKUI&#xff08;方舟 UI 框架&#xff09;是 HarmonyOS Next&#xff08;原 OpenHarmony&#xff09;的核心 UI 開發框架&#xff0c;基于聲明式編程范式&#xff0c;支持 ArkTS 語言&#xff0c;能夠高效構建跨設備的響應式應用。以下是對 ARKUI 框架及開發的詳細介紹&#…

Linux 進程間通信詳解

一.進程間通信介紹 1. 進程間通信概念 進程間通信&#xff08;Inter-Process Communication, IPC&#xff09;是指在不同進程之間傳遞或交換信息的一種機制。在操作系統中&#xff0c;進程是資源分配和獨立運行的基本單位&#xff0c;它們擁有各自獨立的內存空間和系統資源。…

從0開始掌握動態規劃

動態規劃的核心思想 -- 以空間換時間 復雜點說通過分解問題為子問題并存儲子問題解來優化復雜計算的算法策略。 簡單看個問題。 一&#xff0c;初始&#xff1a;求最長連續遞增子序列 nums [10,9,2,5,3,7,101,18] 求上面數組中的最長連續遞增子序列&#xff0c;輸出其長度 …

Python Requests 庫:從安裝到精通

摘要 本文詳細介紹 Python Requests 庫的安裝與使用&#xff0c;通過常見示例讓你輕松掌握。 一、引言 在當今的互聯網時代&#xff0c;與各種 Web 服務進行交互是非常常見的需求。Python 作為一門功能強大且易于學習的編程語言&#xff0c;提供了許多用于網絡請求的庫&…

Manus技術架構、實現內幕及分布式智能體項目實戰

Manus技術架構、實現內幕及分布式智能體項目實戰 模塊一&#xff1a; 剖析Manus分布式多智能體全生命周期、九大核心模塊及MCP協議&#xff0c;構建低幻覺、高效且具備動態失敗處理能力的Manus系統。 模塊二&#xff1a; 解析Manus大模型Agent操作電腦的原理與關鍵API&#xf…

C算術運算符 printf輸出格式 字符指針打印輸出 使用scanf函數進行輸入

一 算術運算符 加, 一元取正 - 減, 一元取負 * 乘 / 除 % 求余 -- 自減1 自加1 邏輯運算符 && 邏輯與 || 邏輯或 ! 邏輯非 關系運算符 > 大于 > 大于等于 < 小于 < 小于等于 等于 ! 不等于 位運算符號 & 按位與 | 按位或 ^ 按位異或…

STM32中Hz和時間的轉換

目錄 一、常見的頻率單位及其轉換 二、計算公式 三、STM32中定時器的應用 四、例子 一、常見的頻率單位及其轉換 赫茲&#xff08;Hz&#xff09;是頻率的國際單位&#xff0c;表示每秒鐘周期性事件發生的次數。 1 kHz&#xff08;千赫茲&#xff09; 1,000 Hz1 MHz&#…

《分布式軟總線:不同頻段Wi-Fi環境下設備發現兼容性難題》

分布式軟總線技術作為實現設備互聯互通的關鍵&#xff0c;正逐漸成為構建萬物互聯世界的基石。然而&#xff0c;當分布式軟總線面臨不同頻段Wi-Fi環境時&#xff0c;設備發現的兼容性問題成為了阻礙其廣泛應用的一大挑戰。這一問題不僅影響著用戶體驗&#xff0c;也制約著分布式…

MCP(Model Context Protocol 模型上下文協議)科普

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是由人工智能公司 Anthropic 于 2024年11月 推出的開放標準協議&#xff0c;旨在為大型語言模型&#xff08;LLM&#xff09;與外部數據源、工具及服務提供標準化連接&#xff0c;從而提升AI在實際…

【mongodb】數據庫操作

目錄 1. 查看所有數據庫2. 切換到指定數據庫&#xff08;若數據庫不存在&#xff0c;則創建&#xff09;3. 查看當前使用的數據庫4. 刪除當前數據庫5.默認數據庫 1. 查看所有數據庫 1.show dbs2.show databases 2. 切換到指定數據庫&#xff08;若數據庫不存在&#xff0c;則…

ICPR-2025 | 讓機器人在未知環境中 “聽懂” 指令精準導航!VLTNet:基于視覺語言推理的零樣本目標導航

作者&#xff1a;Congcong Wen, Yisiyuan Huang, Hao Huang ,Yanjia Huang, Shuaihang Yuan, YuHao, HuiLin and Yi Fang 單位&#xff1a;紐約大學阿布扎比分校具身人工智能與機器人實驗室&#xff0c;紐約大學阿布扎比分校人工智能與機器人中心&#xff0c;紐約大學坦登工程…

基于DeepSeek的考研暑假日志分析

注&#xff1a;我去年考研時寫了日志&#xff0c;大致記錄了我每天的主要活動。由于過于瑣碎&#xff0c;一直沒有翻看。突發奇想&#xff0c;現在利用deepseek總結其中規律。 從你的日志中可以總結出以下規律和活動興衰起落&#xff1a; ??一、學習活動規律與演變?? ??…

【刷題Day20】TCP和UDP

TCP 和 UDP 有什么區別&#xff1f; TCP提供了可靠、面向連接的傳輸&#xff0c;適用于需要數據完整性和順序的場景。 UDP提供了更輕量、面向報文的傳輸&#xff0c;適用于實時性要求高的場景。 特性TCPUDP連接方式面向連接無連接可靠性提供可靠性&#xff0c;保證數據按順序…

REST 架構詳解:從概念到應用的全面剖析

REST&#xff08;Representational State Transfer&#xff09;即表述性狀態轉移&#xff0c;是一種用于構建網絡應用程序的架構風格和設計理念&#xff0c;由計算機科學家羅伊?菲爾丁&#xff08;Roy Fielding&#xff09;在 2000 年提出。以下是關于它的詳細介紹&#xff1a…

藍橋杯之遞歸二

1.數的劃分 題目描述 將整數 nn 分成 kk 份&#xff0c;且每份不能為空&#xff0c;任意兩份不能相同(不考慮順序)。 例如&#xff1a;n7&#xff0c;k3n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。 1&#xff0c;1&#xff0c;5;1&#xff0c;5&#xff0c;…

LeetCode(Hot.2)—— 49.字符異位詞分組題解

Problem: 49. 字母異位詞分組 字母異位詞的定義是&#xff1a;兩個單詞的字母組成一樣&#xff0c;但順序可以不同&#xff0c;比如 eat、tea 和 ate 就是一個組的。 思路 將每個字符串按字母排序&#xff0c;把排序后的字符串作為 key&#xff0c;相同 key 的放在一個 list 中…

為什么信號完整性對于高速連接器設計至關重要?

外部連接器通過在各種電子元件和系統之間可靠地傳輸數據而不損失保真度來保持信號完整性。在本文中&#xff0c;我們將討論信號完整性的重要性&#xff0c;回顧高速部署挑戰&#xff0c;并重點介紹各種連接器設計策略&#xff0c;以防止失真和降級。 了解連接器信號完整性挑戰…

得物官網sign簽名逆向分析

打開得物官網&#xff0c;點擊鞋類&#xff0c;可以看到請求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…