我正在尝试将ElasticSearch REST API与Java 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
document(PUT http://127.0.0.1/test_index/test_type/<doc id>
)请求-可以正常使用,createDefault()
但用createPipelining()
-时找不到类似的错误-
没有找到处理程序<…>。
但是,当我尝试执行创建索引(PUT http://127.0.0.1/<index name>
)的请求时,出现了另一个错误。请参见下面的代码:
@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()));
}
正如我在此文档页面上所见,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
http://pastebin.com/v29uvgbj
-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
http://pastebin.com/G9ij15d6
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。
对于您的特殊情况,请求管道似乎没有多大意义。更不用说除非您要批量提交请求,否则您甚至都不会使用流水线执行。
问题内容: 我们正在考虑从Solr / Solr.net切换到Elasticsearch。我们从NEST开始。我们的搜索索引中只有4个文档。 上面的代码大约需要 250毫秒,而同样的代码,并采取30-45ms。250毫秒对于4个文档来说是太多时间。 NEST可以在高流量新闻网站上使用,还是您推荐+ 组合?搜索页面是2013年我们网站上访问量最大的页面。 提前致谢。 问题答案: 为了使NEST发出第
我试图使用Spring数据Elasticsearch连接到Elasticsearch 5。 根据链接-https://github.com/spring-projects/spring-data-elasticsearch,spring数据弹性搜索-3.0.0。M4与Elasticsearch 5.4.0兼容 但我在尝试连接Elasticsearch时出现以下错误 请告诉我,如果你们中的任何一个人
问题内容: 有人在Nest中找到或使用过CopyTo属性吗?我可以看到它已被添加为流利的映射的一部分,但似乎找不到它作为属性,这就是我目前执行所有映射的方式。 问题答案: NEST中基于属性的映射不支持。您需要使用流畅的API。见我的评论在这里作出解释。
Elasticsearch 从 5.0 开始,为日志场景的用户提供了一个很不错的接口,叫 rollover。其作用是:当某个别名指向的实际索引过大的时候,自动将别名指向下一个实际索引。 因为这个接口是操作的别名,所以我们依然需要首先自己创建一个开始滚动的起始索引: # curl -XPUT 'http://localhost:9200/logstash-2016.11.25-1' -d '{
我正在尝试将camel与elasticsearch集成。在applicationContext中。xml添加了以下内容 然后当我跑的时候 我得到以下信息 我的elasticsearch在本地运行,我使用ES 1.1.1。 我需要指定什么 谢谢,
我想通过http://IP:80.然而,当我访问页面时,我会发现以下错误: 需要升级您的Elasticsearch版本太旧。Kibana需要Elasticsearch 0.90.9或以上。 和 错误无法到达http://localhost:80/_nodes.如果您正在使用代理,请确保它配置正确 我一直在网上查找这些问题,我已经把这些行包括在内,但没有成功。。。 我的Elasticsearch版本