java-ElasticSearch和Apache HttpAsyncClient
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-ElasticSearch和Apache HttpAsyncClient,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3800字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试将ElasticSearch REST API与Jav??a Apache HttpAsyncClient库一起使用.我想使用持久流水线连接.这是一些测试代码(输出在注释中):
@Test
public void testEsPipeliningClient() throws IOException, ExecutionException, InterruptedException
{
testPost(HttpAsyncClients.createDefault());
//201: {"_index":"test_index","_type":"test_type","_id":"AVIHYGnqdqqg_TAHm4ix","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
testPost(HttpAsyncClients.createPipelining());
//400: No handler found for uri [http://127.0.0.1:9200/test_index/test_type] and method [POST]
}
private void testPost(CloseableHttpAsyncClient client) throws ExecutionException, InterruptedException, IOException
{
client.start();
HttpPost request = new HttpPost("http://127.0.0.1:9200/test_index/test_type");
request.setEntity(new StringEntity("{\"some_field\": \"some_value\"}"));
Future<HttpResponse> responseFuture = client.execute(request, null);
HttpResponse response = responseFuture.get();
System.err.println(response.getStatusLine().getStatusCode() + ": " + EntityUtils.toString(response.getEntity()));
}
我不明白,为什么它可以与HttpAsyncClients.createDefault()客户端一起正常工作,但不能与HttpAsyncClients.createPipelining()一起工作.我也无法理解这两种创建方法之间的区别.
使用createPipelining()时为什么会收到错误响应?
我尝试查看与https://httpbin.org/post的区别,但是这两个选项都显示了相同的结果.我使用默认的ElasticSearch设置.
谢谢!
UPD1
我尝试使用PUT文档(PUT http://127.0.0.1/test_index/test_type/\u0026lt;doc id>)请求,结果相同-在createDefault()上可以正常使用,但在使用createPipelining()时遇到类似的错误-未找到处理程序< ...>.
但是,当我尝试执行创建索引的请求(PUT http://127.0.0.1/\u0026lt;索引名称>)时,出现了另一个错误.请参见下面的代码:
@Test
public void testEsPipeliningClient() throws IOException, ExecutionException, InterruptedException
{
testCreateIndex(HttpAsyncClients.createDefault());
//200: {"acknowledged":true}
testCreateIndex(HttpAsyncClients.createPipelining());
//400: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse, document is empty"}],"type":"mapper_parsing_exception","reason":"failed to parse, document is empty"},"status":400}
}
private void testCreateIndex(CloseableHttpAsyncClient client) throws ExecutionException, InterruptedException, IOException
{
client.start();
HttpPut request = new HttpPut("http://127.0.0.1:9200/" + RandomStringUtils.randomAlphabetic(8).toLowerCase());
Future<HttpResponse> responseFuture = client.execute(request, null);
HttpResponse response = responseFuture.get();
System.err.println(response.getStatusLine().getStatusCode() + ": " + EntityUtils.toString(response.getEntity()));
}
正如我在this documentation page所见,ElasticSearch默认支持HTTP流水线.也许我需要更改ES设置吗?
UPD2
以下是具有不同日志记录设置的UPD1部分中的一些代码代码日志:
Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.wire=INFO
-Dorg.apache.commons.logging.simplelog.log.org.apache.http.impl.conn=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.impl.client=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.client=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.wire=DEBUG
UPD3
我只是尝试用createMinimal()替换createDefault(),它引起了与createPipelining()相同的错误.任何想法在MinimalHttpAsyncClient中会导致此问题吗?也许有一种方法可以手动创建管道客户端(带有构建器类)而不会出现此问题?
解决方法:
服务器必须在请求行中阻塞绝对请求URI
[DEBUG] wire - http-outgoing-1 >> "PUT http://127.0.0.1:9200/ydiwdsid HTTP/1.1[\r][\n]"
流水线模式下的HttpAsyncClient使用最少的协议处理链.它不会尝试重写请求对象的请求URI.
对于您的特殊情况,请求管道似乎没有多大意义.更不用说除非您要批量提交请求,否则您甚至都不会使用流水线执行.
内容总结
以上是互联网集市为您收集整理的java-ElasticSearch和Apache HttpAsyncClient全部内容,希望文章能够帮你解决java-ElasticSearch和Apache HttpAsyncClient所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。