Elasticsearch搜索引擎 3(DSL)

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)語句來定義查詢條件,其JavaAPI就是在組織DSL條件。

1.DSL查詢

  • 葉子查詢(Leaf query clauses):在特定的字段里查詢特定值,屬于簡單查詢。

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

?測試:無條件查詢match_all

#DSL查詢
GET /items/_search
{"query":{"match_all": {}}
}

我們的數量不止10000,但是查詢出來的value只有10000,并且數據只顯示10條?

Elasticsearch默認超過10000條只顯示10000,并且設置了默認分頁的查詢頁數

?

2.葉子查詢

葉子查詢類型有很多,可以在官網查看全部

Query DSL | Elasticsearch Guide [7.12] | Elastic

  • 全文檢索查詢(Full Text Queries):利用分詞器對用戶輸入搜索條件先分詞,得到詞條,然后再利用倒排索引搜索詞條。例如:

    • match:單字段

    • multi_match:多字段

  • 精確查詢(Term-level queries):不對用戶輸入搜索條件分詞,根據字段內容精確值匹配。但只能查找keyword、數值、日期、boolean類型的字段。例如:

    • ids

    • term:精準匹配

    • range:范圍匹配

全文檢索查詢

1.match

? "query":{
? ? "match": {
? ? ? "字段名": "搜索條件"
? ? }
? }

#葉子查詢match
GET /items/_search
{"query":{"match": {"name": "牛奶"}}
}

?存在一個_score關聯度打分,返回結果時按照分值降序排列

?

?2.multi_match

? ? "multi_match": {
? ? ? "query": "搜索條件",
? ? ? "fields": ["字段1","字段2"]
? ? }

字段1和字段2是“或”關系,只需要滿足一個即可

#葉子查詢multi_match
GET /items/_search
{"query":{"multi_match": {"query": "賓格瑞","fields": ["name","brand"]}}
}

?

精準匹配?

不做分詞,只根據輸入字段匹配

1.term?

? ? "term": {
? ? ? "字段名": {
? ? ? ? "value": "查詢條件"
? ? ? }
? ? }

#精確查詢term
GET /items/_search
{"query":{"term": {"brand": {"value": "賓格瑞"}}}
}

2.range?

? ? "range": {
? ? ? "price": {
? ? ? ? "gte/gt": 1000,
? ? ? ? "lte/lt": 2000
? ? ? }
? ? }

查詢price 1000-2000

#范圍查詢查詢range
GET /items/_search
{"query":{"range": {"price": {"gte": 1000,"lte": 2000}}}
}

?3.復合查詢

復合查詢=多個葉子查詢

1.算分函數查詢

在使用全文檢索查詢match中返回結果有_score關聯度打分,按照分值降序排列,但是日常瀏覽器搜索中,搜索出來的前幾條往往是廣告,說明_score關聯度打分可控。

function score 查詢中包含四部分內容:

  • 原始查詢條件:query部分,基于這個條件搜索文檔,并且基于原始算法打分,原始算分。

  • 過濾條件:filter部分,符合該條件的文檔才會重新算分。

  • 算分函數:符合filter條件的文檔要根據這個函數做運算,得到的函數算分,有四種函數

    • weight:函數結果是常量

    • field_value_factor:以文檔中的某個字段值作為函數結果

    • random_score:以隨機數作為函數結果

    • script_score:自定義算分函數算法

  • 運算模式:算分函數的結果、原始查詢的相關性算分,兩者之間的運算方式,包括:

    • multiply:相乘

    • replace:用function score替換query score

    • 其它,例如:sum、avg、max、min

GET /hotel/_search
{"query": {"function_score": {"query": {  .... }, // 原始查詢,可以是任意條件"functions": [ // 算分函數{"filter": { // 條件過濾"term": {"字段": "過濾條件"}},"weight": 10 // 算分權重為2}],"boost_mode": "multipy" // 加權模式,求乘積}}
}

?2.bool查詢

利用邏輯運算來組合一個或多個查詢子句的組合,bool查詢支持的邏輯運算有:

  • must:必須匹配每個子查詢,類似“與”

  • should:選擇性匹配子查詢,類似“或”

  • must_not:必須不匹配,不參與算分,類似“非”

  • filter:必須匹配,不參與算分

與搜索關鍵字無關的查詢盡量采用must_not或filter邏輯運算,避免參與相關性算分。?

GET /items/_search
{"query": {"bool": {"must": [{"match": {"name": "手機"}}],"should": [{"term": {"brand": { "value": "華為" }}},{"term": {"brand": { "value": "小米" }}}],"must_not": [{"range": {"price": {"gte": 2500}}}],"filter": [{"range": {"price": {"lte": 1000}}}]}}
}

?4.排序

GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"排序字段": {"order": "排序方式asc和desc"}}]
}

5.分頁

1.基礎分頁

elasticsearch中通過修改fromsize參數來控制要返回的分頁結果:

  • from:從第幾個文檔開始

  • size:總共查詢幾個文檔

GET /items/_search
{"query": {"match_all": {}},"from": 0, // 分頁開始的位置,默認為0"size": 10,  // 每頁文檔數量,默認10"sort": [{"price": {"order": "desc"}}]
}

?2.深度分頁

在面對數據量比較大時,ELasticsearch會采取分片存儲,將數據分成n份,分配到不同的節點上。利于數據的擴展和存儲,但是也會存在問題。

我要查找990-1000的數據,從單體結構上,只需要排序然后找前1000名,就可以獲得990-1000的數據,但是采取分片存儲后,分片1的990-1000是全部數據的990-1000嗎,大概率不是。此時,需要找到所有的分片前1000,然后整合到一起,再排序,這樣就可以找到總數據的990-1000

那如果我要找9990-10000,是不是就要找到每個分片的前10000名數據在整合排序查找。

查詢分頁深度較大時,匯總數據過多,對內存和CPU會產生非常大的壓力,因此elasticsearch會禁止from+ size 超過10000的請求。

解決深度分頁方案:

  • search after:分頁時需要排序,原理是從上一次的排序值開始,查詢下一頁數據。官方推薦使用的方式。

  • scroll:原理將排序后的文檔id形成快照,保存下來,基于快照做分頁。官方已經不推薦使用。

6.高亮?

在瀏覽器搜索Elasticsearch,發現所有的Elasticsearch、Elastic樣式異于其他內容。

對搜索內容進行分詞,對分詞字段打上高亮標簽<em></em>或<strong></strong>

實現:

GET /{索引庫名}/_search
{"query": {"match": {"搜索字段": "搜索關鍵字"}},"highlight": {"fields": {"高亮字段名稱": {"pre_tags": "<em>","post_tags": "</em>"}}}
}

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

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

相關文章

final 在 java 中有什么作用?

final 在 java 中有什么作用&#xff1f; 修飾變量 修飾基本數據類型變量&#xff1a; 當用final修飾基本數據類型變量時&#xff0c;該變量就變成了常量&#xff0c;其值在初始化后不能被改變。 final int num 10; // num 20; // 這行代碼會導致編譯錯誤&#xff0c;因…

Dubbo/Hession2序列化Immutable類型的集合異常問題

問題排查 根據堆棧信息可見&#xff0c;dubbo使用默認的hession2進行序列化時出現了異常&#xff0c;異常堆棧根原因為&#xff1a;null array 位于java.util.CollSer#readResolve方法中&#xff0c;即在序列化集合時&#xff0c;集合數組為空。 向上追溯jdk.internal.ref…

目標檢測任務,如何區分兩個相近似的目標

首先&#xff0c;要了解清楚檢測的場景下&#xff0c;肉眼能否區分出目標的差異性。 如果可以區分&#xff0c;那觀察數據周圍背景的差異是否較大&#xff0c;可以先通過添加樣本來提升模型的檢測精度。添加樣本時一定要注意&#xff0c;樣本標注的準確性&#xff0c;樣本的豐…

Java面試黃金寶典1

1. 8 種基本數據類型 整數類型 byte&#xff1a; 它是最小的整數類型&#xff0c;占用 1 個字節&#xff08;8 位&#xff09;。在一些對內存使用要求極高的場景&#xff0c;比如嵌入式系統開發、數據傳輸時對數據量有嚴格限制的情況&#xff0c;會使用 byte 類型。例如&#x…

OSGEarth

OSGEarth 基于 OpenSceneGraph 構建的一個擴展庫&#xff0c;專門用于地球科學和地理信息系統&#xff08;GIS&#xff09;數據的可視化。它允許開發者創建逼真的三維地球模型&#xff0c;并在其上展示各種地理空間數據。 高端一點的表述 基于三維引擎osg開發的三維數字地球…

Word 小黑第34套

對應大貓34 設置第二頁水印&#xff0c;取消第一頁的&#xff1a;取消第二頁頁眉鏈接&#xff0c;刪除第一張水印圖片&#xff08;delete&#xff09; 調整水印圖片&#xff1a;點開頁眉頁腳 雙擊圖片 可以調整 郵件合并 -創建標簽 橫標簽數3 豎標簽5 表布局 -查看網格線 插…

2.5.1 io_uring

文章目錄 2.5.1 io_uring1. 對比1. select、poll、epoll 對比表格2. 關鍵特性說明&#xff1a;3. 應用場景 2. 異步io1. 頻繁copy2. 如何做到線程安全 3. io_uring1. 實現2. 關鍵點&#xff1a;3. 問題1. Reactor 與 Proactor 的三點不同2. epoll 與 io_uring 的區別 2.5.1 io_…

K8S學習之基礎三十六:node-exporter部署

Prometheus v2.2.1 ? 編寫yaml文件&#xff0c;包含創建ns、configmap、deployment、service # 創建monitoring空間 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitoring# 創建SA并綁定權限 kubectl create serviceaccount monitor -n monito…

為什么“連接斷開可能導致鎖未釋放”

目錄 兩種典型場景可能導致鎖未及時釋放1. **數據庫未及時檢測到連接斷開**2. **應用程序未正確處理事務** 為什么說“可能因連接斷開導致死鎖”&#xff1f;如何避免此類問題&#xff1f;總結 在大多數數據庫實現中&#xff0c;如果持有鎖的連接&#xff08;或會話&#xff09…

【實戰指南】基于DevExpress輕量化主題實現WPF應用性能升級

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

【C++多線程】C++異步線程池提交任務的寫法和解釋

// 提交任務到線程池 template<class F, class... Args> auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {using return_type typename std::result_of<F(Args...)>…

CSS 屬性選擇器詳解

CSS 屬性選擇器詳解 引言 CSS(層疊樣式表)是網頁設計中的重要組成部分,它用于控制網頁元素的樣式和布局。屬性選擇器是CSS選擇器的一種,它允許開發者根據元素的特定屬性來選擇和樣式化元素。本文將詳細講解CSS屬性選擇器的概念、語法以及常用屬性選擇器的使用方法。 一、…

二維前綴矩陣

1.大衣的旅行 #include<bits/stdc.h> #define int long long using namespace std; int t; int n,m,k; bool check(int mid,vector<vector<int>>pre,vector<vector<int>>a) {for(int i1; i<n; i){for(int j1; j<m; j){//枚舉以老師房間為…

python-leetcode 56.電話號碼的字母組合

題目&#xff1a; 給定一個僅包含數字的2-9的字符串&#xff0c;返回所有它可能表示的字母組合&#xff0c;答案可以按任意順序返回 給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;&#xff0c;注意1不對應任何字母 方法一&#xff1a;深度優先搜索&#x…

keepalived應用

Keepalived 是一個基于 VRRP&#xff08;虛擬路由冗余協議&#xff09;實現的高可用解決方案&#xff0c;常用于構建高可用性的服務器集群&#xff0c;特別是在負載均衡場景中&#xff0c;可確保服務的不間斷運行。以下為你詳細介紹它&#xff1a; 0主要功能 高可用性&#x…

5.0 VisionPro調用USB相機的方法與步驟說明(一)

本文介紹如何在C#中調用visionPro以處理USB相機采集到的圖片。示例如下: 主要思路如下: 1. 使用AForge來打開以及采集usb相機照片。 usb相機處于一直運行狀態。每隔100ms采集一次照片。且觸發一次事件。 public void Start() { this.videoSourcePlayer.Stop(); …

論文閱讀:Deep Hybrid Camera Deblurring for Smartphone Cameras

今天介紹一篇 ACM SIGGRAPH 2024 的文章&#xff0c;關于手機影像中的去模糊的文章。 Deep Hybrid Camera Deblurring for Smartphone Cameras Abstract 手機攝像頭盡管取得了顯著的進步&#xff0c;但由于傳感器和鏡頭較為緊湊&#xff0c;在低光環境下的成像仍存在困難&am…

Linux中的基本指令(下)

目錄 mv指令 more指令 less指令 head指令 tail 指令 繼續理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ?r指令 grep 指令 關機 擴展命令 zip/unzip 指令 tar指令 關于rzsz 系統間的文件互傳 接上&#xff01; mv指令 m…

Unity大型游戲開發全流程指南

一、開發流程與核心步驟 1. 項目規劃與設計階段 需求分析 明確游戲類型&#xff08;MMORPG/開放世界/競技等&#xff09;、核心玩法&#xff08;戰斗/建造/社交&#xff09;、目標平臺&#xff08;PC/移動/主機&#xff09;示例&#xff1a;MMORPG需規劃角色成長樹、副本Boss…

Unity WebGL IIS報錯無法使用

Unity WebGL IIS報錯無法使用 原因1&#xff1a;WebGL文件夾無訪問權限 右鍵WebGL文件夾-屬性 點擊安全-編輯-添加 輸入ever點擊確定-應用即可