Elasticsearch由Shay banon在2004年進行初步開發,而且在2010年2月發佈第一個版本。java
此後Shay banon在2012創建Elasticsearch BV公司,繼續圍繞Elasticsearch提供相關軟件和產品。node
Elasticsearch是一個實時的分佈式搜索分析引擎,它能讓你以一個史無前例的體驗來探索你的數據。sql
它常被做用於全文檢索、結構化搜索、數據分析這三個功能的組合。docker
Elasticsearch基於Apache Lucene的開源搜索引擎,而Lucene不管是在開源亦或是專有領域來講,它能夠被認爲是迄今爲止最早進、性能最好、功能最豐富的的搜索引擎庫。數據庫
可是,Lucene僅是一個Java庫,要想使用它你必須熟知Java並將其直接集成到你的應用中,更加糟糕的是Lucene很是複雜,你須要深刻了解檢索的相關知識來理解它是如何工做的。bootstrap
而Elasticsearch將Lucene當作核心,並屏蔽了大部分複雜的操做,經過簡單的RESTful API進行調用,從而讓全文搜索變的簡單。vim
Elasticsearch與MySQL的區別較大,其數據存儲採用JSON格式。centos
在其中,各個名詞術語也是不相同的,以下表所示:數組
Elasticsearch | SQL |
---|---|
索引 | 庫 |
類型(7版本後淡化該概念,8版本可能會被移除) | 表 |
文檔 | 記錄 |
filed | 字段 |
同時,MySQL並不適用於全文檢索,如要查詢某個字符串%,必須使用全表掃描瀏覽器
而Elasticsearch則很是適合全文檢索,而且能夠靈活的存儲不一樣類型的數據
如下是Elasticsearch應用場景:
除此以外,相較於MySQL部署分佈式的繁瑣,Elasticsearch天生支持分佈式,部署簡單,維護輕鬆,也是對運維人員很是友好的一款數據庫產品。
一言以蔽之,Elasticsearch的出現並不是爲了取代SQL,而是專一於SQL不擅長的領域與其進行互補。
Elasticsearch安裝方式有如下4種:
docker:
優勢:
缺點:
tar
優勢:
缺點:
rpm | deb:
優勢:
缺點:
ansible
優勢:
缺點:
在這裏將採用rpm進行安裝,版本爲7.6.1,算是目前較新的版本。
1)安裝Java環境,最少要求1.8:
$ yum install -y java-1.8.0-openjdk.x86_64
2)下載安裝軟件,若是速度慢能夠在其餘瀏覽器上進行下載後經過scp傳輸:
$ cd ~ $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-x86_64.rpm
3)進行安裝:
$ rpm -ivh elasticsearch-7.6.1-x86_64.rpm
1)從新加載sys項目:
$ systemctl daemon-reload
2)配置開機啓動:
$ systemctl enable elasticsearch.service
3)啓動Elasticsearch服務(過程較慢,查看日誌,耐心等待):
$ systemctl start elasticsearch.service
4)查看啓動狀態,確保配置文件沒有問題:
$ systemctl status elasticsearch.service
5)因爲Elasticsearch啓動較慢,檢查服務進程是否成功啓動:
$ ps -ef | grep elasticsearch $ netstat -lnpt | grep 9200 # 查看9200端口
若是啓動失敗,請檢查內存等是否充裕,或者進行jvm內存限制。
經過如下命令查看Elasticsearch安裝目錄:
$ rpm -ql elasticsearch
經過如下命令查看Elasticsearch配置文件:
$ rpm -qc elasticsearch
重要目錄與文件:
/etc/elasticsearch/elasticsearch.yml # 配置文件 /etc/elasticsearch/jvm.options # jvm虛擬機配置文件 /etc/init.d/elasticsearch # init啓動文件 /etc/sysconfig/elasticsearch # 環境變量配置文件 /usr/lib/sysctl.d/elasticsearch.conf # sysctl變量文件 /usr/lib/systemd/system/elasticsearch.service # systemd啓動文件 /var/lib/elasticsearch # 數據目錄 /var/log/elasticsearch # 日誌目錄 /var/run/elasticsearch # pid目錄
Elasticsearch的默認配置已經作得很是好,可是如下一些配置你能夠進行選配:
# 查看數據和日誌目錄 $ egrep -v "^#" /etc/elasticsearch/elasticsearch.yml
配置項:
cluster.name: my-application # 集羣名稱 node.name: node-1 # 節點名稱 path.data: /data/elasticsearch # 數據目錄 path.logs: /var/log/elasticsearch # 日誌目錄 bootstrap.memory_lock: true # 鎖定內存 network.host: localhost # 綁定IP地址 http.port: 9200 # 綁定端口號 discovery.zen.ping.unicast.hosts: [「localhost」] # 集羣發現的通信節點 discovery.zen.minimum_master_nodes: 2 # 最小主節點數
修改內存配置,打開註釋:
$ vim /etc/elasticsearch/elasticsearch.yml # 所在集羣名稱與該服務在集羣中的名稱 cluster.name: my-application node.name: node-1 # 服務綁定的地址和端口 network.host: 192.168.0.110 http.port: 9200 # 做爲集羣主節點啓動 cluster.initial_master_nodes: ["node-1"] # 是否開啓內存限制 action.destructive_requires_name: true
在jvm虛擬機中進行內存限定,根據實際狀況進行設定,因爲我這臺centos7的服務器內存較小,所以設定的也比較小,注意這裏最大不能超過32G:
$ vim /etc/elasticsearch/jvm.options -Xms512m # 最小內存 -Xmx512m # 最大內存
重啓生效:
$ systemctl restart elasticsearch.service
若是你的數據目錄發生了變動,請確保使用Elasticsearch的管理用戶對目錄進行受權操做:
$ id elasticsearch uid=996(elasticsearch) gid=992(elasticsearch) 組=992(elasticsearch)
再也不進行演示。
在Elasticsearch中索引詞(term)是一個可以被索引的精確值。
foo、Foo、FOO幾個單詞是不一樣的索引詞。
索引詞(term)是能夠經過term查詢進行準確的搜索。
文本是一段普通的非結構化文字。
一般,文本會被分拆成一個個的索引詞,存儲在elasticsearch 的索引庫中。
爲了讓文本可以進行搜索,文本字段須要事先進行分析了;
當對文本中的關鍵詞進行查詢的時候,搜索引擎應該根據搜索條件搜索出原文本。
分析是將文本轉換爲索引詞的過程,分析的結果依賴於分詞器。
好比:FOO BAR、Foo-Bar和 foo bar這幾個詞有可能會被分析成相同的索引詞foo和bar,這些索引詞存儲在Elasticsearch的索引庫中。
集羣由一個或多個節點組成,對外提供服務,對外提供索引和搜索功能。
在全部節點,一個集羣有一個惟一的名稱默認爲「elasticsearch」
此名稱是很重要的,由於每一個節點只能是集羣的一部分,當該節點被設置爲相同的集羣名稱時,就會自動加入集羣。
當須要有多個集羣的時候,要確保每一個集羣的名稱不能重複,不然節點可能會加入到錯誤的集羣。
請注意,一個節點只能加入到一個集羣。
此外,你還能夠擁有多個獨立的集羣,每一個集羣都有其不一樣的集羣名稱。
一個節點是一個邏輯上獨立的服務,它是集羣的一部分,能夠存儲數據,並參與集羣的索引和搜索功能。
就像集羣同樣 ,節點也有惟一的名字,在啓動的時候分配。
若是你不想要默認名稱,你能夠定義任何你想要的節點名。
這個名字在數據處理中很重要,在Elasticsearch集羣經過節點名稱進行管理和通訊,一個節點能夠被配置加入到一個特定的集羣。
默認狀況下,每一個節點會加入名爲Elasticsearch 的集羣中,這意味着若是你在局域網中部署多個節點,若是網絡暢通,他們能彼此發現並自動加入名爲Elasticsearch 的一個集羣中。
你能夠擁有多個你想要的節點。當網絡沒有集羣運行的時候,只要啓動一個節點,這個節點會默認生成一個新的集羣,這個集羣也會有本身的一個節點。
分片是單個Lucene 實例,這是Elasticsearch管理的比較底層的功能。
索引是指向主分片和副本分片的邏輯空間。
對於使用,只須要指定分片的數量,其餘不須要作過多的事情。
在開發使用的過程當中,咱們對應的對象都是索引 ,Elasticsearch 會自動管理集羣中全部的分片,當發生故障的時候,Elasticsearch 會把分片移動到不一樣的節點或者添加新的節點。
一個索引能夠存儲很大的數據,這些空間能夠超過一個節點的物理存儲的限制。
例如:十億個文檔佔用磁盤空間爲 1TB。
僅從單個節點搜索可能會很慢,還有一臺物理機器也不必定能存儲這麼多的數據。
爲了解決這一問題 ,Elasticsearch將索引分解成多個分片。
當你建立一個索引,你能夠簡單地定義你想要的分片數量。
每一個分片自己是 一個全功能的、獨立的單元,能夠託管在集羣中的任何節點。
每一個文檔都存儲在一個分片中,當你存儲一個文檔的時候,系統會首先存儲在主分片中,而後會複製到不一樣的副本中。
默認狀況下,一個索引有5個主分片。
你能夠事先制定分片的數量,當分片一旦創建,則分片的數量不能修改。
每個分片有零個或多個副本。
副本主要是主分片的複製,其中有兩個目的:
默認情況下,一個主分片配有一個副本,但副本的數量能夠在後面動態地配置增長。
副本分片必部署在不一樣的節點上,不能部署在和主分片相同的節點上。
索引是具備相同結構的文檔集合。
例如:能夠有一個客戶信息的索引,包括一個產品目錄的索引,一個訂單數據的索引 。
在系統上索引的名字所有小寫,經過這個名字能夠用來執行索引、搜索、更新和刪除操做等。
在單個集羣中,能夠定義多個你想要的索引。
在索引中,能夠定義一個或多個類型,類型是索引的邏輯分區。
在通常狀況下,一種類型被定義爲具備一組公共字段的文檔。
例如,讓咱們假設你運行一個博客平臺,並把全部的數據存儲在一個索引中。
在這個索引中,你能夠定義一種類型爲用戶數據,一種類型爲博客數據,另外一種類型爲評論數據。
文檔是存儲在Elasticsearch中的一個JSON格式的字符串。
它就像在關係數據庫中表的一行。
每一個存儲在索引中的 一個文檔都有一個類型和一個ID,每一個文檔都是一個JSON對象,存儲了零個或者多個字段,或者鍵值對。
原始的 JSON 文檔假存儲在一個叫做Sour的字段中。
當搜索文檔的時候默認返回的就是這個字段。
映射像關係數據庫中的表結構。
每個索引都有一個映射,它定義了索引中的每個字段類型,以及一個索引範圍內的設置。
一個映射能夠事先被定義,或者在第一次存儲文檔的時候自動識別。
文檔中包含零個或者多個字段,字段能夠是一個簡單的值(例如字符串、整數、日期),也能夠是一 個數組或對象的嵌套結構。
字段相似於關係數據庫中表的列。
每一個字段都對應一個字段類型,例如整數、字符串、對象等。
字段還能夠指定如何分析該字段的值。
ID是一個文件的惟一標識。
若是在存庫的時候沒有提供ID,系統會自動生成一個ID。
文檔的 index與type的ID必須是惟一的。
複製是一個很是有用的功能,否則會有單點問題。
當網絡中的某個節點出現問題的時候,複製能夠對故障進行轉移,保證系統的高可用。
所以,Elasticsearch容許你建立一個或多個拷貝,你的索引分片就造成了所謂的副本或副本分片。
複製是重要的,主要的緣由有:
索引能夠複製零個或者多個分片,一旦複製,每一個索引就有了主分片和副本分片。
分片的數量和副本的數量能夠在建立索引時定義,當建立索引後,你能夠隨時改變副本的數量,但你不能改變分片的數量。
默認情況下,每一個索引分配5個分片和一個副本,這意味着你的集羣節點至少要有兩個節點,你將擁有5個主要的分片和5個副本分片共計10個分片。
每一個Elasticsearch分片是一個Lucene 的索引。
有文檔存儲數量限制,你能夠在一個單一的Lucene索引中存儲的最大值爲lucene-5843,極限是2147483519(=integer.max_value-128)個文檔。
你可使用cat/shards API監控分片的大小。
Elasticsearch基於Lucene,而Lucene可以作到全文檢索的功能就依賴於倒排索引。
document被成功index錄入後,Elasticsearch會對index建立一張倒排索引表。
以下所示,這裏有2個文檔,都在一個index中:
DOCUMENT1 : "Hello,Elasticsearch" DOCUMENT2 : "Hello,World And Elasticsearch"
這個index的倒排索引表以下,它會將上述document的詞彙進行拆分並記錄:
term(精確查找) | document01 | document02 |
---|---|---|
Hello | √ | √ |
World | × | × |
Hi | × | × |
Elasticsearch | √ | √ |
And | × | √ |
在進行查詢時,會經過關鍵詞命中得到分數,分數越高查詢的條件排名越靠前。
如,我查詢的詞彙是 「Hello World」,結果以下:
DOCUMENT2 : Hello 存在 World 存在 得分 2 DOCUMENT1 : Hello 存在 World 不存在 得分 1