開源的Elasticsearch (以下簡稱 Elastic)是目前全文搜索引擎的首選。它可以快速地儲存、搜索和分析海量數據。維基百科、Stack Overflow、Github 都採用它。
最近在工作上使用到了Elasticsearch全文搜索引擎,打算系統學習一下,出一個系列相關的文章,歡迎大家一起討論。
一、簡介
ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful Web接口。同時Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。
Lucene與Elastic
Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋。在Java開發環境裏Lucene是一個成熟的免費開源工具。想要使用它,你必須使用Java來作爲開發語言並將其直接集成到你的應用中,因爲Lucene非常複雜,所以你需要深入瞭解檢索的相關知識來理解它是如何工作的。
Elasticsearch也使用Java開發並使用Lucene作爲其核心來實現所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。
Elastic能夠解決的問題
- 1.數據庫字段太多,查詢太慢,索引沒有辦法再做優化
- 2.數據庫一個count就拖死全表
- 3.mysql的limit翻到幾十幾百萬頁後實在是太慢
- 4.數據庫like實在太慢,每次like整個服務器cpu內存飆高,拖慢整個線上服務
- 5.想要對外/內提供db裏的數據的全文檢索服務
- 6.提供日誌(程序運行)查詢功能
二、基本概念
1、集羣(Cluster)
集羣是一個或多個節點(服務器)的集合,它們共同保存您的整個數據,並提供跨所有節點的聯合索引和搜索功能。羣集由唯一名稱標識,默認情況下爲“elasticsearch”。
2、節點(Node)
節點是作爲羣集一部分的單個服務器,存儲數據並參與羣集的索引和搜索功能。
3、索引(Index)
索引是具有某些類似特徵的文檔集合。索引由名稱標識(必須全部爲小寫),並且此名稱用於在對其中的文檔執行索引,搜索,更新和刪除操作時引用索引。
4、類型(Type)
一種類型,曾經是索引的邏輯類別/分區,允許您在同一索引中存儲不同類型的文檔,例如一種類型用於用戶,另一種類型用於博客帖子。(在6.0.0中棄用,儘量不要使用該類型)
5、文檔(Document)
Index 裏面單條的記錄稱爲 Document(文檔)。許多條 Document 構成了一個 Index。文檔是可以編制索引的基本信息單元。該文檔以JSON(JavaScript Object Notation)表示,JSON是一種普遍存在的互聯網數據交換格式。在索引中,您可以根據需要存儲任意數量的文檔
6、碎片/分片(Shards)
當索引存儲的大量數據超過單個節點的硬件限制的數據。Elasticsearch提供了將索引細分爲多個稱爲分片的功能。索引被水平細分爲碎片。這意味着每個碎片包含文檔的所有屬性,但包含的數量比索引少。當你查詢的索引分佈在多個分片上時,ES會把查詢發送給每個相關的分片,並將結果組合在一起,而應用程序並不知道分片的存在。即:這個過程對用戶來說是透明的。
7、副本(Replia)
每個索引可以拆分爲多個分片。索引也可以複製爲零(表示沒有副本)或更多次。複製後,每個索引都將具有主分片(從中複製的原始分片)和副本分片(主分片的副本)。
副本是一個分片的精確複製,每個分片可以有零個或多個副本。ES中可以有許多相同的分片,其中之一被選擇更改索引操作,這種特殊的分片稱爲主分片。 當主分片丟失時,如:該分片所在的數據不可用時,集羣將副本提升爲新的主分片。
複製不僅有助於在故障情況下增加數據的可用性,而且還通過在這些副本中執行並行搜索操作來提高搜索的性能。
默認情況下,Elasticsearch中的每個索引都分配了一個主分片和一個副本,這意味着如果羣集中至少有兩個節點,則索引將具有一個主分片和另一個副本分片(一個完整副本),總共兩個每個索引的分片。
三、安裝
本文安裝的elasticsearch是基於最新版7.0版本,在ubuntu 16.04下面測試,其他版本的安裝也大同小異。
1、JAVA環境
因爲Elasticsearch是使用Java語言,所以需要安裝JDK,官方推薦是Java 1.8版本或以上。Java環境的安裝就不再敘述,這個比較簡單。
2、安裝Elasticsearch
下載Elasticsearch二進制文件,放入指定目錄,運行即可。
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-linux-x86_64.tar.gz
tar -xzvf elasticsearch-7.0.0-linux-x86_64.tar.gz
cd elasticsearch-7.0.0/
這裏有幾個坑需要注意:
Elasticsearch不能以管理員身份root啓動,所以我們創建elasticsearch用戶組和用戶,並給相應文件目錄更改所有人和組。
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
chown elasticsearch:elasticsearch -R elasticsearch-7.0.0
然後我們嘗試啓動,在elasticsearch-7.0.0
目錄下,執行啓動命令./bin/elasticsearch
。
這裏報錯是內存大小不夠,所以我們需要更改文件/config/jvm.options。默認大小爲1g,更改218m。如下:
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
#-Xms1g
#-Xmx1g
-Xms218m
-Xmx218m
裏面分配的內存的最大值爲218MB和最小值218MB,當然可以根據自己的機器情況設置內存大小。
然後我們再次啓動應用,可以發現相關的提示信息,在相應端口應用啓動了。
我們也可以通過ps -ef | grep "elasticsearch"
,也可以查看到相應信息。
當我們按住Ctrl-C可以終止掉進程。。
如果我們要後臺進程運行程序,可以執行命令:
./bin/elasticsearch -d -p pid
這裏-d表示後臺運行,-p記錄進程id。信息保存在$ES_HOME/logs/
目錄。$ES_HOME就是指Elasticsearch文件目錄。
命令驗證curl http://127.0.0.1:9200/
現在我們只能通過localhost來訪問,如果想要綁定外網地址,需要更改一些配置,編輯文件config/elasticsearch.yml,如下:
# 集羣名稱,當同一個網段具有多個elasticsearch集羣時cluster.name就成爲同一個集羣的標識.
cluster.name: es-application
# 節點名稱,同一個集羣節點名稱不能重複.
node.name: node-1
# 是否允許一個節點是否可以成爲一個master節點,es是默認集羣中的第一臺機器爲master,如果這臺機器停止就會重新選舉master
node.master: true
# 允許該節點存儲數據(默認開啓)
node.data: true
# 綁定監聽IP
network.host: 0.0.0.0
# 設置節點間交互的tcp端口,默認是9300
transport.tcp.port: 9300
# 設置節點間交互地址
transport.host: localhost
# 設置對外服務的http端口,默認爲9200
http.port: 9200
# 集羣默認主節點
cluster.initial_master_nodes: ["node-1"]
更詳細的配置,可以參考官方文檔。
然後我們重新啓動,在瀏覽器裏面訪問外網IP,可以得到我們服務信息。
關於Windows下的安裝也差不多,下載相應Windows下的二進制包,進入目錄下,啓動bat命令即可。
.\bin\elasticsearch.bat