Elasticsearch之基本操作
| 摘要: | 本文簡單介紹了elasticsearch的HTTP API中的插入、刪除、更新、查找、搜索功能。 |
elasticsearch是一個是開源的(Apache2協(xié)議),分布式的,RESTful的,構(gòu)建在Apache Lucene之上的的搜索引擎。
它有很多特點例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同時支持多種API,包括HTTP, thrift, memcached。支持HTTP,是比較爽的一點,因為基本上所有的應(yīng)用都可以用ES了,頁面上的js腳本都可以去查詢。
安裝
啟動和安裝特別簡單,在ES下載頁面下載zip或者tar包后,解壓,然后到elasticsearch的目錄下,運行下面的命令就可以了。
bin/elasticsearch -f搭建集群也非常簡單,在同網(wǎng)段的機器上,啟動es后,它們會自動組建成一個集群,并完成數(shù)據(jù)的分布式存儲,查詢時也會按照分布式的方式去查找。
好了恭喜你,現(xiàn)在你已經(jīng)可以搭建ES單機版和ES集群了,一切都這么簡單。
下面我們就來看一下ES的HTTP的API的插入、刪除、更新、查找、搜索的功能吧,(ES安裝在ubuntu server 64位 12.04LTS)。
插入
先來一個簡單的官方例子,插入的參數(shù)為-XPUT,插入一條記錄。
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elastic Search" }'執(zhí)行結(jié)果如下圖所示,綠色框內(nèi)的內(nèi)容是ES返回的執(zhí)行結(jié)果:
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的服務(wù)的默認端口9200,后面的/twitter/tweet/1是這條記錄的索引部分。
這也就體現(xiàn)了它的RESTful風(fēng)格,所有的記錄都是通過URI確定。這三級目錄分布對應(yīng)了_index,_type,?_id(綠框內(nèi)可以看出來)。實際上ES上存放的所有的記錄都只能通過三級目錄的方式找到,不能多也不能少。
_id字段可以是數(shù)字也可以是字符串。在執(zhí)行上面的命令時ES會自動創(chuàng)建這些索引。-d后面跟上了要插入的json格式的記錄。
-XPUT表明這是插入一條數(shù)據(jù),ES中叫創(chuàng)建一個索引。ES返回的結(jié)果中,一個_version字段,表明了當(dāng)前記錄的版本號,當(dāng)你想這個索引重新put一條記錄時,版本號會自動加一。
刪除
刪除的http請求參數(shù)為-XDELETE,通過下面的命令可以刪除這條記錄:
curl -XDELETE 'http://localhost:9200/twitter/tweet/1'刪除這條記錄的時候,_verison也會自動加一的。
查詢
創(chuàng)建了一個索引后,可以通過下面的方式查詢(參數(shù)-XGET)出來:
curl -XGET 'http://localhost:9200/twitter/tweet/1'執(zhí)行上面的查詢命令,可以等到下面的結(jié)果:
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表示是否有查詢結(jié)果,_source字段是查詢到的記錄。
查詢的時候,可以將_type設(shè)置成為_all,ES就會返回在_index下所有type中,第一個匹配_id的記錄。
還可以通過參數(shù)對返回結(jié)果繼續(xù)控制,例如:用fields選取返回的字段,用pretty控制返回的json格式是否更閱讀友好。format=yaml可以設(shè)置輸入格式為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'當(dāng)然ES還支持一次查詢多組記錄,即multi get,在URI中是使用關(guān)鍵字_mget,具體可以參考ES的文檔multi get。
更新
ES同樣支持更新,但是更新的方式是通過一個提供的腳本進行的。ES的做法是,通過index找到相應(yīng)的存放記錄的節(jié)點,然后執(zhí)行腳本,執(zhí)行完之后,返回新的索引。實際上執(zhí)行的是一個get和reindex的過程,在這個過程中,通過versioning來控制沒有其它的更新操作(這個功能是0.19后可用的)。具體實現(xiàn)的原理應(yīng)該和elasticsearch Versioning相關(guān)。
get,reindex的含義是,ES先取出這條記錄,然后根據(jù)新數(shù)據(jù)生成新記錄,然后在把新記錄放回到ES中(并不會覆蓋老的記錄)。
首先創(chuàng)建一條記錄
$ 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"} }'現(xiàn)在還支持upsert功能,即在更新的時候,如果記錄沒有這個key,則插入這個key,下面是一個例子,如果沒有counter字段,則插入該字段:
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{"script" : "ctx._source.counter += count","params" : {"count" : 4},"upsert" : {"counter" : 1} }'關(guān)于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?另外兩種查詢方式都可以帶參數(shù),參數(shù)的含義參考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關(guān)鍵字,是在所有的index的tweet的type中查找,第五條更暴力,在所有的index和type中查找。
查找還有其它的很多選項,sort,高亮,選取返回記錄的域Fields,還可以對返回的域使用一個腳本進行計算script Fields,或者對返回結(jié)果繼續(xù)統(tǒng)計Facets,Facets的內(nèi)容比較多,它支持關(guān)鍵詞統(tǒng)計,范圍內(nèi)統(tǒng)計,直方圖式統(tǒng)計,日期的直方圖式統(tǒng)計,過濾,查詢,還有記錄地理位置距離的統(tǒng)計geo distance。 支持名字過濾Named Filters。 定義搜索類型Search Type 。例如什么Query And Fetch,Query Then Fetch。 索引加速的功能Index Boost,可以讓某一個索引的權(quán)重大于另外一個。 保持上次檢索的環(huán)境了結(jié)果Scroll。保留每一個命中的score值Explain。 設(shè)置命中的min_score。保留版本號Version。
Search的參數(shù)很多,我也沒有一一看,不過果然是名字里面有個search,對檢索的各種場景都有支持。
當(dāng)然還支持多個查詢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小結(jié)
以上就是elasticsearch的基本的幾個功能了。當(dāng)然它還有其它的很多功能,大家可以上http://www.elasticsearch.org去查看。
ES是基于Lucene的,有很多概念是直接來自于它,所有要想深入學(xué)習(xí)ES,還得有點Lucene的基礎(chǔ)。
總的,感覺elasticsearch是一個比較強大的工具,而且對社交網(wǎng)絡(luò)的支持比較好,而且使用方便,配置簡單,就不知道穩(wěn)定性如何了。
下面是兩篇不錯的文章,大家也可以借鑒一下:
- http://blog.csdn.net/laigood12345/article/details/7421173
- http://www.qwolf.com/?p=1387
還有elasticsearch的中文站點http://www.elasticsearch.cn/,不過這個網(wǎng)站還在構(gòu)建中,翻譯工作也才剛剛開始,大家就期盼早點完成。
from:?http://liuhongjiang.github.io/tech/blog/2013/01/11/es/
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch之基本操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch 第五篇(文档
- 下一篇: Elasticsearch创建索引和映射