elasticsearch 如何在弹性高级Rest客户端中使用search_after进行分页,elasticsearch,lucene,elastic-rest-client,elasticsearch,Lucene,Elastic Rest Client" /> elasticsearch 如何在弹性高级Rest客户端中使用search_after进行分页,elasticsearch,lucene,elastic-rest-client,elasticsearch,Lucene,Elastic Rest Client" />

elasticsearch 如何在弹性高级Rest客户端中使用search_after进行分页

elasticsearch 如何在弹性高级Rest客户端中使用search_after进行分页,elasticsearch,lucene,elastic-rest-client,elasticsearch,Lucene,Elastic Rest Client,我正在使用elastic RestHighLevelClient与ES对话。我能够查询基本查询。尽管我试图使用search_after api根据前端查询设计分页api。尽管在RestLowLevelClient api中使用query_after很简单,但我不知道如何在高级api中使用它 看起来lucene api有SearchAfterSortedDocQuery,但我不知道如何将其与弹性搜索api一起使用。例如:在下面的代码中,我初始化了SearchAfterSortedDocQuery查

我正在使用elastic RestHighLevelClient与ES对话。我能够查询基本查询。尽管我试图使用search_after api根据前端查询设计分页api。尽管在RestLowLevelClient api中使用query_after很简单,但我不知道如何在高级api中使用它

看起来lucene api有SearchAfterSortedDocQuery,但我不知道如何将其与弹性搜索api一起使用。例如:在下面的代码中,我初始化了SearchAfterSortedDocQuery查询,但不确定如何使用它

        RestHighLevelClient client = ESRestClient.getClient();

        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("field1",value1));
        searchSourceBuilder.query(QueryBuilders.termQuery("field2",value2));

        searchSourceBuilder.from(0);
        searchSourceBuilder.size(limit);
        SortField[] sortFields = new SortField[2];

        sortFields[0]= new SortField("field1", SortField.Type.LONG);
        sortFields[1]= new SortField("field2", SortField.Type.LONG);


        FieldDoc fieldDoc = new FieldDoc(0,0); //Is this correct? how to initialize field doc?
        fieldDoc.fields = new Object[2];
        fieldDoc.fields[0] = new Long("-156034");
        fieldDoc.fields[1] = new Long("2297416849");

        SearchAfterSortedDocQuery query = new SearchAfterSortedDocQuery(new Sort(sortFields), fieldDoc);
        searchRequest.source(searchSourceBuilder);
        searchRequest.indices("index1");

        try {
            SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(response);
        }
        catch(IOException e){
            System.out.println(e);
        }

    }

我想您不用使用SearchAfterSorteDdQuery,只需在searchSourceBuilder中设置search\u after,如下所示

searchSourceBuilder.searchAfter(new Object[]{sortAfterValue});
之后,使用SearchRequest和rest客户端获取响应

SearchRequest searchRequest = new SearchRequest("index");
    searchRequest.types("type");
    searchRequest.source(searchSourceBuilder);

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT)
    SearchHits hits = searchResponse.getHits();
最后,您应该通过getSortValues()从点击中保留最后一个排序值,以便转到下一页

hits.getAt(lastIndex).getSortValues()


希望对您有所帮助。

是的,我完全忘了更新这里的内容。没错,谢谢。您知道如何使用复合排序键向后搜索吗