Elasticsearch提供两个内置的client给JAVA API进行数据交互使用:
- node client:本地集群的非数据结点,不保存任何数据信息,只是将请求发送给集群中存活的节点。
- Transport client:可以使用轻量级传输客户端发送请求到一个远程集群。它没有加入集群本身,而只是将请求转发到集群中的一个节点。
本篇利用 Transport client 方式进行数据交互,端口为9300(9200端口是基于RESTful方式的)。 使用elasticsearch提供的Java API,利用Client对象对elasticsearch执行操作 ,所有操作在本质上是完全异步的。
- 首先
Eclipse创建Maven Project,并在pom.xml中引入ES的maven包:
2.创建 Transport client 链接到集群
Setting对象用来告诉Transport Client要链接到哪个集群和节点,cluster.name是集群名称,node.name是节点名称,这两个属性值必须与%ES_HOME%/config下elasticsearch.yml文件设置一致。 如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本例中只有一个 localhost 节点。)
Transport Client 有一个集群嗅探功能,当client.transport.sniff设置为ture时允许它动态地添加新的主机和删除旧的。通过调用addTransportAddress构建, 连接到node节点的node list中, 。在这之后,客户机将调用内部集群状态API在这些节点发现可用的数据节点上。客户端将被替换的内部节点列表中与数据节点。这个列表默认每5秒刷新。注意,IP地址为node节点在elasticsearch的发布地址配置。
其他设置:
-
client.transport.ignore_cluster_name:
当设置为true时,忽略集群名称验证
。 -
client.transport.ping_timeout
: 超时,默认为5s. -
client.transport.nodes_sampler_interval
:多长时间连接node list,默认5s.
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下载:。