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

相关文章
相关标签/搜索