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:
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和中文分詞器的版本一定要一致,否則會不能使用
elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、集成Ikanalyzer)