博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch开发文档(五)——Elasticsearch数据交互之JAVA篇
阅读量:5839 次
发布时间:2019-06-18

本文共 2164 字,大约阅读时间需要 7 分钟。

hot3.png

Elasticsearch提供两个内置的client给JAVA API进行数据交互使用:

  • node  client:本地集群的非数据结点,不保存任何数据信息,只是将请求发送给集群中存活的节点。
  • Transport client:可以使用轻量级传输客户端发送请求到一个远程集群。它没有加入集群本身,而只是将请求转发到集群中的一个节点。

    本篇利用 Transport client 方式进行数据交互,端口为9300(9200端口是基于RESTful方式的)。 使用elasticsearch提供的Java API,利用Client对象对elasticsearch执行操作 ,所有操作在本质上是完全异步的。

  1. 首先

Eclipse创建Maven Project,并在pom.xml中引入ES的maven包:

104708_KP3A_734885.png

 

    2.创建 Transport client 链接到集群

114535_BJQN_734885.png

    Setting对象用来告诉Transport Client要链接到哪个集群和节点,cluster.name是集群名称,node.name是节点名称,这两个属性值必须与%ES_HOME%/config下elasticsearch.yml文件设置一致。 如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本例中只有一个 localhost 节点。)

110612_WUzF_734885.png

    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() 方法生成。

114549_IDj9_734885.png

 

添加索引的代码:

134526_r88E_734885.png

索引名称(vinux)和类别(employee)是必须的,ID(1)如果不指定则会默认生成一个哈希值的ID。

135645_H9Bg_734885.png

IndexResponse对象返回数据:

    ① getIndex():索引名称。

    ② getType():类别名称。

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

    ④ getVersion():版本号,如果是第一次创建文档则返回1。

    ⑤ isCreated():如果为true则新建,false为update。

也可以使用UUID.randomUUID()来生成一个ID:

104334_acra_734885.png

  • 查询Get

142252_U2rf_734885.png

通过GetResponse.getSourceAsString()方法返回一个JSON数据:

142410_921j_734885.png

  • 删除Delete

代码

150945_QZ28_734885.png

  • 修改Update(具备多样性)

    ①第一种方式:通过创建UpdateRequest对象,然后将其发送到客户端进行修改。

    155721_5f6Y_734885.png

结果:

    155747_hyMk_734885.png

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

160815_XTl6_734885.png

注意:红框中的setDoc()方法,而不是setSource()方法。还有一个方式是利用setScript()方法生成文档。

163156_o1dq_734885.png

在UpdateRequest对象中使用script方法:

163708_OqhP_734885.png

③第三种方式:使用upsert()方法,如果索引存在就修改,没有就add。

170338_X8y8_734885.png

 

结果:

170403_jkpI_734885.png

  • MultiGetResponse 多文档数查询

    104634_gz82_734885.png

175309_E3oS_734885.png

  • SearchResponse对象查询

        104734_0czK_734885.png

然后返回SearchHit数组:

105022_nuP0_734885.png

  • QueryBuilder 字段查询

111251_sHoH_734885.png

结果也是返回SearchHit数组 :

111526_9dNO_734885.png    要注意的第一个有趣的 API 用法是 QueryBuilders.matchQuery("name", Lilei);。这是您设置对 name 字段的查询的地方。另外要注意的是 QueryBuilders.andQuery("age", "100"),它是将查询的 name 和 age 部分合并到 AND 查询中的一种方法。 andQuery ()方法现已被fuzzyQuery()替代。

113050_gIvc_734885.png

结果:

112859_CxrX_734885.png

 

  • 利用Scroll 解决分页

    search请求只是返回一个单一的结果页面,而scroll可以用来检索大量的结果,就像数据库中的游标cursor。 比如你一次请求的数据会很大,可以使用scroll这样的流式接口,scroll会把你的所需要的结果标记起来,同时还会对数据进行排序,但是这样会影响性能。

140337_J3Mv_734885.png

  • Count 查询

143504_RKbx_734885.png

通过getCount()方法返回总数。

 

 

  • 提一下Node client写法:

142558_msSF_734885.png

 

 

OK ,以上就是ES关于JAVA API 的相关操作。

esdemo下载:。

 

转载于:https://my.oschina.net/u/734885/blog/707914

你可能感兴趣的文章
emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点
查看>>
ASP.NET Core MVC/WebAPi 模型绑定探索
查看>>
tn文本分析语言(四) 实现自然语言计算器
查看>>
使用 Arduino 和 LM35 温度传感器监测温度
查看>>
【bootstrap】bootstrap中的tooltip的使用
查看>>
Jq-table edit
查看>>
和菜鸟一起学linux总线驱动之初识spi驱动数据传输流程【转】
查看>>
JQuery:JQuery的尺寸
查看>>
log4j perl 错误日志提取
查看>>
XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)...
查看>>
使用java api操作es需要注意的地方(Elasticsearch开启shield插件之后)
查看>>
WorkFlow设计篇Step.4—异常处理(续)-WF4.0
查看>>
GNU make manual 翻译( 一百零三)
查看>>
深入浅出 React Native:使用 JavaScript 构建原生应用
查看>>
Android Design Android 设计指南非官方简体中文版
查看>>
FLEX程序设计--XML(1)
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-> Web版本新增新的用户权限设置界面效率更高、更规范...
查看>>
Java可视化AWT
查看>>
第 29 章 KVM
查看>>
Foundations of Python Network Programming - 读书笔记系列(3) - Email Services
查看>>