1. 程式人生 > >elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、整合Ikanalyzer)

elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、整合Ikanalyzer)

一、ES簡介

1. ES是什麼?

Elasticsearch 是一個開源的搜尋引擎,建立在全文搜尋引擎庫 Apache Lucene 基礎之上

用 Java 編寫的,它的內部使用 Lucene 做索引與搜尋,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API

Elasticsearch 不僅僅只是一個全文搜尋引擎。 它可以被下面這樣準確的形容:

一個分散式的實時文件儲存,每個欄位可以被索引與搜尋——作資料庫用

一個分散式實時分析搜尋引擎 

能勝任上百個服務節點的擴充套件,並支援 PB 級別的結構化或者非結構化資料

2. ES的誕生

原文連結:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

3. ES的發展歷程

Elasticsearch 後來作為一家公司(Elastic公司)進行運作,定位為資料搜尋和分析平臺。在2014年6月獲得7000萬美元融資,累積融資過億美元。

ES現在可以與Java、Ruby、Python、PHP、Perl、.NET等多種客戶端整合。也可與Hadoop、Spark等大資料分析平臺進行整合,功能十分強大。

基於Elasticsearch衍生出了一系列開源軟體,統稱為 Elatic Stack

說明:

因為logstash比較耗記憶體,所以用Beats來替代

為避免版本混亂,從5.0開始,Elastic公司將各元件的版本號統一。使用時,各元件版本號應一致(版本號形式:x.y.z,z可以不同)。

4. ES的特性

官網的介紹: https://www.elastic.co/cn/products/elasticsearch

速度快、易擴充套件、彈性、靈活、操作簡單、多語言客戶端、X-Pack、hadoop/spark強強聯手、開箱即用。

分散式:橫向擴充套件非常靈活
全文檢索:基於lucene的強大的全文檢索能力;
近實時搜尋和分析:資料進入ES,可達到近實時搜尋,還可進行聚合分析
高可用:容錯機制,自動發現新的或失敗的節點,重組和重新平衡資料
模式自由:ES的動態mapping機制可以自動檢測資料的結構和型別,建立索引並使資料可搜尋。
RESTful API:JSON + HTTP

5. ES的應用場景

6. ES的架構

 

說明:

Gateway是ES用來儲存索引的檔案系統,支援多種型別。
Gateway的上層是一個分散式的lucene框架。
Lucene之上是ES的模組,包括:索引模組、搜尋模組、對映解析模組等
ES模組之上是 Discovery、Scripting和第三方外掛。Discovery是ES的節點發現模組,不同機器上的ES節點要組成叢集需要進行訊息通訊,叢集內部需要選舉master節點,這些工作都是由Discovery模組完成。支援多種發現機制,如 Zen 、EC2、gce、Azure。Scripting用來支援在查詢語句中插入javascript、python等指令碼語言,scripting模組負責解析這些指令碼,使用指令碼語句效能稍低。ES也支援多種第三方外掛。
再上層是ES的傳輸模組和JMX.傳輸模組支援多種傳輸協議,如 Thrift、memecached、http,預設使用http。JMX是java的管理框架,用來管理ES應用。
最上層是ES提供給使用者的介面,可以通過RESTful介面和ES叢集進行互動。

7. ES的核心概念

Near Realtime(NRT) 近實時。資料提交索引後,立馬就可以搜尋到。
Cluster 叢集,一個叢集由一個唯一的名字標識,預設為“elasticsearch”。叢集名稱非常重要,具有相同叢集名的節點才會組成一個叢集。叢集名稱可以在配置檔案中指定。
Node 節點:儲存叢集的資料,參與叢集的索引和搜尋功能。像叢集有名字,節點也有自己的名稱,預設在啟動時會以一個隨機的UUID的前七個字元作為節點的名字,你可以為其指定任意的名字。通過叢集名在網路中發現同伴組成叢集。一個節點也可是叢集。
Index 索引: 一個索引是一個文件的集合(等同於solr中的集合)。每個索引有唯一的名字,通過這個名字來操作它。一個叢集中可以有任意多個索引。
Type 型別:指在一個索引中,可以索引不同型別的文件,如使用者資料、部落格資料。從6.0.0 版本起已廢棄,一個索引中只存放一類資料。
Document 文件:被索引的一條資料,索引的基本資訊單元,以JSON格式來表示。
Shard 分片:在建立一個索引時可以指定分成多少個分片來儲存。每個分片本身也是一個功能完善且獨立的“索引”,可以被放置在叢集的任意節點上。分片的好處:
允許我們水平切分/擴充套件容量
可在多個分片上進行分散式的、並行的操作,提高系統的效能和吞吐量。

注意:分片數建立索引時指定,建立後不可改了。備份數可以隨時改。
Replication 備份: 一個分片可以有多個備份(副本)。備份的好處:
高可用。一個主分片掛了,副本分片就頂上去
擴充套件搜尋的併發能力、吞吐量。搜尋可以在所有的副本上並行執行。-高併發下副本也可搜尋

8. 為了方便理解,作一個ES和資料庫的對比

 

9. ES學習資源

官網的文件是最好的學習資源,詳細、全面,官網還提供有一些視訊:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

官網中還提供一箇中文的權威指南,可以學習,(版本稍老了點是基於2.0的):
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

二、安裝&配置

1. ES安裝包

官網下載地址: https://www.elastic.co/downloads/elasticsearch

2. JDK要求

 JDK版本: 1.8

3. 在linux上安裝示例

注意:ES不能以root使用者身份執行 確保執行使用者對各使用到的目錄的許可權

3.1 獲取安裝包

版本 6.2.4

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz

3.2 解壓到安裝目錄

tar -xvf elasticsearch-6.2.4.tar.gz -C /opt

3.3 配置
3.4 啟動

cd  /opt/elasticsearch-6.2.4/bin
./elasticsearch

 啟動時指定引數:

./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

瞭解啟動指令碼可用選項:

./elasticsearch -h

4. 在linux 虛擬機器上執行可能的失敗問題

 4.1 記憶體不夠用,預設es配置使用1G堆記憶體,如果的你學習用的虛擬機器沒有這麼大的記憶體,請在config/jvm.options中調整

 

4.2 可能會報如下的錯誤:

 

解決方法如下:

問題一:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
解決:修改切換到root使用者修改配置limits.conf 新增下面兩行
命令:vi /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536

問題二:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解決:切換到root使用者,進入limits.d目錄下修改配置檔案。
vi /etc/security/limits.d/90-nproc.conf 
修改如下內容:
* soft nproc 1024
#修改為
* soft nproc 2048

問題三:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解決:切換到root使用者修改配置sysctl.conf
vi /etc/sysctl.conf 
新增下面配置:
vm.max_map_count=655360

並執行命令:
sysctl -p

切換到es的使用者。
然後,重新啟動elasticsearch,即可啟動成功。

5. ES埠說明

9200 對外服務的http 埠

9300 節點間通訊的tcp埠

6. 後臺執行ES

 使用守護程序執行:./elasticsearch -d

7. 關閉ES

非後臺執行的:ctrl + c
後臺執行的(守護程序執行):kill es程序

8. 在windows中啟動

elasticsearch .bat

啟動以後訪問地址:http://localhost:9200/

9. ES軟體目錄說明

10. ES 配置說明

10.1 配置檔案分離

配置檔案目錄預設為:$ES_HOME/config,如果需要配置檔案與軟體分離(方便升級),可以通過 ES_PATH_CONF 環境變數來指定。如你可以在命令列指定宣告:

 

10.2 yml 格式說明

 

10.3 Jvm引數格式說明

 

11. ES 重要的配置引數

11.1 資料目錄和日誌目錄,生成環境下應與軟體分離

 

11.2 所屬的叢集名,預設為 elasticsearch ,可自定義

 

11.3 節點名,預設為 UUID前7個字元,可自定義

 

以主機名作節點名:

11.4 network.host  IP繫結

預設繫結的是["127.0.0.1", "[::1]"]迴環地址,叢集下要服務間通訊,需繫結一個ipv4或ipv6地址

 

11.5 http.port: 9200-9300

對外服務的http 埠, 預設 9200-9300 。可以為它指定一個值或一個區間,當為區間時會取用區間第一個可用的埠。

11.6  transport.tcp.port: 9300-9400

節點間互動的埠, 預設 9300-9400 。可以為它指定一個值或一個區間,當為區間時會取用區間第一個可用的埠。

11.7 Discovery Config  節點發現配置

 ES中預設採用的節點發現方式是  zen(基於組播(多播)、單播)。在應用於生產前有兩個重要引數需配置:

discovery.zen.ping.unicast.hosts: ["host1","host2:port","host3[portX-portY]"] 單播模式下,設定具有master資格的節點列表,新加入的節點向這個列表中的節點發送請求來加入叢集

discovery.zen.minimum_master_nodes: 1 這個引數控制的是,一個節點需要看到具有master資格的節點的最小數量,然後才能在叢集中做操作。官方的推薦值是(N/2)+1,其中N是具有master資格的節點的數量。

11.8 Jvm heap 大小設定

生產環境中一定要在jvm.options中調大它的jvm記憶體。

11.9 JVM heap dump path 設定

生產環境中指定當發生OOM異常時,heap的dump path,好分析問題。在jvm.options中配置:

-XX:HeapDumpPath=/var/lib/elasticsearch

11.10 其他配置

複製程式碼
transport.tcp.compress: false
    是否壓縮tcp傳輸的資料,預設false
http.cors.enabled: true
    是否使用http協議對外提供服務,預設true
http.max_content_length: 100mb
    http傳輸內容的最大容量,預設100mb
node.master: true   
    指定該節點是否可以作為master節點,預設是true。ES叢集預設是以第一個節點為master,如果該節點出故障就會重新選舉master。
node.data: true
    該節點是否存索引資料,預設true。
discover.zen.ping.timeout: 3s
    設定叢集中自動發現其他節點時ping連線超時時長,預設為3秒。在網路環境較差的情況下,增加這個值,會增加節點等待響應的時間,從一定程度上會減少誤判。
discovery.zen.ping.multicast.enabled: false
    是否啟用多播來發現節點。
複製程式碼

12. 安裝Kibana

 Kibana是ES的視覺化管理工具

12.1 下載安裝包

一定和ES的版本一致( 6.2.4)

https://www.elastic.co/downloads/kibana

12.2 安裝

解壓到安裝目錄即可

12.3 配置

在config/kibana.yml中配置 elasticsearch.url的值為 ES的訪問地址

12.4 啟動

./bin/kibana

訪問地址:http://localhost:5601

三、整合Ikanalyzer

1. 獲取 ES-IKAnalyzer外掛

一定和ES的版本一致( 6.2.4)

地址: https://github.com/medcl/elasticsearch-analysis-ik/releases

2. 安裝外掛

 將 ik 的壓縮包解壓到 ES安裝目錄的plugins/目錄下(最好把解出的目錄名改一下,防止安裝別的外掛時同名衝突),然後重啟ES。

 

3. 擴充套件詞庫

配置檔案config/IKAnalyzer.cfg.xml

複製程式碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 擴充套件配置</comment>
    <!--使用者可以在這裡配置自己的擴充套件字典 -->
    <entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--使用者可以在這裡配置自己的擴充套件停止詞字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
    <!--使用者可以在這裡配置遠端擴充套件字典 遠端詞庫,可熱更新,在一處地方維護-->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--使用者可以在這裡配置遠端擴充套件停止詞字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
複製程式碼

 4. 測試 IK

1、建立一個索引

curl -XPUT http://localhost:9200/index

2、建立一個對映mapping

複製程式碼
curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }
}'
複製程式碼

 

 3、索引一些文件

curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d' {"content":"美國留給伊拉克的是個爛攤子嗎"}'

curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d' {"content":"公安部:各地校車將享最高路權"}'

curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d' {"content":"中韓漁警衝突調查:韓警平均每天扣1艘中國漁船"}'

 

四、總結

 安裝的ES、Kibana和中文分詞器的版本一定要一致,否則會不能使用