elasticsearch是一個是開源的(Apache2協議),分佈式的,RESTful的,構建在Apache Lucene之上的的搜索引擎。javascript
它有不少特色例如Schema Free,Document Oriented。它是#nosql的,基於JSON,同時支持多種API,包括HTTP, thrift, memcached。支持HTTP,是比較爽的一點,由於基本上全部的應用均可以用ES了,頁面上的js腳本均可以去查詢。html
啓動和安裝特別簡單,在ES下載頁面下載zip或者tar包後,解壓,而後到elasticsearch的目錄下,運行下面的命令就能夠了。java
bin/elasticsearch -f
搭建集羣也很是簡單,在同網段的機器上,啓動es後,它們會自動組建成一個集羣,並完成數據的分佈式存儲,查詢時也會按照分佈式的方式去查找。sql
好了恭喜你,如今你已經能夠搭建ES單機版和ES集羣了,一切都這麼簡單。apache
下面咱們就來看一下ES的HTTP的API的插入、刪除、更新、查找、搜索的功能吧,(ES安裝在ubuntu server 64位 12.04LTS)。json
先來一個簡單的官方例子,插入的參數爲-XPUT
,插入一條記錄。ubuntu
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elastic Search" }'
執行結果以下圖所示,綠色框內的內容是ES返回的執行結果:api
andrew@ubuntu:~$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{> "user" : "kimchy",> "post_date" : "2009-11-15T14:12:12",> "message" : "trying out Elastic Search"> }'{"ok":true,"_index":"twitter","_type":"tweet","_id":"1","_version":6}andrew@ubuntu:~$
從上面的這個例子中,能夠看出ES的http的服務的默認端口9200,後面的/twitter/tweet/1
是這條記錄的索引部分。bash
這也就體現了它的RESTful風格,全部的記錄都是經過URI肯定。這三級目錄分佈對應了_index
,_type
, _id
(綠框內能夠看出來)。實際上ES上存放的全部的記錄都只能經過三級目錄的方式找到,不能多也不能少。網絡
_id
字段能夠是數字也能夠是字符串。在執行上面的命令時ES會自動建立這些索引。-d
後面跟上了要插入的json格式的記錄。
-XPUT
代表這是插入一條數據,ES中叫建立一個索引。ES返回的結果中,一個_version
字段,代表了當前記錄的版本號,當你想這個索引從新put一條記錄時,版本號會自動加一。
刪除的http請求參數爲-XDELETE
,經過下面的命令能夠刪除這條記錄:
curl -XDELETE 'http://localhost:9200/twitter/tweet/1'
刪除這條記錄的時候,_verison
也會自動加一的。
建立了一個索引後,能夠經過下面的方式查詢(參數-XGET
)出來:
curl -XGET 'http://localhost:9200/twitter/tweet/1'
執行上面的查詢命令,能夠等到下面的結果:
andrew@ubuntu:~$ curl -XGET 'http://localhost:9200/twitter/tweet/1' {"_index":"twitter","_type":"tweet","_id":"1","_version":5,"exists":true, "_source" : { "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elastic Search" }}andrew@ubuntu:~$
exists
表示是否有查詢結果,_source
字段是查詢到的記錄。
查詢的時候,能夠將_type
設置成爲_all
,ES就會返回在_index
下全部type中,第一個匹配_id
的記錄。
還能夠經過參數對返回結果繼續控制,例如:用fields選取返回的字段,用pretty控制返回的json格式是否更閱讀友好。format=yaml
能夠設置輸入格式爲YAML。 下面是兩個例子
curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&pretty=true'curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&format=yaml'
固然ES還支持一次查詢多組記錄,即multi get,在URI中是使用關鍵字_mget
,具體能夠參考ES的文檔multi get。
ES一樣支持更新,可是更新的方式是經過一個提供的腳本進行的。ES的作法是,經過index找到相應的存放記錄的節點,而後執行腳本,執行完以後,返回新的索引。實際上執行的是一個get和reindex的過程,在這個過程當中,經過versioning來控制沒有其它的更新操做(這個功能是0.19後可用的)。具體實現的原理應該和elasticsearch Versioning相關。
get,reindex的含義是,ES先取出這條記錄,而後根據新數據生成新記錄,而後在把新記錄放回到ES中(並不會覆蓋老的記錄)。
首先建立一條記錄
$ curl -XPUT localhost:9200/test/type1/1 -d '{ "counter" : 1, "tags" : ["red"] }'
將counter的值加4
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 } }'
也能夠添加一個tag的值
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.tags += tag", "params" : { "tag" : "blue" } }'
如今還支持upsert功能,即在更新的時候,若是記錄沒有這個key,則插入這個key,下面是一個例子,若是沒有counter
字段,則插入該字段:
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 }, "upsert" : { "counter" : 1 } }'
關於update還有其它不少功能,能夠參考ES的API update
elasticsearch的名字裏面有一個search,那麼主要功能也是search了。
es的search有兩種形式,一是經過URI,二是經過Requst Body。經過URI查詢,即將查詢的語句放入到請求的url中,例如:
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
第二種方式,即在查詢的請求中加入一個doc
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ "query" : { "term" : { "user" : "kimchy" } } }'
query body的定義能夠查看query DSL 另外兩種查詢方式均可以帶參數,參數的含義參考URI Request和Request Body。
ES的搜索功能是能夠跨index和type的,例以下面這幾條命令
curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy'curl -XGET 'http://localhost:9200/twitter/tweet,user/_search?q=user:kimchy'curl -XGET 'http://localhost:9200/kimchy,elasticsearch/tweet/_search?q=tag:wow'curl -XGET 'http://localhost:9200/_all/tweet/\_search?q=tag:wow'curl -XGET 'http://localhost:9200/\_search?q=tag:wow'
第一條是在全部的twitter
這個index下的全部type中查找,第二條是在tweet,user
這兩個type中查找,第三條是在kimchy,elasticsearch
這兩個index的tweet
這個type中查找,第四條使用了_all
關鍵字,是在全部的index的tweet
的type中查找,第五條更暴力,在全部的index和type中查找。
查找還有其它的不少選項,sort,高亮,選取返回記錄的域Fields,還能夠對返回的域使用一個腳本進行計算script Fields,或者對返回結果繼續統計Facets,Facets的內容比較多,它支持關鍵詞統計,範圍內統計,直方圖式統計,日期的直方圖式統計,過濾,查詢,還有記錄地理位置距離的統計geo distance。 支持名字過濾Named Filters。 定義搜索類型Search Type 。例如什麼Query And Fetch,Query Then Fetch。 索引加速的功能Index Boost,可讓某一個索引的權重大於另一個。 保持上次檢索的環境告終果Scroll。保留每個命中的score值Explain。 設置命中的min_score。保留版本號Version。
Search的參數不少,我也沒有一一看,不過果真是名字裏面有個search,對檢索的各類場景都有支持。
固然還支持多個查詢multi search,例以下面這個例子
$ cat requests {"index" : "test"} {"query" : {"match_all" : {}}, "from" : 0, "size" : 10} {"index" : "test", "search_type" : "count"} {"query" : {"match_all" : {}}} {} {"query" : {"match_all" : {}}} $ curl -XGET localhost:9200/_msearch --data-binary @requests; echo
以上就是elasticsearch的基本的幾個功能了。固然它還有其它的不少功能,你們能夠上http://www.elasticsearch.org去查看。
ES是基於Lucene的,有不少概念是直接來自於它,全部要想深刻學習ES,還得有點Lucene的基礎。
總的,感受elasticsearch是一個比較強大的工具,並且對社交網絡的支持比較好,並且使用方便,配置簡單,就不知道穩定性如何了。
下面是兩篇不錯的文章,你們也能夠借鑑一下:
還有elasticsearch的中文站點http://www.elasticsearch.cn/,不過這個網站還在構建中,翻譯工做也纔剛剛開始,你們就期盼早點完成。