elasticsearch開發文檔(五)——Elasticsearch數據交互之JAVA篇

Elasticsearch提供兩個內置的client給JAVA API進行數據交互使用:node

  • node  client:本地集羣的非數據結點,不保存任何數據信息,只是將請求發送給集羣中存活的節點。
  • Transport client:可使用輕量級傳輸客戶端發送請求到一個遠程集羣。它沒有加入集羣自己,而只是將請求轉發到集羣中的一個節點。

    本篇利用 Transport client 方式進行數據交互,端口爲9300(9200端口是基於RESTful方式的)。 使用elasticsearch提供的Java API,利用Client對象對elasticsearch執行操做 ,全部操做在本質上是徹底異步的。數據庫

  1. 首先

Eclipse建立Maven Project,並在pom.xml中引入ES的maven包:json

 

    2.建立 Transport client 連接到集羣數組

    Setting對象用來告訴Transport Client要連接到哪一個集羣和節點,cluster.name是集羣名稱,node.name是節點名稱,這兩個屬性值必須與%ES_HOME%/config下elasticsearch.yml文件設置一致。 若是鏈接到一個 Elasticsearch 集羣,構建器能夠接受多個地址。(在本例中只有一個 localhost 節點。)dom

    Transport Client 有一個集羣嗅探功能,當client.transport.sniff設置爲ture時容許它動態地添加新的主機和刪除舊的。經過調用addTransportAddress構建, 鏈接到node節點的node list中, 。在這以後,客戶機將調用內部集羣狀態API在這些節點發現可用的數據節點上。客戶端將被替換的內部節點列表中與數據節點。這個列表默認每5秒刷新。注意,IP地址爲node節點在elasticsearch的發佈地址配置。異步

其餘設置:elasticsearch

  • client.transport.ignore_cluster_name: 當設置爲true時,忽略集羣名稱驗證maven

  • client.transport.ping_timeout : 超時,默認爲5s.性能

  • client.transport.nodes_sampler_interval :多長時間鏈接node list,默認5s.ui

 

3.索引的CRUD操做

  • 添加Insert

        要求JSON格式的文檔,方式多樣,推薦使用ES內置的 XContentFactory.jsonBuilder() 方法生成。

 

添加索引的代碼:

索引名稱(vinux)和類別(employee)是必須的,ID(1)若是不指定則會默認生成一個哈希值的ID。

IndexResponse對象返回數據:

    ① getIndex():索引名稱。

    ② getType():類別名稱。

    ③ getId():生成的文檔ID。

    ④ getVersion():版本號,若是是第一次建立文檔則返回1。

    ⑤ isCreated():若是爲true則新建,false爲update。

也可使用UUID.randomUUID()來生成一個ID:

  • 查詢Get

經過GetResponse.getSourceAsString()方法返回一個JSON數據:

  • 刪除Delete

代碼

  • 修改Update(具有多樣性)

    ①第一種方式:經過建立UpdateRequest對象,而後將其發送到客戶端進行修改。

   

結果:

   

②第二種方式:利用prepareUpdate()方法。

注意:紅框中的setDoc()方法,而不是setSource()方法。還有一個方式是利用setScript()方法生成文檔。

在UpdateRequest對象中使用script方法:

③第三種方式:使用upsert()方法,若是索引存在就修改,沒有就add。

 

結果:

  • MultiGetResponse 多文檔數查詢

   

  • SearchResponse對象查詢

        

而後返回SearchHit數組:

  • QueryBuilder 字段查詢

結果也是返回SearchHit數組 :

    要注意的第一個有趣的 API 用法是 QueryBuilders.matchQuery("name", Lilei);。這是您設置對 name 字段的查詢的地方。另外要注意的是 QueryBuilders.andQuery("age", "100"),它是將查詢的 name 和 age 部分合併到 AND 查詢中的一種方法。 andQuery ()方法現已被fuzzyQuery()替代。

結果:

 

  • 利用Scroll 解決分頁

    search請求只是返回一個單一的結果頁面,而scroll能夠用來檢索大量的結果,就像數據庫中的遊標cursor。 好比你一次請求的數據會很大,可使用scroll這樣的流式接口,scroll會把你的所須要的結果標記起來,同時還會對數據進行排序,可是這樣會影響性能。

  • Count 查詢

經過getCount()方法返回總數。

 

 

  • 提一下Node client寫法:

 

 

OK ,以上就是ES關於JAVA API 的相關操做。

esdemo下載:http://pan.baidu.com/s/1cqRwF8

相關文章
相關標籤/搜索