如何使用Java Client查询使用EasticSearch而不必担心客户端Java堆内存

时间:2016-04-01 07:33:11

标签: java rest elasticsearch lucene

我是弹性搜索的新手,我读到我们可以使用elasticsearch来查询其余的API调用。

我正在阅读以下链接: http://blogs.justenougharchitecture.com/using-jest-as-a-rest-based-java-client-with-elasticsearch/

这是正确的方法吗?

此外,我不想限制我的搜索将返回的结果数量(它可以返回数百万条记录)。

那么java中的ResultSet如何工作,表可能有数百万行,但我们可以一次迭代一行并只处理它,而不是将它存储在我的java堆中的任何地方),因此不必担心java堆空间,类似地我想做一些类似于弹性搜索查询的话,如果可能的话(我想要查询中的所有记录),但是在迭代它们时不要将它们全部放在我的记忆中。

是否可以使用任何java客户端(通过rest API),如果不是通过rest API,那么是否有解决此问题的方法。

由于

1 个答案:

答案 0 :(得分:1)

首先,如果您使用Java或其他JVM语言,您还可以使用native client。如果你想让你的依赖关系变小(java客户端与整个服务器基本相同),或者你只想通过HTTP接口而不是通过其二进制接口访问Elasticsearch,那么Jest是一个不错的选择。

其次,您要使用的是滚动API:https://www.elastic.co/guide/en/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();
}