大數據基礎---Elasticsearch是什么?


Elasticsearch是誰不重要,重要的是咱們都知道百度,谷歌這樣的搜索巨頭吧。它們的核心技術都利用了Elasticsearch,所以我們有必要對Elasticsearch了解下!

1.Elasticsearch簡介

1.1 百度百科這樣說

Elasticsearch是一個基於Lucense的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是Java語言開發的,並作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜索引擎。Elasticsearch用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在Java,.NET(C#),PHP,Python,Apache Groovy,Ruby和許多其它語言都是可用的。根據DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業搜索引擎,其次是[Apache Solr]([https://baike.baidu.com/item/apache solr](https://baike.baidu.com/item/apache solr)),也是基於Lucense。

1.2 Elasticsearch和Solr對比

從上圖可以了解到使用Solr的趨勢逐漸被Elasticsearch取代。

那么為什么會被取代呢?網上找了個圖可以參考下:

所以使用Elasticsearch的越來越多。

2.扒一扒Elasticsearch的祖先Lucene

2.1 百度百科這樣說

Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋。在Java開發環境里Lucene是一個成熟的免費開源工具。就其本身而言,Lucene是當前以及最近幾年最受歡迎的免費Java信息檢索程序庫。人們經常提到信息檢索程序庫,雖然與搜索引擎有關,但不應該將信息檢索程序庫與搜索引擎相混淆。

3.全文檢索和普通檢索的區別

當我們使用關系型數據庫時,要查詢包含某個關鍵字的文章,通常需要使用like %關鍵字 這種形式。如果僅僅是普通搜索的話,它會一行行遍歷去找。如果拋開建立索引的合法性,我們對文章建立了索引,這個時候查詢速度相對快一些,先去索引找,找到后再去找對應文章。 但是我們知道數據庫中索引采用的B+樹結構,這種結構是不適合建立大型索引的,而且文章較多的話,一個一個文章遍歷,想想都會花費很長時間,少則幾分鍾,多則無上限。

針對這種情況於是乎產生了全文檢索,也就是上面我們提到的包括Lucene和Elasticsearch都是全文檢索的一種實現。全文檢索采用的是倒排索引算法,它將文章的所有數據進行分割,分割成一個個詞匯,這些詞匯建立索引庫,這些索引庫里面的內容是不重復的,並且索引庫存放在了文件系統里面,索引庫不僅記錄了關鍵字,而且記錄了索引對應的文章和關鍵字偏移量。這樣當我們再次檢索時,就能從索引庫中快速找到關鍵字所對應的文章。

通常這些全文檢索引擎采用了分布式,大大提高了查詢效率和容錯性。

4.Elasticsearch的生態以及核心內容有哪些?

通過進入官網,我們即可了解到它的一些生態信息。

4.1 核心生態

通過瀏覽我們可以了解到Elasticsearch,KibanaLogstash(簡稱:ELK)構成了ES檢索的核心生態。

  • Logstash用於多渠道數據收集。
  • Elasticsearch(簡稱:ES)將收集的數據建立倒排索引存儲。
  • Kibana則提供了圖形化數據展示,以及針對Elasticsearch索引庫的操作。

崇尚授人以漁的思想,說說怎么去找上面的官方文檔。

緊隨上面的截圖往下拉即可看到Kibana和Logstash文檔入口。

Elasticsearch文檔相對隱蔽一些:

4.2相關API

對於程序員來講,最關心的當然是如何使用代碼進行實現。那么就滿足你,看下面:

Java REST Client [7.7]連接

4.3 其它生態

除了官方提供,還衍生了一些其它的開源項目。比如IK分詞,head UI展示,本地化社區等。

IK分詞項目:由於官方僅僅提供了英文和德文分詞,這個項目作為中文分詞很好了彌補了空缺。

head UI項目:和Kibana似的也能對ES進行操作,但是這個項目還能展示有哪些節點在運行以及節點的信息。項目是基於node運行,所以要提前搭建好node環境。

界面展示效果如下:

中文交流社區:這個是IK分詞medcl大神建立的,有問題可以提問。但是最近貌似因為灌水的太多,做了一些限制,新人必須達到瀏覽時長才能發帖。

中文翻譯組織:這個也是medcl大神創建的,提供ES中文翻譯,有興趣的都可以申請加入。

4.4 ElasticSearch一些基本概念

在正式學習之前下面的基本概念是需要了解的。

term

term是一個被索引的精確的值。terms:foo, Foo, FOO 是不等價的。Terms可以使用term query查詢。例如:"我愛中國"被分詞為,我/愛/中國 ,那么有3個term,分別是:我,愛,中國 。

analysis

把字符串轉換為terms的過程。基於它使用可那些分詞器,短語:FOO BAR, Foo-Bar, foo,bar有可能分詞為terms:foo和bar。這些terms會被存儲在索引中。全文索引查詢(不是term query)“FoO:bAR”,同樣也會被分詞為terms:foo,bar,並且也匹配存在索引中的terms。分詞過程(包括索引或搜索過程)使es可以執行全文查詢。

cluster

集群由一個或多個節點組成,它們都使用同一個集群名。每個集群都有單個master節點,他是自動被集群選舉的,如果當前master節點發生故障,可以用候選master節點代替它。

document

文檔是一個json文檔,它存儲在es中。它就好像是關系數據庫中table中的一行。每個文檔都保存在索引中,並且屬於一個type和有一個id字段。文檔是一個json對象(在其他語言中是hash/hashmap/管關聯數組)它包含0個或多個字段,或key-value對。被索引的原始的json文檔會被保存在_source字段,當執行getting或searching操作時會默認返回該字段。

id

識別文檔的id。文檔的index/type/id必須是唯一的,如果沒有提供id,將會自動生成id

field

文檔包含一系列的字段,或者key-value 對。每個值都有可以是單個值(string,intger,date)或者是一個像數組的nested 結構或者對象。字段和關系數據庫中的列類似。不要和文檔type混淆。

index

索引就像關系數據庫中的一個表,它包含一個mapping,mapping定義索引的字段,它由多個type組成。索引是一個邏輯命名空間,它映射到一個或多個主分片和0個或多個復制分片。

mapping

mapping就像關系數據庫中的schema。每個索引都有一個mapping,它定義了index中的type,和一系列索引level的選項。mapping可以顯示定義或者在索引文檔時自動生成。

node

節點是一個運行中的es實例,它屬於一個集群。可以在一個服務器啟動多個節點用於測試,但通常都是一個服務器一個節點。在啟動的時候節點會使用單播查找一個具有相同集群名並且已存在的集群,並嘗試加入它。

primary shard

每個文檔都保存在單個主分片中。當你索引一個文檔,他首先會在主分片索引,然后告訴所有該主分片的復制分片。默認,索引有5個主分片,你可以根據你的文檔數量指定更小或更多的主分片。當索引創建之后,你不能改變主分片的數量。

replica shard

每個主分片都有一個或多個復制分片。復制分片是主分片的副本,用於以下兩個目的:

  1. 提升容錯能力,復制分片提升為主分片,如果主分片不可用。
  2. 提升性能,get和search請求可以被主分片或者復制分片處理。默認,每個主分片都有一個復制分片,可以動態修改復制分片的數量。永遠不要在相同的節點同時存放主分片和復制分片。

routing

當你索引一個文檔,它被保存在單個主分片,並基於對routing的值進行hash計算映射到對應的分片。默認被hash的值來自文檔id或者文檔的父文檔id(確保父文檔和子文檔存儲在同一個分片)。這個值可以在索引期間指定routing參數或在mapping中使用routing字段修改。

shard

分片是單個lucene索引實例。ta是一個底層的“woker”單位,它由es自動管理。一個索引是一個邏輯的命名空間,它指向主分片和復制分片。而不是定義主分片和復制分片的數量,你從來都不需要直接引用主分片。相反,你的代碼僅僅需要引用索引。es會在集群的所有節點中分發分片,並可以自動在節點之間移動分片,當節點出現故障時或者添加額外的節點。

source field

默認,你索引的JSON文檔會被存儲在_source字段,並會在所有的get和search請求中返回。這允許你直接從搜索結果中直接訪問原始的對象,而不需要先查詢id然后再獲取文檔。

text

text是普通非結構化的文本,例如段落。默認,text會被分詞成terms,索引實際上儲存的是terms。text 字段需要在索引期間進行分詞,這樣才可以進行全文搜索,查詢字符串在搜索期間也需要被分詞。 fuzhi

type

type呈現文檔的類型,例如 email,user,或weet。search API 可以根據type過濾文檔。索引可以包含多個type,每個type包含一系列的字段。同一個索引不同type字段名相同的字段必須具有相同的mapping。

docvalues

它保存某一列的數據,並索引它,用於加快聚合和排序的速度。

fileddata

它保存某一列的數據,並索引它,用於加快聚合和排序的速度。和docvalues不一樣的是,fielddata保存的是text類型的字段分詞后的terms,而不是保存源字段數據。

shardcopies

分片副本集合,包含主分片和復制分片

segment

每個分片都分為多個segment存儲。小的segment和定期合並成大的segment

master

master 節點用於執行輕量的集群操作,例如:創建刪除索引,跟蹤節點,決定分片分發到哪個節點等。每個集群同時只有一個master節點和0個或多個master候選節點。

基本的介紹就到這里,下一章是講解如何搭建,以及踩過的地雷。

系列傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM