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和中文分詞器的版本一定要一致,否則會不能使用