分布式搜索(Elasticsearch)基本用法

目錄

初識Elasticsearch

什么是elasticsearch

正向索引和倒排索引

與mysql進行對比

安裝elasticsearch、kibana

安裝分詞器IK

IK分詞器的拓展和停用詞典

ik分詞器-拓展詞庫

ik分詞器-停用詞庫

索引庫操作

mapping映射屬性

索引庫的CRUD

查看、刪除索引庫

文檔操作

新增文檔

查詢文檔

刪除文檔

?修改文檔

RestClient操作索引庫

創建索引庫

1.導入數據

2.編寫mapping映射

3.初始化JavaRestClient

4.創建索引庫

刪除索引庫

判斷索引庫是否存在

RestClient操作文檔

新增文檔

查詢文檔

更新文檔

方式一:

方式二:

刪除文檔

批量導入文檔

DSL查詢文檔

DSL查詢分類

全文檢索查詢

精準查詢

地理坐標查詢

組合查詢(復合查詢)

搜索結果處理

排序

分頁

高亮

RestClient查詢文檔

快速入門

match查詢

精確查詢

復合查詢

排序、分頁、高亮

實例常用


初識Elasticsearch

什么是elasticsearch

elasticsearch是一款非常強大的開源搜索引擎,可以幫助我們從海量數據中快速找到需要的內容。

elasticsearch結合kibana、Logstash、Beats,也就是ELK。被廣泛應用在日志數據分析、實時監控等領域。

elasticsearch的發展

Lucene是一個Java語言的搜索引擎類庫,是Apache公司的頂級項目,由DougCutting于1999年研發。

Lucene的優勢:

易擴展

高性能(基于倒排索引)

Lucene的缺點:

只限于Java語言開發

學習曲線陡峭

不支持水平擴展

elasticsearch就是基于Lucene的開發,優勢:

支持分布式,可水平擴展

提供Restful接口,可被任何語言調用

正向索引和倒排索引

elasticsearch采用倒排索引:

文檔:每條數據就是一個文檔

詞條:文檔按照語義分成的詞語

正向索引:基于文檔id創建索引。查詢詞條時必須先找到文檔,而后判斷是否包含詞條

倒排索引:對文檔內容分詞,對詞條創建索引,并記錄詞條所在文檔的信息。查詢時先根據詞條查詢到文檔id,而后獲取到文檔

與mysql進行對比

文檔

elasticsearch是面向文檔存儲的,可以是數據庫中的一條商品數據,一個訂單信息。

文檔數據會被序列化為json格式后存儲在elasticsearch中。

索引

索引:相同類型的文檔的集合

映射:索引中文檔的字段約束信息,類似表的結構約束

架構??

MySQL:擅長事務類型操作,可以確保數據的安全和一致性

Elasticsearch:擅長海量數據的搜索、分析、計算

安裝elasticsearch、kibana

建議以下連接

Elasticsearch集群和Kibana部署流程_kibana部署教程-CSDN博客

安裝分詞器IK

分詞器的作用是什么?
創建倒排索引時對文檔分詞
用戶搜索時,對輸入的內容分詞 ?

IK分詞器有幾種模式? ?
ik_smart:智能切分,粗粒度 ?
ik_max_word:最細切分,細粒度

es在創建倒排索引時需要對文檔分詞;在搜索時,需要對用戶輸入內容分詞。但默認的分詞規則對中文處理并不友好。

處理中文分詞,一般回使用IK分詞器。infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK analyzer into Elasticsearch and OpenSearch, support customized dictionary.

下載完將壓縮包解壓到es的plugins目錄即可

IK分詞器的拓展和停用詞典

ik分詞器-拓展詞庫

要拓展ik分詞器的詞庫,只需要修改一個ik分詞器目錄中的config目錄中的 IkAnalyzer.cfg.xml文件:

ik分詞器-停用詞庫

要禁用某些敏感詞條,只需要修改一個il分詞器目錄中的config目錄中的IkAnalyzer.cfg.xml文件:

拓展和禁用詞文件都必須在當前配置文件所在的目錄

索引庫操作

mapping映射屬性

mapping是對索引庫中文檔的約束,常見的mapping屬性包括:

type:字段數據類型,常見的簡單類型有

? ? ?字符串text(可分詞的文本)、keyword(精確值,例如:品牌、國家、IP地址)

? ? ?數值longintegershortbytedoublefloat

? ? ?布爾boolean

? ? ?日期date

? ? ?對象object

index:是否創建索引,默認為true

ananlyzer:使用哪種分詞器

properties:該字段的子字段

索引庫的CRUD

ES中通過Restful請求操作索引庫、文檔。請求內容用DSL語句來表示。

創建索引庫和mapping的DSL語法如下:

? ??

PUT /haha
{"mappings":{"properties":{"info":{"type":"text","analyzer":"ik_smart"},"email":{"type":"keyword","index":false},"name":{"type":"object","properties":{"firstName":{"type":"keyword"},"lastName":{"type":"keyword"}}}}}
}
查看、刪除索引庫

查看索引庫語法:

GET /索引庫名

刪除索引庫的語法:

DELETE /索引庫名

修改索引庫

索引庫和mapping一旦創建無法修改,但是可以添加新的字段,語法如下:

文檔操作

新增文檔

查詢文檔

GET /索引庫名/_doc/文檔id

刪除文檔

DELETE??/索引庫名/_doc/文檔id

?修改文檔

方式一:全量刪除,會刪除舊文檔,添加新文檔

方式二:增量修改,修改指定字段

RestClient操作索引庫

RestClient是ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質就是組裝DSL語句,通過http請求發送給ES。官方文檔地址:Elasticsearch clients | Elastic Docs

創建索引庫

mapping要考慮的問題:

字段名、數據類型、是否參與搜索、是否分詞、如果分詞、分詞器是什么

1.導入數據
2.編寫mapping映射

id一般在ES中用keyword來表示

3.初始化JavaRestClient

(1).引入es的RestHighLevelClient依賴:

     <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>

(2).配置版本

(3).初始化JavaRestClient

public class HotelIndex {private RestHighLevelClient client;@Testvoid testInit(){System.out.println(client);}@BeforeEachpublic void setUp() throws Exception {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));}@AfterEachpublic void tearDown() throws Exception {this.client.close();}}
4.創建索引庫

    @Testvoid createHotelIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("hotel");request.source("""{"mappings": {"properties": {"name": {"type": "text"},"price": {"type": "long"},"location": {"type": "text"},"amenities": {"type": "keyword"}}}}""", XContentType.JSON);client.indices().create(request, RequestOptions.DEFAULT);}

刪除索引庫

   @Testvoid deleteHotelIndex() throws IOException {client.indices().delete(new DeleteIndexRequest("hotel"), RequestOptions.DEFAULT);}

判斷索引庫是否存在

    @Testvoid existsHotelIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("hotel");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);}

RestClient操作文檔

文檔操作也同樣需要初始化RestHighLevelClient

新增文檔

從數據庫中加載數據,并且轉換為JSON格式

查詢文檔

直接解析的結果為json格式,記得將json格式反序列化

更新文檔

方式一:

全量更新。再次學日語id一樣的文檔,就會刪除舊文檔,添加新文檔

方式二:

局部更新。只更新部分字段

刪除文檔

批量導入文檔

DSL查詢文檔

DSL查詢分類

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括:

1. 查詢所有:查詢出所有數據,一般測試用。例如:`match_all` ?


2. 全文檢索(full text)查詢**:利用分詞器對用戶輸入內容分詞,然后去倒排索引庫中匹配。例如: ?
? ?- `match_query` ?
? ?- `multi_match_query` ?
3. 精確查詢:根據精確詞條值查找數據,一般是查找keyword、數值、日期、boolean等類型字段。例如: ?
? ?- `ids` ?
? ?- `range` ?
? ?- `term` ?
4. 地理(geo)查詢:根據經緯度查詢。例如: ?
? ?- `geo_distance` ?
? ?- `geo_bounding_box` ?
5. 復合(compound)查詢:復合查詢可以將上述各種查詢條件組合起來,合并查詢條件。例如: ?
? ?- `bool` ?
? ?- `function_score`

全文檢索查詢

match查詢:全文檢索查詢的一種,會對用戶輸入內容分詞,然后去倒排索引庫檢索,語法:

multi_match:與match查詢類似,只不過允許同時查詢多個字段,語法:

精準查詢

精確查詢一般是查找keyword、數值、日期、boolean等類型字段。所以不會對搜索條件分詞。常見的有: ?

term:根據詞條精確值查詢

range:根據值的范圍查詢

地理坐標查詢

根據經緯度查詢。常見的使用場景包括:

攜程:搜索我附近的酒店

滴滴:搜索我附近的出租車

微信:搜索我附近的人

geo_bounding_box:查詢geo_point值落在某個矩形范圍的所以文檔

geo_distance:查詢到指定中心點小于某個距離值的所有文檔

組合查詢(復合查詢)

復合查詢:復合查詢可以將其它簡單查詢組合起來,實現更復雜的搜索邏輯,例如:

fuction score:算分函數查詢,可以控制文檔相關性算分,控制文檔排名。例如百度競價

相關性算分

當我們利用match查詢時,文檔結構會根據與搜索詞條的關聯度打分(_score),返回結構時按照分值降序排列。

  1. TF-IDF

    • 在Elasticsearch 5.0之前使用。

    • 隨著詞頻(Term Frequency)的增加,相關性分數會不斷增大。

  2. BM25

    • 從Elasticsearch 5.0開始采用。

    • 隨著詞頻的增加,相關性分數也會增大,但增長曲線會逐漸趨于平緩,避免過度偏向高頻詞

使用 fuction score query,可以修改文檔的相關性算分,根據新得到的算分排序。

復合查詢 Boolean Query

布爾查詢是一個或多個查詢子句的組合。子查詢的組合方式有:

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

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

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

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

搜索結果處理

排序

Elasticsearch支持對搜索結果進行排序,默認情況下是根據相關度算分(_score)進行排序。支持的排序字段類型包括:keyword類型數值類型地理坐標類型日期類型

獲取經緯度的方式:高德開放平臺 | 高德地圖API

分頁

elasticsearch默認情況下只返回top10的數據。而如果要查詢更多數據就需要修改分頁參數了。

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

該方法限制了查詢上限為10000條

深度分頁問題

ES是分布式的,所以會面臨深度分頁問題。例如按price排序后,獲取from=990,size=10的數據:

深度分頁解決方案

  1. Search After

    • 原理:基于上一頁的排序值繼續查詢下一頁數據,要求分頁時必須指定排序規則。

    • 特點:官方推薦的方式,適用于實時滾動查詢,避免性能問題。

  2. Scroll

    • 原理:將排序數據生成快照并保存在內存中,適合大批量數據遍歷。

    • 特點:官方已不再推薦使用,因為會占用較多資源且數據可能不是最新的。

高亮

高亮:就是在搜索結果中把搜索關鍵字突出顯示。

原理:

將搜索結果中的關鍵字用標簽標記出來

在頁面中給標簽添加css樣式

默認情況下,ES搜索字段必須與高亮字段一致

增加字段匹配即可

RestClient查詢文檔

快速入門

1.創建SearchRequest對象

2.準備Request.source(),也就是DSL

3.發送請求,得到結果

4.解析結果

match查詢

精確查詢

復合查詢

排序、分頁、高亮

排序和分頁

高亮

高亮API包括請求DSL構建和結果解析兩部分。

DSL構建

高亮的結果處理

實例常用

將Client注入到Bean對象中

距離排序

讓指定內容在搜索結果中排名置頂

我們給需要置頂的文檔添加一個標記。然后利用function score給帶有標記的文檔增加權重

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

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

相關文章

docker 查看容器 docker 篩選容器

目錄 docker ps 看運行中的容器 運行中的容器篩選容器名 2?? 包括已停止的容器中篩選 3?? 只輸出容器 ID&#xff08;腳本里常用&#xff09; docker ps 看運行中的容器 docker ps -a 看所有容器 --filter "namexxx" 可以按名字查 運行中的容器篩選容器名 …

策略模式 vs 適配器模式

一、模式本質1 策略模式&#xff1a;行為的選擇核心思想&#xff1a;定義一組算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以互相替換&#xff0c;讓算法的變化獨立于使用它的客戶端。2 適配器模式&#xff1a;接口的轉換核心思想&#xff1a;將一個類的接口轉換…

Unity--判斷一個點是否在扇形區域里面(點乘和叉乘的應用)

問題分享&#xff1a;https://www.bilibili.com/video/BV1zLetz1Ew8 using System.Collections; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endifpublic class SectorCheck : MonoBehaviour {[Tooltip("扇形圓心"…

基于Python sdk發布自己的第一個mcp-client

說在前面 上一篇文章發布了一個mcp-server&#xff0c;具體的server是否能被正確的訪問到&#xff1f;是否能夠得到正常的返回&#xff1f; 在github上找到一個客戶端的代碼實現&#xff0c;我把里面的大模型調用換成了支持國內大模型的方式&#xff0c;一起來驗證一下吧~ 主…

C# 浮點數與定點數詳細解析

C# 浮點數與定點數詳細解析 在 C# 中&#xff0c;數值類型主要分為&#xff1a; 整數型&#xff08;int, long 等&#xff09;浮點型&#xff08;float, double&#xff09;定點型&#xff08;decimal&#xff09; 浮點數和定點數在內部的表示方式不同&#xff0c;導致它們的 精…

【小寧學習日記5 stm32】LED閃爍 LED流水燈 蜂鳴器

目錄 01.LED閃爍 1、搭建電路板 2、新建工程 &#xff08;1&#xff09;前期準備 &#xff08;2&#xff09;創建工程文件夾結構 &#xff08;3&#xff09;復制固件庫文件到對應文件夾 &#xff08;4&#xff09;在 Keil 中創建工程 &#xff08;5&#xff09;配置工程…

openstack的novnc兼容問題

1.今天在部署O版過程中發現了novnc組件不兼容openstack2.novnc一直報錯&#xff0c;令牌過期&#xff0c;原本以為是python代碼配置的問題&#xff0c;最后經過排查很久發現竟然是novnc的版本和openstack的O版不兼容novncyum remove -y novnc*安裝支持版本yum install -y novnc…

Day25 棧 隊列 二叉樹

day25 棧 隊列 二叉樹使用棧計算表達式的值 概述 通過兩個棧&#xff08;數值棧和符號棧&#xff09;實現中綴表達式求值。算法核心是&#xff1a; 遇到數字時&#xff0c;累加并入數值棧&#xff1b;遇到運算符時&#xff0c;比較其與符號棧頂運算符的優先級&#xff1a; 若當…

阿里云RDS MySQL數據歸檔全攻略:方案選擇指南

引言在日常數據庫管理中&#xff0c;數據歸檔是必不可少的重要環節。隨著業務數據的不斷增長&#xff0c;將歷史數據從生產數據庫遷移到更經濟的存儲方案中&#xff0c;不僅可以降低存儲成本&#xff0c;還能提升數據庫性能。阿里云提供了豐富的數據歸檔解決方案&#xff0c;本…

線性回歸學習

一、線性回歸簡介核心思想&#xff1a;線性回歸是一種通過屬性的線性組合來做預測的模型。它的目標很明確&#xff0c;就是找到一條合適的直線、平面或者更高維度的超平面&#xff0c;讓預測出來的值和實際真實值之間的差距盡可能小。比如在預測房屋價格時&#xff0c;就可以根…

如何使用 DeepSeek 助力工作:全面指南?

一、引言?1.1 DeepSeek 簡介?DeepSeek 的定位與目標概述?核心技術亮點&#xff08;大語言模型、多模態能力、AI Agent 框架&#xff09;?1.2 工作場景中應用 AI 的趨勢?AI 對職場效率提升的重要性?DeepSeek 在眾多 AI 工具中的獨特地位?二、DeepSeek 基礎功能介紹?2.1 …

車載診斷架構 --- EOL引起關于DTC檢測開始條件的思考

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

JCTools Spmc 單生產者-多消費者的無鎖并發有界隊列

SpmcArrayQueue 是 JCTools 中為 單生產者-多消費者&#xff08;Single-Producer-Multi-Consumer&#xff09; 場景設計的有界隊列。與 SPSC 模型相比&#xff0c;SPMC 的復雜性主要體現在消費者側&#xff0c;因為多個消費者線程需要以線程安全的方式競爭消費同一個隊列中的元…

SpringAI1.0.1實戰教程:避坑指南25年8月最新版

Spring AI 1.0.1 使用教程 項目簡介 作為一個Java的開發者 聽到Java也有ai框架了 很高興~~~ 本來想學一下SpringAI但是網上賣課的一大堆&#xff0c;并且大部分課程都是五月的&#xff0c;到2025年的8月份&#xff0c;SpringAI的版本做了很多更新&#xff0c;所以我本人參考…

Maven架構的依賴管理和項目構建

??????什么是依賴管理對第三方依賴包的管理&#xff0c;可以連接互聯網下載項目所需第三方jar包。對自己開發的模塊的管理&#xff0c;可以像引用第三方依賴包一樣引用自己項目的依賴包。Maven的依賴管理方式和傳統方式有什么區別傳統方式&#xff1a;從官網手動下載jar包…

微信小程序開發(一):使用開發者工具創建天氣預報項目

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; 從今天開始&#xff0c;我將開啟一個全新的微信小程序開發系列教程&#xff0c;通過實際項目帶大家系統學習小程序開發。作為系列的第一篇文章&#xff0c;我們將從最基礎的環境搭建開始&…

【鏈表 - LeetCode】24. 兩兩交換鏈表中的節點

24. 兩兩交換鏈表中的節點 - 力扣&#xff08;LeetCode&#xff09; 題解&#xff1a; - 迭代 首先是直接遍歷的做法&#xff0c;這里注意調整指針指向的順序。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* List…

爬蟲基礎學習-鏈接協議分析,熟悉相關函數

1、urlparse&#xff1a;&#xff08;python標準庫中的一個模塊&#xff0c;解析和操作url&#xff09;標準的url鏈接格式&#xff1a;scheme://netloc/path;params?query#fragmentscheme&#xff08;協議&#xff09; http or https netloc&#xff08;網絡位置&#xff09; …

kkfileview預覽Excel文件去掉左上角的跳轉HTML預覽、打印按鈕

上篇說了使用nginx代理kkfile預覽文件&#xff0c;但是又發現個新問題&#xff0c;預覽其他文件時都正常&#xff0c;但是預覽.xlsx格式的時候&#xff0c;在左上角會有【跳轉HTML預覽】【打印】兩個按鈕&#xff0c;如下所示&#xff1a;這篇就來說一下如何去掉。首先這個跟kk…

阿里開源新AI code工具:qoder功能介紹

下載地址&#xff1a; https://qoder.com/ 文檔地址&#xff1a; https://docs.qoder.com/ 文章目錄1. AI 編碼發展趨勢2. 真實世界軟件開發的挑戰3. 我們的方法3.1. 透明度3.1.1. 知識可見性3.1.2. 執行透明度3.2. 增強上下文工程3.3. 規范驅動與任務委托3.3.1. 聊天模式&…