SpringCloud 微服務全棧體系(十七)

第十一章 分布式搜索引擎 elasticsearch

七、搜索結果處理

  • 搜索的結果可以按照用戶指定的方式去處理或展示。

1. 排序

  • elasticsearch 默認是根據相關度算分(_score)來排序,但是也支持自定義方式對搜索結果排序。可以排序字段類型有:keyword 類型、數值類型、地理坐標類型、日期類型等。
1.1 普通字段排序
  • keyword、數值、日期類型排序的語法基本一致。

  • 語法:

GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"FIELD": "desc"  // 排序字段、排序方式ASC、DESC}]
}
  • 排序條件是一個數組,也就是可以寫多個排序條件。按照聲明的順序,當第一個條件相等時,再按照第二個條件排序,以此類推
1.2 地理坐標排序
  • 地理坐標排序略有不同。
1.2.1 語法說明
GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance" : {"FIELD" : "緯度,經度", // 文檔中geo_point類型的字段名、目標坐標點"order" : "asc", // 排序方式"unit" : "km" // 排序的距離單位}}]
}
  • 這個查詢的含義是:

    • 指定一個坐標,作為目標點
    • 計算每一個文檔中,指定字段(必須是 geo_point 類型)的坐標到目標點的距離是多少
    • 根據距離排序
1.2.2 示例
  • 需求描述:實現對酒店數據按照到你的位置坐標的距離升序排序

  • 提示:獲取你的位置的經緯度的方式:https://lbs.amap.com/demo/jsapi-v2/example/map/click-to-get-lnglat/

  • 假設我的位置是:31.034661,121.612282,尋找我周圍距離最近的酒店。

在這里插入圖片描述

2. 分頁

  • elasticsearch 默認情況下只返回 top10 的數據。而如果要查詢更多數據就需要修改分頁參數了。elasticsearch 中通過修改 from、size 參數來控制要返回的分頁結果:

    • from:從第幾個文檔開始
    • size:總共查詢幾個文檔
  • 類似于 mysql 中的limit ?, ?

2.1 基本的分頁
  • 分頁的基本語法如下:
GET /hotel/_search
{"query": {"match_all": {}},"from": 0, // 分頁開始的位置,默認為0"size": 10, // 期望獲取的文檔總數"sort": [{"price": "asc"}]
}
2.2 深度分頁問題
  • 現在,我要查詢 990~1000 的數據,查詢邏輯要這么寫:
GET /hotel/_search
{"query": {"match_all": {}},"from": 990, // 分頁開始的位置,默認為0"size": 10, // 期望獲取的文檔總數"sort": [{"price": "asc"}]
}
  • 這里是查詢 990 開始的數據,也就是 第 990~第 1000 條 數據。

  • 不過,elasticsearch 內部分頁時,必須先查詢 0~1000 條,然后截取其中的 990 ~ 1000 的這 10 條:

請添加圖片描述

  • 查詢 TOP1000,如果 es 是單點模式,這并無太大影響。

  • 但是 elasticsearch 將來一定是集群,例如我集群有 5 個節點,我要查詢 TOP1000 的數據,并不是每個節點查詢 200 條就可以了。

  • 因為節點 A 的 TOP200,在另一個節點可能排到 10000 名以外了。

  • 因此要想獲取整個集群的 TOP1000,必須先查詢出每個節點的 TOP1000,匯總結果后,重新排名,重新截取 TOP1000。

在這里插入圖片描述

  • 那如果我要查詢 9900~10000 的數據呢?是不是要先查詢 TOP10000 呢?那每個節點都要查詢 10000 條?匯總到內存中?

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

  • 針對深度分頁,ES 提供了兩種解決方案,官方文檔:

    • search after:分頁時需要排序,原理是從上一次的排序值開始,查詢下一頁數據。官方推薦使用的方式。
    • scroll:原理將排序后的文檔 id 形成快照,保存在內存。官方已經不推薦使用。
2.3 小結
  • 分頁查詢的常見實現方案以及優缺點:

    • from + size

      • 優點:支持隨機翻頁
      • 缺點:深度分頁問題,默認查詢上限(from + size)是 10000
      • 場景:百度、京東、谷歌、淘寶這樣的隨機翻頁搜索
    • after search

      • 優點:沒有查詢上限(單次查詢的 size 不超過 10000)
      • 缺點:只能向后逐頁查詢,不支持隨機翻頁
      • 場景:沒有隨機翻頁需求的搜索,例如手機向下滾動翻頁
    • scroll

      • 優點:沒有查詢上限(單次查詢的 size 不超過 10000)
      • 缺點:會有額外內存消耗,并且搜索結果是非實時的
      • 場景:海量數據的獲取和遷移。從 ES7.1 開始不推薦,建議用 after search 方案。

3. 高亮

3.1 高亮原理
  • 什么是高亮顯示呢?

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

在這里插入圖片描述

  • 高亮顯示的實現分為兩步:

    • 給文檔中的所有關鍵字都添加一個標簽,例如<em>標簽
    • 頁面給<em>標簽編寫 CSS 樣式
3.2 實現高亮
  • 高亮的語法
GET /hotel/_search
{"query": {"match": {"FIELD": "TEXT" // 查詢條件,高亮一定要使用全文檢索查詢}},"highlight": {"fields": { // 指定要高亮的字段"FIELD": {"pre_tags": "<em>",  // 用來標記高亮字段的前置標簽"post_tags": "</em>" // 用來標記高亮字段的后置標簽}}}
}
  • 注意:

    • 高亮是對關鍵字高亮,因此搜索條件必須帶有關鍵字,而不能是范圍這樣的查詢。
    • 默認情況下,高亮的字段,必須與搜索指定的字段一致,否則無法高亮
    • 如果要對非搜索字段高亮,則需要添加一個屬性:required_field_match=false
  • 示例

在這里插入圖片描述

4. 總結

  • 查詢的 DSL 是一個大的 JSON 對象,包含下列屬性:

    • query:查詢條件
    • from 和 size:分頁條件
    • sort:排序條件
    • highlight:高亮條件
  • 示例:

在這里插入圖片描述

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

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

相關文章

【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 無法加載,docs無法加載,redocs無法使用

使用fastapi的時候&#xff0c;swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有時候無法加載&#xff08;國內環境原因或者是局域網屏蔽&#xff09;&#xff0c;此時就需要自己用魔法下載好對應文件&#xff0c;然后替換到fastapi里面去。 fastapi里面依靠這…

計算機視覺(CV)技術的優勢:

計算機視覺&#xff08;CV&#xff09;技術的優勢&#xff1a; 自動化&#xff1a;計算機視覺技術可以自動化處理大量的視覺數據。 精度和速度&#xff1a;計算機視覺技術可以在很短的時間內對大量的圖像數據進行處理&#xff0c;并且可以達到非常高的精度。 可靠性&#xff…

【微軟技術棧】使用(TAP)基于任務的異步模式

本文內容 使用 Await 掛起執行取消異步操作監視進度使用內置的基于任務的連結符構建基于任務的連結符構建基于任務的數據結構 c#使用基于任務的異步模式 (TAP) 處理異步操作時&#xff0c;可以使用回叫實現等待&#xff0c;而不會阻塞。 對于任務&#xff0c;這可通過 Task.C…

java學習part07數組工具類

1比較內容 2輸出信息 3值填充 4快速排序 5二分查找 負數沒找到&#xff0c;其他表示下標

ES6 — ES14 新特性

一、ES6 新特性&#xff08;2015&#xff09; 1. let和const 在ES6中&#xff0c;新增了let和const關鍵字&#xff0c;其中 let 主要用來聲明變量&#xff0c;而 const 通常用來聲明常量。let、const相對于var關鍵字有以下特點&#xff1a; 特性varletconst變量提升??全局…

【漏洞復現】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上傳漏洞 附POC

漏洞描述 金蝶云星空是一款云端企業資源管理(ERP)軟件,為企業提供財務管理、供應鏈管理以及業務流程管理等一體化解決方案。金蝶云星空聚焦多組織,多利潤中心的大中型企業,以 “開放、標準、社交”三大特性為數字經濟時代的企業提供開放的 ERP 云平臺。服務涵蓋:財務、供…

什么是切片

切片&#xff0c;是一個比較生疏的名詞&#xff0c;這是現代計算機編程語言或者說Python里的一個概念&#xff0c;大致意思是從一個集合里切出一塊來&#xff0c;就像切一塊豆腐&#xff0c;一刀下去切出兩塊豆腐 先看一個函數range、返回值是列表&#xff0c;內容和傳入range…

【MySQL】mysql中不推薦使用uuid或者雪花id作為主鍵的原因以及差異化對比

文章目錄 前言什么是UUID?什么是雪花ID?什么是MySql自增ID?優缺點對比UUID:優點1.全球唯一性2.無需數據庫支持 缺點1.存儲空間大2.索引效率低3.查詢效率低 雪花ID&#xff1a;優點1.分布式環境下唯一性 缺點1.依賴于機器時鐘2.存儲空間較大3.查詢效率低 MYSQL自增:優點1.簡單…

qml PathView使用介紹

PathView 是 QML 的一個強大的元素,它能夠在任意路徑上布局和滾動項目。這使得創建復雜的滾動視圖和項目動畫變得相對更簡單。 以下是 PathView 的一些主要特性: 路徑定義: PathView 根據 Path 元素定義的路徑布局項目。路徑可以是簡單的直線,復雜的曲線,或者包含多個不同…

IP 代理的基礎知識有哪些?

本文將介紹流冠IP代理的基礎知識&#xff0c;幫助您了解IP代理的概念、類型、作用、設置方法和注意事項。 一、IP代理的概念 IP代理是一種網絡代理服務&#xff0c;它通過代理服務器幫助用戶訪問互聯網&#xff0c;并將用戶的請求轉發到目標網站&#xff0c;同時將目標網站的響…

手寫工作流設計模式,針對常見的工作流步驟流轉,減少過多的if/else,提升編程思維

需求 這一年下來&#xff0c;寫兩次工作流流轉&#xff0c;總結下經驗。 第一次寫的時候&#xff0c;只找到用模版設計模式包裹一下&#xff0c;每個方法都做隔離&#xff0c;但是在具體分支實現的時候&#xff0c;if/else 滿屏分&#xff0c;而且因為要針對不同情況&#xff…

微信小程序實現類似Vue中的computed、watch功能

微信小程序實現類似Vue中的computed、watch功能 構建npm使用 構建npm 創建包管理器 進入小程序后&#xff0c;打開終端&#xff0c;點擊頂部“視圖” - “終端” 新建終端 使用 npm init -y初始化包管理器&#xff0c;生成一個package.json文件 安裝 npm 包 npm install --…

Java Web 實戰 21 - 用 Servlet 實現一個Hello World

用 Servlet 來寫一個 Hello World~ 一 . 基本部署方式1.1 創建 Servlet 項目1.2 引入依賴1.3 創建目錄1.4 編寫代碼繼承 HttpServlet重寫 doGet 方法刪除 super 方法加上 WebServlet 注解寫業務邏輯 1.5 打包1.6 部署1.7 驗證1.8 小結 二 . 更方便的部署方式2.1 Smart Tomcat 的…

【docker】安裝redis和mysql生產實戰

docker安裝諸如redis,mysql等程序非常方便,但是如果不是為了學習,生產環境的部署還是要注意很多問題的 mysql docker pull mysql:5.7mkdir -p /usr/docker/mysql/{conf,logs,data}docker run -d -p 3306:3306 --privilege

ORA-28003: password verification for the specified password failed,取消oracl密碼復雜度

自己在測試環境想要使自己的Oracle數據庫用戶使用簡單的密碼方便測試&#xff0c;結果指定密碼的密碼驗證失敗 SQL> alter user zzw identified by zzw; alter user zzw identified by zzw * ERROR at line 1: ORA-28003: password verification for the specified password…

本地部署 ComfyUI

本地部署 ComfyUI ComfyUI 介紹ComfyUI Github 地址部署 ComfyUI配置模型地址 or 下載模型啟動 ComfyUI訪問 ComfyUI ComfyUI 介紹 最強大、模塊化的穩定擴散 GUI 和后端。 該用戶界面將允許您使用基于圖形/節點/流程圖的界面設計和執行高級穩定擴散管道。 ComfyUI Github 地…

用戶運營常用的ChatGPT通用提示詞模板

如何建立和完善用戶運營體系&#xff0c;提高用戶滿意度和忠誠度&#xff1f; 如何制定有效的用戶獲取和留存策略&#xff0c;提高用戶生命周期價值&#xff1f; 如何運用多種渠道和平臺進行用戶運營&#xff0c;提高用戶參與度和互動性&#xff1f; 如何建立和維護用戶社群…

第五天 用Python批量處理Excel文件,實現自動化辦公

用Python批量處理Excel文件&#xff0c;實現自動化辦公 一、具體需求 有以下N個表&#xff0c;每個表的結構一樣&#xff0c;如下&#xff1a; 需要把所有表數據匯總&#xff0c;把每個人的得分、積分分別加起來&#xff0c;然后按總積分排名&#xff0c;總積分一致時&#xff…

小程序可拖拽按鈕

你有沒有遇到過在頁面中有一個固定在某個位置的按鈕&#xff0c;永遠的擋住了你想要看的區域&#xff1f; 在小程序的列表頁面中&#xff0c;常常會有一個提報的入口固定在右下角&#xff0c;如果這個按鈕不可拖動的話&#xff0c;可能會擋住下面的事件&#xff0c;讓用戶操作起…

云端導覽,數字互動 | 拓世法寶AI數字人一體機助力全新旅游時代

《中國旅行消費趨勢洞察白皮書&#xff08;2023版&#xff09;》顯示&#xff0c;消費者旅行習慣已從“到此一游”變為“深度在地”&#xff0c;更強調在旅游中充實自我、學習新知識。 &#xff08;《中國旅行消費趨勢洞察白皮書&#xff08;2023版》截圖&#xff09; 從這些資…