elasticsearch 口水篇(4)java客户端 - 原生esClient
上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生的java客户端。
具体参考:
http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/

下面我们做一个很简单的实例,以下几个功能:
1)批量添加1000个user对象;
2)通过name进行查询;
package com.fox.c1; import java.io.IOException; import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory; /**
* @author huangfox
* @date 2014年2月10日 下午3:27:43
*
*/
public class ESClient { private Client client; public void init() {
client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress(
"localhost", 9300));
} public void close() {
client.close();
} /**
* index
*/
public void createIndex() {
for (int i = 0; i < 1000; i++) {
User user = new User();
user.setId(new Long(i));
user.setName("huang fox " + i);
user.setAge(i % 100);
client.prepareIndex("users", "user").setSource(generateJson(user))
.execute().actionGet();
}
} /**
* 转换成json对象
*
* @param user
* @return
*/
private String generateJson(User user) {
String json = "";
try {
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject();
contentBuilder.field("id", user.getId() + "");
contentBuilder.field("name", user.getName());
contentBuilder.field("age", user.getAge() + "");
json = contentBuilder.endObject().string();
} catch (IOException e) {
e.printStackTrace();
}
return json;
} public static void main(String[] args) {
ESClient client = new ESClient();
client.init();
client.createIndex();
client.close();
} }
这里有两点需要注意下:
1)NodeClinet 和 TransportClient
Instantiating a node based client is the simplest way to get a Client that can execute operations against elasticsearch.
The TransportClient connects remotely to an elasticsearch cluster using the transport module. It does not join the cluster, but simply gets one or more initial transport addresses and communicates with them in round robin fashion on each action (though most actions will probably be "two hop" operations).
2)generate json document
There are different way of generating JSON document:
- Manually (aka do it yourself) using native
byte[]or as aString - Using
Mapthat will be automatically converted to its JSON equivalent - Using a third party library to serialize your beans such as Jackson
- Using built-in helpers XContentFactory.jsonBuilder()
------------------------------------------------
search
public void search() {
SearchResponse response = client.prepareSearch("users")
.setTypes("user")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("name", "fox")) // Query
.setFilter(FilterBuilders.rangeFilter("age").from(20).to(30)) // Filter
.setFrom(0).setSize(60).setExplain(true).execute().actionGet();
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println(hits.getHits()[i].getSourceAsString());
}
}
这两篇简单应用了esClient和jest,至于两者的区别目前还没有定论。
后续还有更多功能:
index:create、update、delete
search:query(queryParser)、filter、sort、paging、highlight、facet
multiSearch
cache
keywords
1)elasticsearch java api VS rest api
2)elasticsearch nodeBuilder VS transportClient
补张ppt。

20140630 补充
The transport client allows to create a client that is not part of the cluster, but simply connects to one or more nodes directly by adding their respective addresses using addTransportAddress(org.elasticsearch.common.transport.TransportAddress).
addTransportAddress方法
Adds a transport address that will be used to connect to.The Node this transport address represents will be used if its possible to connect to it. If it is unavailable, it will be automatically connected to once it is up.In order to get the list of all the current connected nodes, please see connectedNodes().
从上文可知,可以为transportClient添加多个transportAddress,添加多个的目的是什么呢?
当一个es服务(对应一个transportAddress)不可用时,client会自动发现当前可用的nodes(the current connected nodes),从以下这段代码可知:
TransportClientNodesService
int index = randomNodeGenerator.incrementAndGet();
if (index < 0) {
index = 0;
randomNodeGenerator.set(0);
}
RetryListener<Response> retryListener = new RetryListener<Response>(callback, listener, nodes, index);
try {
callback.doWithNode(nodes.get((index) % nodes.size()), retryListener);
} catch (ElasticsearchException e) {
if (e.unwrapCause() instanceof ConnectTransportException) {
retryListener.onFailure(e);
} else {
throw e;
}
}
retryListener保证当前可用的nodes列表。
index是一个自增的int(针对同一个client),nodes.get((index) % nodes.size()可以将请求均发到nodes上。注意这里和索引的分片不是一回事。
理论上,Client可以添加ES集群中部分或全部nodes,然后轮询“拿到”一个node,届时client可以和ES集群进行通信,并进行相应的操作。
至于具体的操作——
Index:分片(sharding,分片策略)->选定具体的node(Master)Index ->同步到对应的slave node
Search:从replSet中选定node(负载策略)->请求分发 ->结果集合并
等,后面再分析。
elasticsearch 口水篇(4)java客户端 - 原生esClient的更多相关文章
- elasticsearch 口水篇(3)java客户端 - Jest
elasticsearch有丰富的客户端,java客户端有Jest.其原文介绍如下: Jest is a Java HTTP Rest client for ElasticSearch.It is a ...
- Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...
- Android NDK开发篇:Java与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- elasticsearch 口水篇(7) Eclipse中部署ES源码、运行
ES源码可以直接从svn下载 https://github.com/elasticsearch/elasticsearch 下载后,用Maven导入(import——>Existing Mave ...
- elasticsearch 口水篇(6) Mapping 定义索引
前面我们感觉ES就想是一个nosql数据库,支持Free Schema. 接触过Lucene.solr的同学这时可能会思考一个问题——怎么定义document中的field?store.index.a ...
- elasticsearch 口水篇(2)CRUD Sense
Sense 为了方便.直观的使用es的REST Api,我们可以使用sense.Sense是Chrome浏览器的一个插件,使用简单. 如图: Sense安装: https://chrome.googl ...
- elasticsearch 口水篇(1) 安装、插件
一)安装elasticsearch 1)下载elasticsearch-0.90.10,解压,运行\bin\elasticsearch.bat (windwos) 2)进入http://localho ...
- Android NDK开发篇:Java与原生代码通信(异常处理)
一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...
- elasticsearch 口水篇(5)es分布式集群初探
es有很多特性,分布式.副本集.负载均衡.容灾等. 我们先搭建一个很简单的分布式集群(伪),在同一机器上配置三个es,配置分别如下: cluster.name: foxCluster node.nam ...
随机推荐
- HDU - 4454: Stealing a Cake (圆上三分)
pro:给定一个蛋糕,一个矩阵房子,一只蚂蚁.最开始三者两两相离,问蚂蚁触摸到蛋糕后再触摸矩阵的最短距离.结果保留两位小数,坐标的绝对值<1e4: sol:由于坐标不大,而且精度要求不高,不难想 ...
- sparkStreaming获取kafka数据(java版本)
环境 spark-2.2.0 kafka_2.11-0.10.0.1 jdk1.8 配置好jdk,创建项目并将kafka和spark的jar包添加到项目中,除此之外还需要添加spark-streami ...
- 欧拉函数 已经优化到o(n)
欧拉函数 ψ(x)=x*(1-1/pi) pi为x的质数因子 特殊性质(图片内容就是图片后面的文字) 欧拉函数是积性函数——若m,n互质, ψ(m*n)=ψ(m)*ψ(n): 当n为奇数时, ψ ...
- 【BZOJ2154】Crash的数字表格
算是学会反演了……(其实挺好学的一天就能学会…… 原题: 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能 ...
- 【liunx】date命令总结
命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the system date and time 指令所在路径:/bin/date 命令语法: date [OP ...
- gunicorn工作原理
gunicorn工作原理 Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork ...
- oracle使用一条语句批量插入多条数据
例如我有一个test表 create table (stuid int,name varchar(20); 插入多条数据,注意不能直接使用insert into test values(1,'a'), ...
- masterlab 敏捷项目管理工具
masterlab 是一个参考了gitlab 以及jira 的开源项目管理工具,基于php开发,同时官方也提供了一个 docker-compose 运行的项目 clone 代码 git clone ...
- hasura graphql-engine &&patroni docker-compose 环境运行
patroni 是一个很不错的pg ha 解决方案,graphql-engine 是一个很好的graphql 工具,为了方便使用 参考patroni官方的文档,使用docker-compose 将应用 ...
- drone 1.0 新功能试用以及说明
drone 1.0 rc 已经发布,新的功能很强大,界面比旧版本更加人性化,和git 的集成也更高了 测试环境准备 试用gogs 做为git 管理工具 docker-compose 文件 versio ...