Elasticsearch:解鎖深度匹配,運用Elasticsearch DSL構建閃電般的高效模糊搜索體驗

目錄

Elasticsearch查詢分類

葉子查詢

全文檢索查詢

match查詢

multi_match查詢

精確查詢

term查詢

range查詢

復雜查詢

bool查詢簡單應用

bool查詢實現排序和分頁

bool查詢實現高亮

場景分析

問題思考

解決方案

?search_after方案(推薦)

point in time方案

方案比較


Elasticsearch查詢分類

Elasticsearch的查詢可以分為兩大類:

葉子查詢(Leaf query clauses):一般是在特定的字段里查詢特定值,屬于簡單查詢,很少單獨使用。

復合查詢(Compound query clauses):以邏輯方式組合多個葉子查詢或者更改葉子查詢的行為方式。

葉子查詢

全文檢索查詢

用分詞器對用戶輸入搜索條件先分詞,得到詞條,然后再利用倒排索引搜索詞條。

match查詢

可以以一個分詞,例如"GB"得到所有name中帶“GB”的數據

# match查詢所有
GET /items/_search
{"query": {"match": {"name": "GB"}}
}

實現效果如下:(總共有17條數據中name有“GB”)

multi_match查詢

match類似的還有multi_match,區別在于可以同時對多個字段搜索,而且多個字段都要滿足,語法示例:

GET /items/_search
{"query": {"multi_match": {"query": "電腦","fields": ["name", "category"]}}
}

實現效果如下:(即name和brand都必須帶“電腦”)

精確查詢

不對用戶輸入搜索條件分詞,根據字段內容精確值匹配。但只能查找keyword、數值、日期、boolean類型的字段。

term查詢

# term查詢所有
GET /items/_search
{"query": {"term": {"brand": {"value": "Dell"}}}
}

實現效果如下:(不在對搜索條件分詞)

range查詢


# range查詢所有
GET /items/_search
{"query": {"range": {"price": {"gte": 10000,"lte": 200000}}}
}

實現效果如下:(對price范圍查詢: 10000<查詢值<200000)

復雜查詢

bool查詢簡單應用

GET /items/_search
{"query": {"bool": {"must": [{"match": {"name": "GB"}}],"filter": [{"term": {"brand": "Apple"}},{"range": {"price": {"gte": 100000,"lte": 2000000}}}]}}
}

實現效果如下:(name中要有“GB”,brand中有“Apple”,且100000<查詢值<2000000)

bool查詢實現排序和分頁


GET /items/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"},"sold": {"order": "asc"}}],"from": 0,"size": 5
}

實現效果解讀:查詢所有數據,先以price降序排序,price相同,以sold升序排序,一頁五條。

bool查詢實現高亮

我們在百度,京東搜索時,關鍵字會變成紅色,比較醒目,這叫高亮顯示。

事實上elasticsearch已經提供了給搜索關鍵字加標簽的語法,無需我們自己編碼。

GET /items/_search
{"query": {"match": {"name": "手機"}},"highlight": {"fields": {"name": {}}}
}

實現效果如下:(給手機加上了<em>標簽)

場景分析

問題思考

  1. elasticsearch的數據一般會采用分片存儲,也就是把一個索引中的數據分成N份,存儲到不同節點上。這種存儲方式比較有利于數據擴展,但給分頁帶來了一些麻煩。
  2. 比如一個索引庫中有100000條數據,分別存儲到4個分片,每個分片25000條數據。現在每頁查詢10條,查詢第99頁。
  3. 實現思路來分析,肯定是將所有數據排序,找出前1000名,截取其中的990~1000的部分。但問題來了,我們如何才能找到所有數據中的前1000名呢?
  4. 要知道每一片的數據都不一樣,第1片上的第900~1000,在另1個節點上并不一定依然是900~1000名。所以我們只能在每一個分片上都找出排名前1000的數據,然后匯總到一起,重新排序,才能找出整個索引庫中真正的前1000名。

解決方案

?search_after方案(推薦)

search_after提供了一種基于上一次查詢結果中最后一個文檔的排序值來“繼續”下一頁的方式。這要求每次查詢都必須帶上前一次查詢結果中的排序值,從而避免了深度分頁的問題。

GET /_search
{"size": 10,"query": {"match": {"title": "elasticsearch"}},"search_after": [123456], // 上一個查詢結果中的排序值"sort": [{"_id": "desc"}]
}

point in time方案

從Elasticsearch 7.10版本開始引入的point in time功能,提供了比scroll(一個過時的方案,官方棄用)更靈活的方式來遍歷結果集。與scroll不同,point in time不會自動關閉搜索上下文,而是需要顯式地關閉它,這樣可以在一定程度上減少資源消耗。

POST /my-index/_pit?keep_alive=1m
{}GET /_search
{"size": 10,"query": {"match": {"title": "elasticsearch"}},"pit": {"id": "wmx3UmRBY1VnVUJqQlNvMzZQRVhBQT09LS1RY1hZRkRBPT0=","keep_alive": "1m"},"sort": [{"_id": "asc"}]
}

方案比較

search_after?是解決前端深度分頁的最佳選擇,因為它效率高且易于實現。(簡單)

point in time?提供了更細粒度的控制,特別適合長時間運行的數據處理任務,并有助于優化資源管理。

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

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

相關文章

數據安全VS創作自由:ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南

文章目錄 數據安全VS創作自由&#xff1a;ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南ChatGPTKimi騰訊元寶DeepSeek 數據安全VS創作自由&#xff1a;ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南 產品隱私設置操作路徑隱私協議ChatGPT…

FFmpeg入門:最簡單的音視頻播放器

FFmpeg入門&#xff1a;最簡單的音視頻播放器 前兩章&#xff0c;我們已經了解了分別如何構建一個簡單和音頻播放器和視頻播放器。 FFmpeg入門&#xff1a;最簡單的音頻播放器 FFmpeg入門&#xff1a;最簡單的視頻播放器 本章我們將結合上述兩章的知識&#xff0c;看看如何融…

windows 上刪除 node_modules

在 Windows 11 上&#xff0c;你可以通過命令行來刪除 node_modules 文件夾并清除 npm 緩存。以下是具體步驟&#xff1a; 刪除 node_modules 打開命令提示符&#xff08;Command Prompt&#xff09;或終端&#xff08;PowerShell&#xff09;。 導航到項目目錄。你可以使用 …

kotlin的val聲明的變量是常量嗎

kotlin的val聲明的變量是常量嗎 DeepSeek R1 思考 65 秒 思考過程 嗯&#xff0c;用戶問的是Kotlin中的val聲明的變量是不是常量。首先我需要回憶一下Kotlin的基礎知識。記得在Kotlin里&#xff0c;val用來聲明只讀變量&#xff0c;也就是說一旦賦值之后就不能再重新賦值了。…

Linux下學【MySQL】中如何實現:多表查詢(配sql+實操圖+案例鞏固 通俗易懂版~)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是MySQL篇中&#xff0c;非常實用性的篇章&#xff0c;相信在實際工作中對于表的查詢&#xff0c;很多時候會涉及多表的查詢&#xff0c;在多表查詢…

【基礎4】插入排序

核心思想 插入排序是一種基于元素比較的原地排序算法&#xff0c;其核心思想是將數組分為“已排序”和“未排序”兩部分&#xff0c;逐個將未排序元素插入到已排序部分的正確位置。 例如撲克牌在理牌的時候&#xff0c;一般會將大小王、2、A、花牌等按大小順序插入到左邊&…

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計 1. **欺詐場景分類與案例說明**1.1 **大額交易欺詐**1.2 **異地交易欺詐**1.3 **高頻交易欺詐**1.4 **異常時間交易欺詐**1.5 **賬戶行為異常**1.6 **設備指紋異常**1.7 **交易金額突變** 2. **普適性軟…

迷你世界腳本生物接口:Creature

生物接口&#xff1a;Creature 彼得兔 更新時間: 2024-05-22 17:51:22 繼承自 Actor 具體函數名及描述如下: 序號 函數名 函數描述 1 getAttr(...) 生物屬性獲取 2 setAttr(...) 生物屬性設置 3 isAdult(...) 判斷該生物是否成年 4 setOxygenNeed(…

深入理解三色標記、CMS、G1垃圾回收器

三色標記算法 簡介 三色標記算法是一種常見的垃圾收集的標記算法&#xff0c;屬于根可達算法的一個分支&#xff0c;垃圾收集器CMS&#xff0c;G1在標記垃圾過程中就使用該算法 三色標記法&#xff08;Tri-color Marking&#xff09;是垃圾回收中用于并發標記存活對象的核心算…

自動駕駛---不依賴地圖的大模型軌跡預測

1 前言 早期傳統自動駕駛方案通常依賴高精地圖&#xff08;HD Map&#xff09;提供道路結構、車道線、交通規則等信息&#xff0c;可參考博客《自動駕駛---方案從有圖邁進無圖》&#xff0c;本質上還是存在問題&#xff1a; 數據依賴性高&#xff1a;地圖構建成本昂貴&#xf…

Xshell及Xftp v8.0安裝與使用-生信工具050

官網 https://www.xshell.com/zh/free-for-home-school/ XShell & Xftp 詳解 1. XShell 介紹 1.1 XShell 是什么&#xff1f; XShell 是一款強大的 Windows 終端模擬器&#xff0c;主要用于遠程管理 Linux、Unix 服務器。它支持 SSH、Telnet、Rlogin 及 SFTP 協議&…

跨域-告別CORS煩惱

跨域-告別CORS煩惱 文章目錄 跨域-告別CORS煩惱[toc]1-參考網址2-思路整理1-核心問題2-個人思考3-腦洞打開4-個人思考-修正版1-個人思考2-腦洞打開 3-知識整理1-什么是跨域一、同源策略簡介什么是源什么是同源是否是同源的判斷哪些操作不受同源策略限制跨域如何跨域 二、CORS 簡…

PE文件結構詳解(DOS頭/NT頭/節表/導入表)使用010 Editor手動解析notepad++.exe的PE結構

一&#xff1a;DOS部分 DOS部分分為DOS MZ文件頭和DOS塊&#xff0c;其中DOS MZ頭實際是一個64位的IMAGE_DOS——HEADER結構體。 DOS MZ頭部結構體的內容如下&#xff0c;我們所需要關注的是前面兩個字節&#xff08;e_magic&#xff09;和后面四個字節&#xff08;e_lfanew&a…

Node JS 調用模型Xenova_all-MiniLM-L6-v2實戰

本篇通過將句子數組轉換為句子的向量表示&#xff0c;并通過平均池化和歸一化處理&#xff0c;生成適合機器學習或深度學習任務使用的特征向量為例&#xff0c;演示通過NodeJS 的方式調用Xenova/all-MiniLM-L6-v2 的過程。 關于 all-MiniLM-L6-v2 的介紹&#xff0c;可以參照上…

【C++學習篇】智能指針

目錄 1. 智能指針的使用場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循環引用問題 4.2 weak_ptr 1. 智能指針的使用場景分析 下?程序中我們可以看到&#xff0c;new了以后&#xff0c;我們也delete了&#xff0c…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安裝插件 安裝完畢之后登錄自己的賬號 點擊鏈接&#xff0c;注冊賬號 https://www.marscode.cn/events/s/i5DRGqqo/ 可以選擇不同的模型

日期格式與字符串不匹配bug

異常特征&#xff1a;java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…

C++中的無鎖編程

引言 在當今多核處理器普及的時代&#xff0c;并發編程已成為高性能應用程序開發的關鍵技術。傳統的基于鎖的同步機制雖然使用簡單&#xff0c;但往往會帶來性能瓶頸和死鎖風險。無鎖編程&#xff08;Lock-Free Programming&#xff09;作為一種先進的并發編程范式&#xff0c…

FastGPT 引申:借鑒 FastGPT 基于MySQL + ES 實現知識庫(含表結構以及核心代碼)

文章目錄 FastGPT 引申&#xff1a;借鑒 FastGPT 基于MySQL ES 實現知識庫&#xff08;含表結構以及核心代碼&#xff09;一、整體思路二、存儲結構2.1 MySQL 表結構(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…

Python學習(十四)pandas庫入門手冊

目錄 一、安裝與導入二、核心數據結構2.1 Series 類型&#xff08;一維數組&#xff09;2.2 DataFrame 類型&#xff08;二維數組&#xff09; 三、數據讀取與寫入3.1 讀取 CSV 和 Excel 文件3.2 寫入數據 四、數據清洗與處理4.1 處理缺失值4.2 數據篩選4.3 數據排序 五、數據分…