ElasticSearch 實現分詞全文檢索

2023-03-03 12:03:55

目錄

ElasticSearch 實現分詞全文檢索 - 概述
ElasticSearch 實現分詞全文檢索 - ES、Kibana、IK安裝 --待發布
ElasticSearch 實現分詞全文檢索 - Restful基本操作 --待發布
ElasticSearch 實現分詞全文檢索 - Java SpringBoot ES 索引操作 --待發布
ElasticSearch 實現分詞全文檢索 - Java SpringBoot ES 檔案操作 --待發布
ElasticSearch 實現分詞全文檢索 - 測試資料準備 --待發布
ElasticSearch 實現分詞全文檢索 - term、terms查詢 --待發布
ElasticSearch 實現分詞全文檢索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查詢 --待發布
ElasticSearch 實現分詞全文檢索 - Scroll 深分頁 --待發布
ElasticSearch 實現分詞全文檢索 - delete-by-query --待發布
ElasticSearch 實現分詞全文檢索 - 複合查詢 --待發布
ElasticSearch 實現分詞全文檢索 - filter查詢 --待發布
ElasticSearch 實現分詞全文檢索 - 高亮查詢 --待發布
ElasticSearch 實現分詞全文檢索 - 聚合查詢 cardinality --待發布
ElasticSearch 實現分詞全文檢索 - 經緯度查詢 --待發布

需求

做一個類似百度的全文搜尋功能


所用的技術如下:

  • ElasticSearch
  • Kibana 管理介面
  • IK Analysis 分詞器
  • SpringBoot

全文檢索流程

  • 建立ES索引、設定需要分詞查詢的 field
  • 可以通過 canal 對 MySQL binlog 進行資料同步,或者 flink 或者 SpringBoot 直接往ES裡新增資料
  • 根據業務需求,通過 SpringBoot 進行查詢

ElasticSearch 簡介

ES 是一個使用Java語言並且基於Lucene編寫的搜尋引擎框架,他提供了分散式的全文搜尋功能,提供了一個統一的基於Restful風格的WEB介面,官方使用者端也對多種語言都提供了相應的API。

Lucene:Lucene本身就是一個搜尋引擎的底層
分散式:ES主要是為了突出他的橫向擴充套件能力。
全文檢索:將一段詞語進行分詞,並且將分出來的單個詞語統一放到一個分詞庫中,在搜尋時,根據關鍵字去分詞庫中檢查,找到匹配的內容。(倒排索引)
Restful 風格的WEB介面:操作ES很簡單,只需要傳送一個HTTP請求,並且根據請求方式的不同,攜帶引數,執行相應的功能。
應用廣泛:Github, wiki, gold man 用ES每天維護將近10TB的資料。

ES 結構

索引

ES的服務中,可以建立多個索引,每個索引預設被分成5個分片儲存(提高查詢效率、儲存容量),每個分片至少有一個備份分片
備份分片預設不會分擔查詢效率,當ES檢索壓力特別大的時候,備份分片才會幫助檢索資料
備份的分片必須放在不同的伺服器中(叢集)

型別

索引可以分多個分版 ,每個分片中有多個type,ES版本不同,型別的建立也不同
7.x 預設不再支援自定投索引型別(預設型別為_doc)

檔案

一個type又可以分多個 document 檔案 (一個個檔案,相當於RDB中的一行行資料),每個檔案中有多個field屬性
一個MySQL有多個資料庫,一個庫中有多個表,一張表中存放著多行資料,每行資料中分多個列

一個檔案包括多個屬性,相當於RDB中的欄位

ES和Slor

Slor 在查詢死資料時(不能改變的資料,不增加、不減少),速度相對ES更快一些。但是資料如果是實時改變時,Solr的查詢速度會降低很多,ES的查詢效率基本沒有變化。

Solr搭建叢集時,需要依賴Zookeeper來幫助管理。ES本身就支援叢集的搭建,不需要第三方的介入

Solr針對國內的中文檔案不多,ES社群火爆,檔案健全

ES 對現在雲端計算和巨量資料支援特別好

倒排索引

將存放的資料,以一定的方式進行分詞,並且將分詞的內容存放到一個單獨的分詞庫中。
當用戶去查詢資料時,會將使用者的查詢關鍵字進行分詞
然後去分詞庫中匹配內容,最終得到資料的ID標識
根據ID標識去存放資料的位置拉取到指定的資料