繁体   English   中英

如何在不担心客户端Java堆内存的情况下使用Java Client使用EasticSearch进行查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM