Elasticsearch學習(一)——入門基礎

開源的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環境的安裝就不再敘述,這個比較簡單。

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

memory

這裏報錯是內存大小不夠,所以我們需要更改文件/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,當然可以根據自己的機器情況設置內存大小。

然後我們再次啓動應用,可以發現相關的提示信息,在相應端口應用啓動了。

info

我們也可以通過ps -ef | grep "elasticsearch",也可以查看到相應信息。

grep

當我們按住Ctrl-C可以終止掉進程。。

如果我們要後臺進程運行程序,可以執行命令:

./bin/elasticsearch -d -p pid

這裏-d表示後臺運行,-p記錄進程id。信息保存在$ES_HOME/logs/ 目錄。$ES_HOME就是指Elasticsearch文件目錄。

命令驗證curl http://127.0.0.1:9200/
curl

現在我們只能通過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,可以得到我們服務信息。

web info

關於Windows下的安裝也差不多,下載相應Windows下的二進制包,進入目錄下,啓動bat命令即可。

.\bin\elasticsearch.bat

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章