1. 程式人生 > >Elasticsearch之基本操作

Elasticsearch之基本操作

ubuntu quest del ubun 存儲 綠色 站點 ear doc

elasticsearch是一個是開源的(Apache2協議),分布式的,RESTful的,構建在Apache Lucene之上的的搜索引擎。

它有很多特點例如Schema Free,Document Oriented。它是#nosql的,基於JSON,同時支持多種API,包括HTTP, thrift, memcached。支持HTTP,是比較爽的一點,因為基本上所有的應用都可以用ES了,頁面上的js腳本都可以去查詢。

安裝

啟動和安裝特別簡單,在ES下載頁面下載zip或者tar包後,解壓,然後到elasticsearch的目錄下,運行下面的命令就可以了。

bin/elasticsearch -f

搭建集群也非常簡單,在同網段的機器上,啟動es後,它們會自動組建成一個集群,並完成數據的分布式存儲,查詢時也會按照分布式的方式去查找。

好了恭喜你,現在你已經可以搭建ES單機版和ES集群了,一切都這麽簡單。

下面我們就來看一下ES的HTTP的API的插入、刪除、更新、查找、搜索的功能吧,(ES安裝在ubuntu server 64位 12.04LTS)。

插入

先來一個簡單的官方例子,插入的參數為-XPUT,插入一條記錄。

$ curl -XPUT ‘http://localhost:9200/twitter/tweet/1‘ -d ‘{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}‘

執行結果如下圖所示,綠色框內的內容是ES返回的執行結果:

[email protected]:~$ 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":[email protected]
/* */:~$

從上面的這個例子中,可以看出ES的http的服務的默認端口9200,後面的/twitter/tweet/1是這條記錄的索引部分。

這也就體現了它的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‘

執行上面的查詢命令,可以等到下面的結果:

[email protected]:~$ 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"
[email protected]:~$ 

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是一個比較強大的工具,而且對社交網絡的支持比較好,而且使用方便,配置簡單,就不知道穩定性如何了。

下面是兩篇不錯的文章,大家也可以借鑒一下:

  • http://blog.csdn.net/laigood12345/article/details/7421173
  • http://www.qwolf.com/?p=1387

還有elasticsearch的中文站點http://www.elasticsearch.cn/,不過這個網站還在構建中,翻譯工作也才剛剛開始,大家就期盼早點完成。

Elasticsearch之基本操作