[英]How to query using EasticSearch using java Client without worrying about client java heap memory
我是弹性搜索的新手,当时我读到我们可以使用elasticsearch通过其其余的API调用进行查询。
我正在阅读以下链接: http : //blogs.justenougharchitecture.com/using-jest-as-a-a-rest-based-java-client-with-elasticsearch/
这是正确的方法吗?
另外,我不想对搜索将返回的结果数进行限制(它可以返回数百万条记录)。
因此,这就是Java中ResultSet的工作方式,其中表可能有数百万行,但是我们可以一次迭代一行并对其进行处理,而不是将其存储在我的Java堆中的任何地方),因此不必担心Java堆空间,..同样,如果可能的话,我想与Elastic Search Query做类似的事情(在这里我希望查询中的所有记录),但是在迭代它们时,不要将它们全部放在我的内存中。
是否可以使用任何Java客户端(通过rest API)来执行此操作,如果不通过rest API,那么是否有解决此问题的方法。
谢谢
首先,如果您使用Java或其他JVM语言,则还可以使用本机客户端 。 如果您想保持较小的依赖关系(Java客户端与整个服务器基本相同),或者仅希望通过HTTP接口而不是通过二进制接口访问Elasticsearch,则Jest是一个不错的选择。
其次,您要使用的是滚动API: https : //www.elastic.co/guide/zh-cn/elasticsearch/client/java-api/current/java-search-scrolling.html (找不到快捷方式不过请参考Jest文档)。 它与ResultSet并不完全一样,但是允许您对所有结果进行大块迭代。 一个示例,摘自文档
QueryBuilder query = ...;
SearchResponse scrollResponse = client.prepareSearch(index)
.setSearchType(SearchType.SCAN)
.setScroll(new TimeValue(60000)) // timeout
.setQuery(query)
.setSize(100) // bulk size
.execute().actionGet();
//Scroll until no hits are returned
while (!scrollResp.getHits().getHits().isEmpty()) {
for (SearchHit hit : scrollResp.getHits().getHits()) {
//Handle the hit...
}
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
.setScroll(new TimeValue(60000))
.execute().actionGet();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.