谷粒商城-全文檢索-ElasticSearch

1.簡介

一個分布式的開源搜索和分析引擎,可以 秒 級的從海量數據中檢索

主要功能:做數據的檢索和分析(MySQL專攻于數據的持久化存儲與管理CRUD達到百萬以上的數據MSQL就會很慢,海量數據的檢索和分析還是要用ElasticSearch)

用途:我們電商項目里的所有的檢索功能都是由ElasticSearch完成的

底層:開源庫 Lucene ,然后對 Lucene 進行封裝,提供了 REST API 接口,開箱即用

REST API: 天然的跨平臺

版本對應:

1.基本概念

類比MySQL:

1.Index(索引)

1.動詞:類似于MySQL的insert: 創建一條數據在?ElasticSearch 里叫 索引一條數據

2.名詞:類似于MySQL的Database

2.Type(類型) (es7以后不能再創建多個type,只能用默認的,已被棄用)

在 Index 中可以定義一個或者多個 Type

類似于MySQL 數據庫 和 表 的關系:MySQL里叫在某個數據庫的某張表里,在ES里叫某個索引的某個類型下

已經沒有type了 現在索引就是表 索引還有映射 ?然后索引庫里邊存的就是文檔了.......

3.Document(文檔)

保存在某個索引(Index)下,某種類型(Type)的一個數據(Document),文檔是JSON格式的,Document就像是 MySQL中的某個Table 里面的內容;

4.倒排索引

比如我們保存一條記錄:紅海行動

ES會先把 紅海行動 進行分詞,比如分成 紅海 和 行動 兩個單詞,除了存入1號記錄 紅海行動 這個文檔之外,額外又維護了一張 倒排索引表 :倒排索引表就會存 紅海 1,行動 1,兩個文檔

然后我們再來保存2號記錄 探索紅海行動

先分詞成: 探索 紅海 行動 ,先存入2號記錄 探索紅海行動 ,再額外維護 倒排索引表 更新 紅海 和 行動的記錄 加入 探索 的記錄 :紅海 1,2 和 行動 1,2 和 探索 2?

以此類推....

然后當我們檢索時 輸入 紅海特工行動 它也會分詞成為 紅海 特工 行動 三個單詞,然后會從倒排索引表里找到 紅海 特工 行動? 這三個詞的記錄 就會查到 12345條記錄,但是哪一個才是更貼和我們的搜索目標呢,引入一個相關性得分(比如3號記錄共有3個單詞命中了兩個,相關性得分2/3),我們就會根據相關性得分從高到低排序

2.Docker安裝(國內鏡像已經停用了,解決谷粒商城docker pull的問題)

替換視頻中的docker鏡像,直接裝在centOS7上

在CentOS 7上安裝和配置Elasticsearch的方法_centos7搭建elasticsearch-CSDN博客

然后要在elasticsearch.yml上添加這個配置: http.host: 0.0.0.0

然后安裝kibana:

參考這個博主:

CentOS 7 上安裝 Kibana 7.12.1_kibana 7.12.1 license-CSDN博客

做完這兩個博主的內容就能跳過視頻P104

3.初步檢索

因為封裝成 REST API,我們直接使用APIfox發請求就能用

1._cat

GET/_cat/nodes:查看所有節點


GET/_cat/health:查看 es 健康狀況


GET/_cat/master:查看主節點


GET/ cat/indices:查看所有索引 相當于MySQL里的show databases;

2.索引一個文檔(保存)

因為ES8以后不能創建多個type所以我們用到的請求是

emmmES7應該只是化了type的概念,跟著視頻里應該也可以,因為我們這里裝的是7.9.2的ES

我建議還是使用post發/_doc吧,以后會慢慢更新淘汰掉視頻里的語法的

視頻中的方法:

POST:

3.查詢文檔(樂觀鎖)

樂觀鎖,當他們并發發送請求的時候,可以加上判斷條件if_seq_no=3,當seq_no=3時才能操作成功,且成功后seq_no會改變,當另一條請求也帶上判斷條件if_seq_no=3時,操作就會失敗

模擬并發更改:

同時對id為1的數據發送put請求更改name:

當第一條請求帶上樂觀鎖操作發出去且seq_no=3時

此時再發送第二條請求也帶上樂觀鎖操作讓seq_no=3時:

4.更新文檔

POST:

當帶了_update 語法一定要帶上 doc

_update會對比原數據,如果本次傳的數據和原數據一模一樣,版本號就不會加,操作就是noop(沒有操作),序列號(_seq_no)也不變

不帶_update 語法不加 doc://等同于PUT不加_update

不會檢測原數據直接更新,版本號,序列號都會加

5.刪除文檔

6.bulk批量API

必須發POST請求

來到Kiana

批量保存測試數據:

es測試數據.json · 坐看云起時/common_content - Gitee.com

4.進階檢索

1.SearchAPI

ES 支持兩種基本方式檢索

????????一個是通過使用 REST request URl 發送搜索參數(uri+檢索參數)

????????另一個是通過使用 REST requestbody 來發送它們(uri+請求體)

2.Query DSL(查詢領域對象語言)上面第二種方法的請求體

1.基本語法格式

2.只返回部分字段

"_source":["name","age"],只返回name和age字段

3.match匹配查詢

match,條件查詢指定的是一個非字符串的屬性,就是精確查詢

當指定的是字符串的屬性就是模糊查詢:(全文檢索)(倒排索引),最終會按照評分去進行排序,會對檢索的字符串進行分詞

4.match_phrase(短語匹配)

對字符串不進行分詞(精確查詢)

5.multi_match(多字段匹配)

6.bool(復合查詢)

must:必須滿足,

must_not:必須不滿足

should:應該,滿足最好,不滿足也行(滿足了加評分,會排在前面)

7.filter(結果過濾)

不會貢獻文檔的相關性得分

不用filter:

用了filter

8.term

類似于match,term用來找精確值字段,例如age

match用來全文檢索,字符串模糊查詢用,例如address

文本用match,數字用term

另外,區別 match_phrase 和 屬性名.keyword :

9.aggregations(執行聚合)

分析和檢索是一次性的:一次請求過去,我們既能查出數據,也能把數據分析到位

例如需求是:搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡,但不顯示這些人的詳情。

先看看查出所有 address 中包含 mill 的所有人, 并列舉出他們的年齡分布

再加一個平均值聚合

如何不看這些人的詳細信息呢,我們讓size=0,就可以只看聚合結果:

進階:子聚合 按照年齡聚合,并且請求這些年齡段的這些人的平均薪資

就可以查到如下結果:

再進階:查出所有年齡分布,并且這些年齡段中M(男)的平均薪資和F(女)的平均薪資以及這個年齡
段的總體平均薪資

3.Mapping映射

定義一個文檔如何被進行處理的:例如我們可以定義那個string類型的字段是可以被當作全文檢索的

像是創建SQL表時定義每一列數據類型是什么

1.字段類型

ES會在第一次保存數據的時候自動猜測數據類型

2.映射

就是每一個文檔的數據類型是什么

我們可以查看mapping信息

我們也可以在創建索引時指定映射(有很多類型,可以參考文檔)

1.修改映射

1.添加新的字段映射:

2.修改已經存在的字段

對于已經存在的映射字段,我我們是不能更新的

3.數據遷移

因為映射不支持修改,我們想要修改,能用的辦法就是新建一個映射字段,把數據遷移進去:

先創建一個新索引

下一步數據遷移:

這是沒有type的寫法

4.分詞

一個? tokenizer(分詞器)? 接收一個字符流,將之分割為獨立的 tokens(詞元,通常是獨立的單詞),然后輸出 tokens 流。例如,whitespace tokenizer遇到空白字符時分割文本。它會將文本"Quick brown fox!"分割為 [Quick, brown, fox!]。
該 tokenizer(分詞器)? 還負責記錄各個term(詞條) 的順序或 position 位置(用于 phrase 短語和 word proximity詞近鄰查詢),以及 term(詞條)所代表的原始word(單詞)的 start(起始)和 end(結束)的 characteroffsets(字符偏移量)(用于高亮顯示搜索的內容)。

Elasticsearch提供了很多內置的分詞器,可以用來構建custom analyzers(自定義分詞器)

為虛擬機的elasticsearch裝ik分詞器:

找到Releases · infinilabs/analysis-ik · GitHub對應的版本(我用的7.9.2)

解壓放在ik文件夾里放進plugins目錄下,重啟elasticsearch服務

測試分詞:

創建自定義詞庫:

下載nginx:

CentOS7下安裝NGINX_centos7下載nginx-CSDN博客,跟著這個步驟來,記得開防火墻的80端口,然后在/usr/local/nginx/html這個路徑下新建es文件夾,fenci.txt,會出現亂碼問題,后續解決;

配置ik分詞器的遠程詞庫地址:

來到ik的config文件夾:

至此,新詞就可以添加進/usr/local/nginx/html/es文件夾下的fenci.txt

5.Elasticsearch-Rest-Client

新建模塊:

修改配置文件,添加依賴:

新建config包,

添加common依賴,配置nacos注冊中心:

啟用服務注冊發現:

引入ElasticSearch-Rest-Client的步驟;

1.在pom文件里導入依賴

2.給容器中注入一個RestHighLevelClient

3.參照官方API進行操作:Java High Level REST Client | Java REST Client [7.17] | Elastic

RequestOptions:請求設置項:

開始測試:

1.index:(保存更新都可以)

2.復雜檢索:

1.先構造一個檢索請求searchRequest

2.構造檢索條件:

query條件構造:

聚合條件構造:嵌套使用 .subAggregation()

獲取查詢結果:

獲取分析數據:

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

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

相關文章

Java中為什么不能直接創建泛型數組

在Java中&#xff0c;不能直接創建泛型數組的主要原因是類型擦除和類型安全問題。 類型擦除 Java中的泛型是通過類型擦除&#xff08;Type Erasure&#xff09;實現的&#xff0c;這意味著在編譯時&#xff0c;泛型類型會被轉換成原始類型&#xff08;如 List<T> 會被轉…

網絡安全-網絡安全及其防護措施9

41.網絡故障排除 網絡故障排除的定義和重要性 網絡故障排除是指通過系統化的方法和工具&#xff0c;識別、診斷和解決網絡中出現的問題&#xff0c;以恢復正常的網絡服務和性能。有效的故障排除可以減少停機時間&#xff0c;提升網絡的穩定性和可靠性。 故障排除的步驟 問題…

基于X86+FPGA+AI數字化醫療設備:全自動尿沉渣檢測儀

助力數字醫療發展&#xff0c;信邁可提供全自動尿沉渣檢測儀專用計算機 隨著信息技術的不斷進步&#xff0c;醫療也進入了一個全新的數字化時代。首先是醫療設備的數字化&#xff0c;大大豐富了醫療信息的內涵和容量&#xff0c;具有廣闊的市場發展前景。 數字化醫療設備&…

使用Redis的SETNX命令實現分布式鎖

什么是分布式鎖 分布式鎖是一種用于在分布式系統中控制多個節點對共享資源進行訪問的機制。在分布式系統中&#xff0c;由于多個節點可能同時訪問和修改同一個資源&#xff0c;因此需要一種方法來確保在任意時刻只有一個節點能夠對資源進行操作&#xff0c;以避免數據不一致或…

白騎士的C++教學高級篇 3.1 文件操作

系列目錄 上一篇&#xff1a;白騎士的C教學進階篇 2.4 標準模板庫&#xff08;STL&#xff09; 文件操作是C編程中的一個重要部分&#xff0c;允許程序與外部存儲設備進行交互&#xff0c;從而實現數據的持久化存儲和讀取。C標準庫提供了豐富的文件操作功能&#xff0c;包括文…

嵌入式香橙派人工智能AI開發板詳細操作與遠程聊天實現

大家好&#xff0c;今天給大分享一個OrangePi AIpro&#xff08;20T&#xff09;采用昇騰作為主控芯片的開發板&#xff0c;開箱以及對應功能的詳細實現。 第一&#xff1a;板子基本介紹 接通電源給對應的開發板上電&#xff0c;觀察其中的現象&#xff0c;如下&#xff1a; 注…

基于HAL庫的stm32的OLED顯示屏顯示(IIC)

OLED OLED&#xff0c;即有機發光二極管( Organic Light Emitting Diode )。OLED由于同時具備自發光&#xff0c;不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優異之特性&#xff0c;被認為是下一代的平面顯示器…

龍國專利局瑞數6

聲明(lianxi a15018601872) 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 前言(lianxi a…

富文本中提取信息并去除其中的HTML或XML標簽

要從富文本中提取信息并去除其中的HTML或XML標簽&#xff0c;可以使用不同的編程語言和庫。以下是一些流行語言中的示例方法&#xff1a; 1. Python&#xff08;使用BeautifulSoup&#xff09; BeautifulSoup是一個強大的Python庫&#xff0c;用于從HTML或XML文件中提取數據。…

巨魔商店(TrollStore)介紹與使用指南

iOS巨魔商店&#xff08;TrollStore&#xff09;介紹與使用指南 引言 在iOS系統中&#xff0c;App Store是官方唯一的應用下載渠道&#xff0c;但這也限制了用戶獲取非官方或破解版應用的可能性。然而&#xff0c;巨魔商店&#xff08;TrollStore&#xff09;的出現打破了這一…

配置和保護SSH

使用SSH訪問遠程命令行 描述Secure Shell SSH&#xff08;Secure Shell&#xff09; 是一種網絡協議&#xff0c;用于在不安全的網絡上安全地進行系統管理和數據傳輸。它最初由 Tatu Ylnen 于1995年設計&#xff0c;并成為保護網絡服務免受攻擊的標準。SSH提供了多種功能&…

開始構建我們自己的大語言模型:數據處理部分

關注本專欄&#xff08;NLP簡論&#xff1a;手搓大語言模型實踐&#xff09; 繼續學習從頭編寫、訓練自己的大語言模型。 接上集&#xff0c;本章我們將深入說一下大語言模型數據處理部分的細節&#xff0c;并直接提供本部分的完整代碼。 【配套資源】 暫時的詞匯表&#xff1…

GNN論文粗讀

論文 文章目錄 論文基于異構圖的GNN論文GNN領域論文環境領域GNN論文 隨緣更新 基于異構圖的GNN論文 Distance Information Improves Heterogeneous Graph Neural Networks:DOI: 10.1109/TKDE.2023.3300879 轉導和歸納任務&#xff0c;創新點&#xff1a;異構距離編碼HDE提高GN…

關于Vue中涉及到大量數據的級聯菜單樹狀結構的數據多選勾選頁面卡頓卡死問題

項目場景&#xff1a;如題 提示&#xff1a;有個需求&#xff0c;級聯菜單樹狀結構的數據高達3萬多條&#xff0c;多選&#xff0c;只需要最后一層級value 原因分析&#xff1a;頁面一下子渲染大量數據會導致瀏覽器內存暴漲100%&#xff0c;導致頁面卡死&#xff0c;而且eleme…

常見Linux目錄和配置文件

目錄 /boot/&#xff1a;開機配置文件&#xff0c;也是存放核心vmlinuz的地方 /bin/&#xff1a;系統可執行文件目錄&#xff0c;CentOS7后合并到/usr/bin中&#xff0c;并鏈接過去 /sbin/&#xff1a;系統管理員常用指令存放目錄&#xff0c;例如開關機、磁盤分區等指令&am…

基于SpringBoot+Vue的廣場舞團系統(帶1w+文檔)

基于SpringBootVue的廣場舞團系統(帶1w文檔) 基于SpringBootVue的廣場舞團系統(帶1w文檔) 廣場舞團&#xff0c;為用戶隨時隨地查看廣場舞團信息提供了便捷的方法&#xff0c;更重要的是大大的簡化了管理員管理廣場舞團信息的方式方法&#xff0c;更提供了其他想要了解廣場舞團…

基于Trace的類型特化動態語言JIT編譯

文章目錄 Explain一、簡介二、一個跟蹤運行的示例三、跟蹤樹3.1 Traces類型特化&#xff08;Type specialization&#xff09; 3.2 Trace Trees3.3 黑名單&#xff08;Blacklisting&#xff09; 四、嵌套跟蹤樹4.1 Nesting Algorithm4.2 Blacklisting with Nesting 五、跟蹤樹優…

Java NIO 面試題及答案整理,最新面試題

Java NIO中的Buffer有哪些主要類型? Java NIO中的Buffer用于與NIO通道進行交互,作為基本的數據容器。主要類型包括: 1、ByteBuffer: 最常用的類型,用于存儲字節數據。 2、CharBuffer: 用于存儲字符數據。 3、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、Short…

【Pytorch】一文向您詳細介紹 torch.randn_like()

&#x1f389;&#x1f525;【Pytorch】一文向您詳細介紹 torch.randn_like() &#x1f525;&#x1f389; 下滑即可查看博客內容 &#x1f308; 歡迎蒞臨我的個人主頁 &#x1f448;這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地&#xff01;&#x1f387; …

滑動窗口題目

題目描述&#xff1a; 計算兩個字符串str1和str2在給定的含有n個元素的字符串數組strs中出現的最短距離。 詳細解釋&#xff1a; 定義整數變量n&#xff0c;用于存儲字符串數組strs的長度。定義一個vector<string>類型的變量strs&#xff0c;用于存儲輸入的字符串。定義…