您好,欢迎访问一九零五行业门户网

如何使用Java构建Elasticsearch客户端并调用API?

elasticsearch通过构造一个client对外提供了一套丰富的java调用接口。总体来说client分为两类cluster信息方面的client及数据(index)方面的client。这两个大类由可以分为通用操作和admin操作两类。
client的继承关系(1.5版本,其它版本可能不一样):
通过这个继承关系图可以很清楚的了解client的实现,及功能。总共有三类即client, indicesadminclient和clusteradminclient。它都有自己的实现类,但最后都是通过client接口对外提供服务。client作为对外的总接口,首先通过admin()方法组合了admin的相关操作,它本身也提供了所有对数据和cluster的通用操作。
方法实现上所有的接口都通过两种方式实现了异步调用,一个是返回一个actionfuture,另外一种方式是接受一个actionlistener。
以index方法为例如下所示
 actionfuturebd75b9890e8d23118d4172b604fbaffe  index(indexrequest request) ;
 void index(indexrequest request, actionlistenerbd75b9890e8d23118d4172b604fbaffe listener);
第一个方法会返回一个future,第二个方法则需要传递一个listener。这也是异步实现的两个基本方式。client使用了门面模式,所有的实现都在abstractclient类中,还以index方法为例,代码如下所示:
@override public actionfuture<indexresponse> index(final indexrequest request) { return execute(indexaction.instance, request); } @override public void index(final indexrequest request, final actionlistener<indexresponse> listener) { execute(indexaction.instance, request, listener); }
实现如上所示,之所以说它是门面模式是因为所有的方法都被集成到了client中,但是执行过程都是在对应的action中执行。在execute方法中,获取到相应的action实例,真正的逻辑是在对应的transportaction中实现。
execute方法代码如下所示:
@suppresswarnings("unchecked") @override public <request extends actionrequest, response extends actionresponse, requestbuilder extends actionrequestbuilder<request, response, requestbuilder, client>> actionfuture<response> execute(action<request, response, requestbuilder, client> action, request request) { headers.applyto(request); transportaction<request, response> transportaction = actions.get((clientaction)action); return transportaction.execute(request); } @suppresswarnings("unchecked") @override public <request extends actionrequest, response extends actionresponse, requestbuilder extends actionrequestbuilder<request, response, requestbuilder, client>> void execute(action<request, response, requestbuilder, client> action, request request, actionlistener<response> listener) { headers.applyto(request); transportaction<request, response> transportaction = actions.get((clientaction)action); transportaction.execute(request, listener); }
每一种操作都对应有相应的transportaction,这些transportaction才是最终的执行者。这里先以index为例简单说明,在后面索引功能分析中会看到更多这种的结果。
public class indexaction extends clientaction<indexrequest, indexresponse, indexrequestbuilder> { public static final indexaction instance = new indexaction(); public static final string name = "indices:data/write/index"; private indexaction() { super(name); } @override public indexresponse newresponse() { return new indexresponse(); } @override public indexrequestbuilder newrequestbuilder(client client) { return new indexrequestbuilder(client); }}
在indexaction中只是简单的定义了一个name,及几个简单的方法。这个名字会在启动时作为对于的transporthandler的key注册到transportservice中。在execute方法中,会根据action的将transportaction取出如上一段代码所示。真正的执行逻辑在internaltransportclient中,这里先略过它的实现,后面会有详细分析。所有这些action的注册都是在actionmodule中实现,注册过程会在后面跟action一起分析。
以上就是如何使用java构建elasticsearch客户端并调用api?的详细内容。
其它类似信息

推荐信息