自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ElasticSearch 是如何建立索引的?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
雖然 ElasticSearch 技術(shù)可以實(shí)現(xiàn)高效的檢索,但是也帶來了相應(yīng)的部署以及一致性維護(hù)成本,在一些小型項(xiàng)目中,還是會(huì)用數(shù)據(jù)庫模糊匹配的方式實(shí)現(xiàn)關(guān)鍵詞檢索。你可以思考一下,在你負(fù)責(zé)的項(xiàng)目中,是如何實(shí)現(xiàn)關(guān)鍵詞檢索的?

在討論 ElasticSearch 之前,不得不提 Apache Lucene,因?yàn)?ElasticSearch 的廣泛應(yīng)用離不開 Lucene 的支持。

Lucene 是一個(gè)開源的全文檢索引擎類庫,支持各種分詞以及搜索相關(guān)的實(shí)現(xiàn),可以極大地簡化搜索開發(fā)的成本,但 Lucene 只是一個(gè)工具包,在實(shí)際項(xiàng)目中進(jìn)行二次開發(fā),你需要非常熟悉 Lucene 的實(shí)現(xiàn)機(jī)制以及 API 應(yīng)用,這樣才能應(yīng)用 Lucene 的各種特性。

現(xiàn)在有了 ElasticSearch,就可以直接使用基于 Lucene 的各種檢索功能,ElasticSearch 是一個(gè)基于 Lucene 的分布式全文檢索框架,在 Lucene 類庫的基礎(chǔ)上實(shí)現(xiàn),可以避免直接基于 Lucene 開發(fā),這一點(diǎn)和 Java 中 Netty 對 IO/NIO 的封裝有些類似。

ElasticSearch 開放了一系列的 RESTful API,基于這些 API,可以快捷地實(shí)現(xiàn)各種搜索功能。另外一方面,除了搜索相關(guān)的功能,ElasticSearch 還對分布式場景下的應(yīng)用有特別好的支持,包括良好的擴(kuò)展性,可以擴(kuò)展到上百臺(tái)服務(wù)器的集群規(guī)模,以及近似實(shí)時(shí)分析的索引實(shí)現(xiàn)。這些特點(diǎn),使得 ElasticSearch 在各類搜索場景、大數(shù)據(jù)分析等業(yè)務(wù)中廣泛應(yīng)用。

ElasticSearch 應(yīng)用

ElasticSearch 對搜索的支持非常好,但是和 NoSQL 數(shù)據(jù)庫一樣,對事務(wù)、一致性等的支持較低。

下面是一個(gè)實(shí)際開發(fā)中,常見的數(shù)據(jù)庫-索引-緩存系統(tǒng)架構(gòu)圖:

圖片圖片

可以看到,ElasticSearch 一般是作為持久性數(shù)據(jù)庫的輔助存儲(chǔ),是和 SQL & NoSQL 數(shù)據(jù)庫一起使用,對外提供索引查詢功能。關(guān)系型數(shù)據(jù)庫保證數(shù)據(jù)更新的準(zhǔn)確性,在關(guān)系型數(shù)據(jù)庫更新以后,通過 binlog 同步結(jié)合消息隊(duì)列分發(fā)的方式,來更新文件索引,提供一致性保證。

ELK stack

ElasticSearch 是由 Elastic 公司創(chuàng)建的,除了 ElasticSearch,Elastic 公司還有另外兩款產(chǎn)品,分別是 Logstash 及 Kibana 開源項(xiàng)目,這三個(gè)開源項(xiàng)目組合在一起稱為 ELK stack。

在 ELK 技術(shù)棧中,ElasticSearch 用于數(shù)據(jù)分析和檢索,Logstash 用于日志收集,Kibana 用于界面的展示,ELK 可以用于快速查詢數(shù)據(jù)并可視化分析,在日志處理、大數(shù)據(jù)等領(lǐng)域有非常廣泛的應(yīng)用。我在一個(gè)項(xiàng)目中曾經(jīng)基于 ELK 部署過日志收集和告警系統(tǒng),ELK 的文檔和各種問題手冊非常全面,可以說是開箱即用。

索引是如何建立的

ElasticSearch 存儲(chǔ)的單元是索引,這一點(diǎn)區(qū)別于很多關(guān)系型數(shù)據(jù)庫和 NoSQL 數(shù)據(jù)庫,比如關(guān)系型數(shù)據(jù)庫是按照關(guān)系表的形式組織數(shù)據(jù),大部分 NoSQL 數(shù)據(jù)庫是 K-Value 的鍵值對方式。

ElasticSearch 存儲(chǔ)的基本單元是索引,那么索引是如何創(chuàng)建的呢?

ElasticSearch 索引的實(shí)現(xiàn)基于 Lucene,使用倒排索引的結(jié)構(gòu),倒排索引的引入,使得 ElasticSearch 可以非常高效地實(shí)現(xiàn)各種文件索引。倒排索引不光是在 ElasticSearch 等組件中應(yīng)用,它還是百度等搜索引擎實(shí)現(xiàn)的底層技術(shù)之一。在搜索引擎中,索引的建立需要經(jīng)過網(wǎng)頁爬取、信息采集、分詞、索引創(chuàng)建的過程,不過在 ElasticSearch 內(nèi)部存儲(chǔ)的實(shí)現(xiàn)中,數(shù)據(jù)的寫入可以對比搜索引擎對網(wǎng)頁的抓取和信息采集的過程,只需要關(guān)注分詞和索引的創(chuàng)建。

分詞和索引

分詞是在索引建立中特別重要的一個(gè)環(huán)節(jié),分詞的策略會(huì)直接影響索引結(jié)果。Lucene 提供了多種分詞器,分詞器是一個(gè)可插拔的組件,包括內(nèi)置的標(biāo)準(zhǔn)分詞器, 也可以引入對中文支持較好的 IKAnalyze 中文分詞器等。

下面我們通過一個(gè)例子來了解分詞的具體過程,假設(shè)我們在 ElasticSearch 中新增了兩個(gè)文檔,每個(gè)文檔包含如下內(nèi)容:

  • 文檔1,Jerry and Tom are good friends.
  • 文檔2,Good friends should help each other.

英文是有單詞的,單詞之間通過空格進(jìn)行拆分,所以對英文的分詞相對容易,比如上面的內(nèi)容,可以直接對字符串按照空格拆分,得到分詞后的數(shù)組。

Jerry / / and / / Tom / / are / / good / / friends / . Good / / friends / / should / / help / / each / / other / .

如果是中文,除了標(biāo)點(diǎn)符號以外,一個(gè)整句是沒有分隔符的,處理起來就會(huì)復(fù)雜得多。一般來說,中文分詞用得比較多的策略是基于字典的最長字符串匹配方式,這種策略可以覆蓋大多數(shù)場景,不過還是有一小部分天然存在歧義的文檔是無法處理的。比如「學(xué)生會(huì)組織各種活動(dòng)」,按照最長串匹配的方式,可以切分成“學(xué)生會(huì)/組織各種活動(dòng)”,但實(shí)際要表達(dá)的可能是“學(xué)生/會(huì)/組織各種活動(dòng)”。

現(xiàn)在有一個(gè)很火熱的學(xué)科叫作自然語言處理,研究的問題就包括如何消除語義分析中的各種歧義問題,感興趣的同學(xué)可以去了解下。

建立索引

索引存儲(chǔ)的結(jié)構(gòu)是倒排索引,什么是倒排索引呢?倒排索引是相對于正排索引來說的,倒排索引描述了一個(gè)映射關(guān)系,包括文檔中分詞后的結(jié)果,以及分別包含這些單詞的文檔列表。

索引描述的其實(shí)就是關(guān)鍵詞和文檔的關(guān)系,正排索引就是“文檔—關(guān)鍵詞”的格式,倒排索引則相反,是“關(guān)鍵詞—文檔”的格式??梢钥吹?,當(dāng)需要使用關(guān)鍵詞進(jìn)行檢索時(shí),使用倒排索引才能實(shí)現(xiàn)快速檢索的目的。

針對上面的分詞示例,我們簡單起見,統(tǒng)一為小寫,把分詞之后的單詞組成一個(gè)不重復(fù)的分詞列表,為了更好地進(jìn)行查找,可以按照字典序排序。

and,are,each,friends,good,help,jerry,other,should,tom

比如,其中“friends”在文檔 1 和文檔 2 中都出現(xiàn)了,“Tom”和“Jerry”只在文檔 1 中出現(xiàn)了 1 次,其他的單詞也進(jìn)行同樣地處理,于是我們可以構(gòu)建下面的倒排索引:

分詞

文檔列表



friends

文檔 1,文檔 2

good

文檔 1,文檔 2

jerry

文檔 1,

tom

文檔 1


以下省略

具體到數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),可以通過實(shí)現(xiàn)一個(gè)字典樹,也就是 Trie 樹,對字典樹進(jìn)行擴(kuò)展,額外存儲(chǔ)對應(yīng)的數(shù)據(jù)塊地址,定位到具體的數(shù)據(jù)位置。

圖片圖片

對比 B+ 樹

MySQL InnoDB 引擎的索引實(shí)現(xiàn)是基于 B+ 樹,那么同樣是索引,倒排索引和 B+ 樹索引有哪些區(qū)別呢?

嚴(yán)格地說,這兩類索引是不能在一起比較的,B+ 樹描述的是索引的數(shù)據(jù)結(jié)構(gòu),而倒排索引是通過索引的組織形式來命名的。比如我們上面的例子中,倒排指的是關(guān)鍵詞和文檔列表的結(jié)構(gòu)關(guān)系。

對于數(shù)據(jù)庫來說,索引的作用是提高數(shù)據(jù)查詢的性能,考慮到磁盤尋址的特性,選擇了 B+ 樹作為索引的實(shí)現(xiàn)結(jié)構(gòu),可以更好地實(shí)現(xiàn)通過主鍵以及通過區(qū)間范圍查找的要求。

對于倒排索引,則是對應(yīng)具體的應(yīng)用場景,我們在搜索中是通過一些關(guān)鍵詞,定位到具體的文檔。所以倒排索引實(shí)現(xiàn)的是根據(jù)關(guān)鍵詞,也就是分詞的結(jié)果,去查找文檔,或者不同的網(wǎng)頁。

總結(jié)

這一課時(shí)介紹了 ElasticSearch 存儲(chǔ)組件及其應(yīng)用,日志分析的三大件之 ELK 技術(shù)棧,以及倒排索引是如何實(shí)現(xiàn)的。

雖然 ElasticSearch 技術(shù)可以實(shí)現(xiàn)高效的檢索,但是也帶來了相應(yīng)的部署以及一致性維護(hù)成本,在一些小型項(xiàng)目中,還是會(huì)用數(shù)據(jù)庫模糊匹配的方式實(shí)現(xiàn)關(guān)鍵詞檢索。你可以思考一下,在你負(fù)責(zé)的項(xiàng)目中,是如何實(shí)現(xiàn)關(guān)鍵詞檢索的?

責(zé)任編輯:武曉燕 來源: 程序員wayn
相關(guān)推薦

2025-04-10 01:11:00

2016-09-07 15:02:03

ElasticSear索引速度

2020-03-17 23:08:32

數(shù)據(jù)Elasticsear存儲(chǔ)

2020-09-28 15:34:38

ElasticSear索引MySQL

2010-11-29 10:22:46

Sybase建立索引

2019-07-02 08:24:07

HTTPHTTPSTCP

2012-12-04 10:29:47

PostgreSQL索引

2010-05-31 12:31:42

MySQL建立索引

2012-05-07 15:32:46

Erlang

2023-02-22 08:28:22

開源搜索引擎python

2021-12-13 01:40:29

ElasticSear倒排索引

2018-11-08 09:40:04

蘇寧智能維護(hù)系統(tǒng)Python

2019-12-13 09:14:35

HTTP2協(xié)議

2015-06-25 10:26:41

YelpMesosDocker

2021-05-19 09:51:31

MySQL-B+樹數(shù)據(jù)

2011-04-01 15:36:24

索引SQL Server

2011-08-15 18:20:05

建立索引SQL Sever數(shù)據(jù)

2011-08-16 13:27:34

索引

2023-09-28 09:03:56

開源搜索分析引擎

2021-06-18 09:02:26

FlaskES搜索 Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號