Elasticsearch是一個基於Lucene的開源分佈式搜索引擎,具備分佈式多用戶能力。Elasticsearch是用java開發,提供Restful接口,可以達到實時搜索、高性能計算;同時Elasticsearch的橫向擴展能力很是強,不須要重啓服務,基本上達到了零配置。可是目前來講相關資料不多,同時版本更新很快,bug存在,API繁多而且變化。java
索引(index)是Elasticsearch存放數據的地方。若是你熟悉關係型數據庫,就能夠將索引理解爲關係型數據庫的一張表。但與關係型數據庫相比,Elasticsearch能夠快速、搞笑地對索引中的數據進行全文檢索,而且不須要存儲原始數據。若是你熟悉MongoDB,就能夠將Elasticsearch的索引理解爲MongoDB中的集合。若是你熟悉CouchDB,就能夠將索引理解爲CouchDB中的數據庫。node
文檔(document)是Elasticsearch中存儲的主要實體。文檔由字段(行數據的列)組成,Elasticsearch容許一個字段出現屢次,該類字段被稱爲多值字段(multivalued)。每一個字段對應一種類型(字符串型、數值型、日期型等)。字段類型能夠是複合的,字段能夠包含其餘子文檔或數組。字段類型在Elasticsearch中很是重要,它使得搜索引擎知道應如何執行不一樣的操做,如比較、排序等。幸運的是Elasticsearch能夠自動肯定字段類型。與關係型數據庫不一樣,Elasticsearch的文檔不須要有固定結構,不一樣文檔能夠具備不一樣的字段集合,並且在程序開發時不須要知道文檔的字段。固然,用戶也能夠經過模式映射(schema mapping)定義文檔結構。git
在Elasticsearch中,一個索引能夠存儲許多不一樣用途的對象。例如,基於Elasticsearch的博客能夠存儲文章和評論。文檔類型能夠幫助咱們輕鬆地區分這些對象。值得注意的是,每一個文檔能夠有不一樣的結構。在實際操做中,將該文檔劃分爲不一樣類型對數據操做有明顯的幫助。劃分時須要牢記一些限制條件,其中一個限制條件就是不一樣的文檔類型對同一字段不能設置爲不一樣的字段類型。github
Elasticsearch能夠做爲一個獨立的搜索服務工做。然而,爲了可以處理大型數據集並實現容錯功能,Elasticsearch支持在多臺協同工做的服務器運行。這些服務器被統稱爲一個集羣(cluster),集羣的每一個服務器則被稱爲一個節點(node)。能夠經過索引分片(分割成更小的個體)將海量數據進行分割並分佈到不一樣節點。經過副本(索引部分的拷貝)能夠實現更強的可用性和更高的性能。數據庫
當須要存儲大規模文檔時,因爲RAM空間、硬盤容量等的限制,僅使用一個節點是不夠的。另外一個問題是一個節點的計算能力達不到所指望的複雜功能的要求。在這些狀況下,能夠將數據切分,每部分是一個單獨的ApacheLucene索引,稱爲分片(shard)。每一個分片能夠被存儲在集羣的不一樣節點上。當須要查詢一個由多個分片構成的索引時,Elasticsearch將該查詢發送到每一個相關的分片,並將結果合併。這些過程對具體應用而言是透明的,無須知道分片的存在。ubuntu
爲了提升查詢的吞吐量或實現高可用性,能夠啓用分片副本功能。副本分片是對原始分片的一個精確拷貝,原始分片被稱爲主分片。對索引的全部修改操做都直接做用在主分片上,每一個主分片能夠有零個或者多個副本分片。當主分片丟失時(如存儲數據的服務器不可用時),集羣能夠將一個副本分片提高爲新的主分片。windows
Elasticsearch安裝方式有不少,支持多種平臺(包括windows),同時有相對應的安裝包(tar.gz, zip, rpm[centos], deb[ubuntu]),這裏以elasticsearch-1.4.4版本爲例,系統爲centos6.5。centos
這種方式相對比較簡單,可是在命令行顯式運行,不方便進行管理,不是做爲系統服務運行,可是這種方式可使你在一臺主機上運行多個實例。數組
解壓elasticsearch-1.4.4.tar.gz獲得elasticsearch-1.4.4目錄。瀏覽器
進入elasticsearch-1.4.4/config目錄,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改成cluster.name: supconit,這就是集羣的名稱,全部節點都必須設置爲同樣,elasticsearch就會自動識別和關聯節點(同一網段),組成集羣。
修改elasticsearch.yml,找到node.name,去掉前面的#,修改成node.name:node1(本身隨便取),可是每一個節點的名字必須不同。
複製elasticsearch-1.4.4到不一樣的主機,修改node.name。
其餘配置,能夠進入elasticsearch-1.4.4/bin目錄修改elasticsearch.in.sh(主要是jvm參數),elasticsearch.yml中也還有不少其餘的參數(集羣、分片、副本等配置),日誌配置修改logging.yml。
這種方式安裝也很方便,系統服務運行,可是安裝完後目錄比較分散,不方便配置,一臺主機只能運行一個實例。
運行sudo rpm -ivh elasticsearch-1.4.4.noarch.rpm。
安裝成功後,elasticsearch程序目錄爲/usr/share/elasticsearch,輸入sudo chkconfig --add elasticsearch添加服務。
進入/etc/elasticsearch目錄,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改成cluster.name: supconit,這就是集羣的名稱,全部節點都必須設置爲同樣,elasticsearch就會自動識別和關聯節點(同一網段),組成集羣。
修改elasticsearch.yml,找到node.name,去掉前面的#,修改成node.name:node1(本身隨便取),可是每一個節點的名字必須不同。
複製elasticsearch-1.4.4.noarch.rpm到不一樣節點,執行1~4步驟。
其餘配置,能夠進入elasticsearch-1.4.4/bin目錄修改elasticsearch.in.sh(主要是jvm參數),elasticsearch.yml中也還有不少其餘的參數(集羣、分片、副本等配置),日誌配置修改logging.yml。
$ ./elasticsearch (前臺運行)
$ ./elasticsearch -d (後臺進程運行)
$ sudo service elasticsearch start (rpm安裝,服務方式啓動)
前臺運行,能夠經過"CTRL+C"組合鍵來中止運行
後臺運行,能夠經過"kill -9 進程號"中止;也能夠經過REST API接口"curl -XPOST http://主機IP:9200/_cluster/nodes/_shutdown"來關閉整個集羣,"curl -XPOST http://主機IP:9200/_cluster/nodes/節點標示符(如Bjkhlujigopojhih)/_shutdown"來關閉單個節點
rpm安裝,"sudo service elasticsearch stop"關閉服務
BigDesk Plugin ------ 監控ES狀態的插件
Elasticsearch Head Plugin ------ 很方便對ES進行各類操做的客戶端,好比各類方式的查詢,索引量查看,節點狀態查看等
安裝方式有兩種,離線安裝和在線安裝,在線安裝相對來講比較方便,執行命令就行,可是不少公司環境是內網,不能訪問外網,因此就須要離線安裝,離線安裝網上的資料很是少,因此這也是一個福利送給你們(本人試了很久才試出來的)。兩種安裝都須要進入主目錄下的bin目錄,執行plugin腳本。
$ ./plugin -install mobz/elasticsearch-head (這是安裝head插件,在線安裝)
$ ./plugin install head -url file:/downloads/elasticsearch-head-master.zip (這是離線安裝方式,file後面就是插件路徑,去github上直接下載,地址就不提供了,時間久了會變,直接上git上搜就行)
安裝完成後,在瀏覽器輸入http://localhost:9200/_plugin/head就能夠打開插件看詳情了,"head"換成"bigdesk",進入的就是bigdesk頁面了。
analysis-ik安裝沒那麼方便,不能用命令安裝,相對比較麻煩。
1. 下載https://github.com/medcl/elasticsearch-analysis-ik
2. 解壓進入目錄執行"mvn clean package",生成target目錄。
3. 解壓後將config/ik目錄複製到你的elasticsearch主目錄的config目錄下(若是是rpm安裝方式,則複製到/etc/esticsearch目錄).
4. 編輯config/elasticsearch.yml(rpm安裝,編輯/etc/elasticsearch/elasticsearch.yml),在文件末尾添加下面內容(不能有tab鍵,只許空格)
index: analysis: analyzer: ik: alias: [ik_analyzer] type: org.elasticsearch.index.analysis.IkAnalyzerProvider ik_max_word: type: ik use_smart: false ik_smart: type: ik use_smart: true index.analysis.analyzer.default.type: ik
5. 在elasticsearch主目錄plugins目錄(沒有就本身新建這個目錄)下新建analysis-ik目錄,複製解壓打包生成的文件elasticsearch-analysis-ik-1.2.9.jar(位於target目錄下)到新建的analysis-ik目錄下。
6. 將target/releases下的全部jar包複製到elasticsearch主目錄下的lib目錄下。
新建索引名爲test的索引 "curl -XPUT http://localhost:9200/test"
給索引建立mapping
curl -XPOST http://localhost:9200/test/test/_mapping -d' { "test": { "properties": { "content": { "type" : "string", "boost" : 8.0, "term_vector" : "with_positions_offsets", "analyzer" : "ik", "include_in_all" : true } } } }'
測試命令
curl 'http://localhost:9200/test/_analyze?analyzer=ik&pretty=true' -d ' { "text":"這是個人第一個elasticsearch集羣" }'
測試結果
{ "tokens" : [ { "token" : "text", "start_offset" : 4, "end_offset" : 8, "type" : "ENGLISH", "position" : 1 }, { "token" : "這是", "start_offset" : 11, "end_offset" : 13, "type" : "CN_WORD", "position" : 2 }, { "token" : "我", "start_offset" : 13, "end_offset" : 14, "type" : "CN_CHAR", "position" : 3 }, { "token" : "第一個", "start_offset" : 15, "end_offset" : 18, "type" : "CN_WORD", "position" : 4 }, { "token" : "第一", "start_offset" : 15, "end_offset" : 17, "type" : "CN_WORD", "position" : 5 }, { "token" : "一個", "start_offset" : 16, "end_offset" : 18, "type" : "CN_WORD", "position" : 6 }, { "token" : "一", "start_offset" : 16, "end_offset" : 17, "type" : "TYPE_CNUM", "position" : 7 }, { "token" : "個", "start_offset" : 17, "end_offset" : 18, "type" : "COUNT", "position" : 8 }, { "token" : "elasticsearch", "start_offset" : 18, "end_offset" : 31, "type" : "ENGLISH", "position" : 9 }, { "token" : "集羣", "start_offset" : 31, "end_offset" : 33, "type" : "CN_WORD", "position" : 10 } ] }