Elasticsearch 是一個開源的搜索引擎,創建在全文搜索引擎庫 Apache Lucene 基礎之上javascript
用 Java 編寫的,它的內部使用 Lucene 作索引與搜索,可是它的目的是使全文檢索變得簡單, 經過隱藏 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API。html
Elasticsearch 不只僅只是一個全文搜索引擎。 它能夠被下面這樣準確的形容:java
一個分佈式的實時文檔存儲,每一個字段能夠被索引與搜索——做數據庫用node
一個分佈式實時分析搜索引擎 python
能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據linux
原文連接:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.htmlgit
Elasticsearch 後來做爲一家公司(Elastic公司)進行運做,定位爲數據搜索和分析平臺。在2014年6月得到7000萬美圓融資,累積融資過億美圓。github
ES如今能夠與Java、Ruby、Python、PHP、Perl、.NET等多種客戶端集成。也可與Hadoop、Spark等大數據分析平臺進行集成,功能十分強大。數據庫
基於Elasticsearch衍生出了一系列開源軟件,統稱爲 Elatic Stackjson
說明:
由於logstash比較耗內存,因此用Beats來替代
爲避免版本混亂,從5.0開始,Elastic公司將各組件的版本號統一。使用時,各組件版本號應一致(版本號形式:x.y.z,z能夠不一樣)。
官網的介紹: https://www.elastic.co/cn/products/elasticsearch
速度快、易擴展、彈性、靈活、操做簡單、多語言客戶端、X-Pack、hadoop/spark強強聯手、開箱即用。
分佈式:橫向擴展很是靈活
全文檢索:基於lucene的強大的全文檢索能力;
近實時搜索和分析:數據進入ES,可達到近實時搜索,還可進行聚合分析
高可用:容錯機制,自動發現新的或失敗的節點,重組和從新平衡數據
模式自由:ES的動態mapping機制能夠自動檢測數據的結構和類型,建立索引並使數據可搜索。
RESTful API:JSON + HTTP
說明:
Gateway是ES用來存儲索引的文件系統,支持多種類型。
Gateway的上層是一個分佈式的lucene框架。
Lucene之上是ES的模塊,包括:索引模塊、搜索模塊、映射解析模塊等
ES模塊之上是 Discovery、Scripting和第三方插件。Discovery是ES的節點發現模塊,不一樣機器上的ES節點要組成集羣須要進行消息通訊,集羣內部須要選舉master節點,這些工做都是由Discovery模塊完成。支持多種發現機制,如 Zen 、EC二、gce、Azure。Scripting用來支持在查詢語句中插入javascript、python等腳本語言,scripting模塊負責解析這些腳本,使用腳本語句性能稍低。ES也支持多種第三方插件。
再上層是ES的傳輸模塊和JMX.傳輸模塊支持多種傳輸協議,如 Thrift、memecached、http,默認使用http。JMX是java的管理框架,用來管理ES應用。
最上層是ES提供給用戶的接口,能夠經過RESTful接口和ES集羣進行交互。
Near Realtime(NRT) 近實時。數據提交索引後,立馬就能夠搜索到。
Cluster 集羣,一個集羣由一個惟一的名字標識,默認爲「elasticsearch」。集羣名稱很是重要,具備相同集羣名的節點纔會組成一個集羣。集羣名稱能夠在配置文件中指定。
Node 節點:存儲集羣的數據,參與集羣的索引和搜索功能。像集羣有名字,節點也有本身的名稱,默認在啓動時會以一個隨機的UUID的前七個字符做爲節點的名字,你能夠爲其指定任意的名字。經過集羣名在網絡中發現同伴組成集羣。一個節點也但是集羣。
Index 索引: 一個索引是一個文檔的集合(等同於solr中的集合)。每一個索引有惟一的名字,經過這個名字來操做它。一個集羣中能夠有任意多個索引。
Type 類型:指在一個索引中,能夠索引不一樣類型的文檔,如用戶數據、博客數據。從6.0.0 版本起已廢棄,一個索引中只存放一類數據。
Document 文檔:被索引的一條數據,索引的基本信息單元,以JSON格式來表示。
Shard 分片:在建立一個索引時能夠指定分紅多少個分片來存儲。每一個分片自己也是一個功能完善且獨立的「索引」,能夠被放置在集羣的任意節點上。分片的好處:
容許咱們水平切分/擴展容量
可在多個分片上進行分佈式的、並行的操做,提升系統的性能和吞吐量。
注意:分片數建立索引時指定,建立後不可改了。備份數能夠隨時改。
Replication 備份: 一個分片能夠有多個備份(副本)。備份的好處:
高可用。一個主分片掛了,副本分片就頂上去
擴展搜索的併發能力、吞吐量。搜索能夠在全部的副本上並行運行。-高併發下副本也可搜索
官網的文檔是最好的學習資源,詳細、全面,官網還提供有一些視頻:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官網中還提供一箇中文的權威指南,能夠學習,(版本稍老了點是基於2.0的):
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
官網下載地址: https://www.elastic.co/downloads/elasticsearch
JDK版本: 1.8
注意: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.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,便可啓動成功。
9200 對外服務的http 端口
9300 節點間通訊的tcp端口
使用守護進程運行:./elasticsearch -d
非後臺運行的:ctrl + c
後臺運行的(守護進程運行):kill es進程
elasticsearch .bat
啓動之後訪問地址:http://localhost:9200/
10.1 配置文件分離
配置文件目錄默認爲:$ES_HOME/config,若是須要配置文件與軟件分離(方便升級),能夠經過 ES_PATH_CONF 環境變量來指定。如你能夠在命令行指定聲明:
10.2 yml 格式說明
10.3 Jvm參數格式說明
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
是否啓用多播來發現節點。
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
必定和ES的版本一致( 6.2.4)
地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
將 ik 的壓縮包解壓到 ES安裝目錄的plugins/目錄下(最好把解出的目錄名改一下,防止安裝別的插件時同名衝突),而後重啓ES。
配置文件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>
一、建立一個索引
curl -XPUT http://localhost:9200/index
二、建立一個映射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"
}
}
}'
三、索引一些文檔
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和中文分詞器的版本必定要一致,不然會不能使用