【问题标题】:How to query using EasticSearch using java Client without worrying about client java heap memory如何使用 java 客户端使用 ElasticSearch 进行查询,而不用担心客户端 java 堆内存
【发布时间】:2016-07-20 22:02:16
【问题描述】:

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

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

这是正确的做法吗??

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

Java 中的 ResultSet 是如何工作的,表可能有数百万行,但我们可以一次迭代一行并处理它,而不是将它存储在我的 java 堆中的任何地方),因此不必担心java 堆空间,.. 同样,如果可能,我想对 Elastic Search Querying 做类似的事情(我想要查询中的所有记录),但在迭代它们时不要将它们全部放在我的内存中。

是否可以使用任何java客户端(通过rest API)来做到这一点,如果不是通过rest API,那么有没有解决这个问题的方法。

谢谢

【问题讨论】:

    标签: java rest elasticsearch lucene


    【解决方案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();
    }
    

    【讨论】:

    • 感谢您的回复。在“SearchResponse scrollResponse = client.prepareSearch(index)”行中,这个“索引”是什么,它是数据索引的路径吗?如果我的客户在其他机器上,我们需要作为“索引”传递。请指教。
    猜你喜欢
    • 2011-12-12
    • 2021-01-03
    • 2017-07-05
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多