ElasticSearch 實現分詞全文檢索 - 概述

VipSoft發表於2023-03-03

需求

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

image
所用的技術如下:

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

ElasticSearch 簡介

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

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

ES 結構

image

索引

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

image

型別

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

文件

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

一個文件包括多個屬性,相當於RDB中的欄位
image

ES和Slor

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

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

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

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

倒排索引

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

全文檢索流程

image

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

相關文章