当前位置: 首页 > 知识库问答 >
问题:

使用Spring数据elasticsearch中的Elasticsearch模板获取ID的计数和列表

鲍建业
2023-03-14

我正在为一个项目使用spring-data-elasticsearch来为其提供全文搜索功能。我们将真实数据保存在关系数据库中,将相关元数据以及相应的id保存在elasticsearch中。因此,对于搜索结果,只需要id字段,因为实际数据将从关系数据库中检索。

我正在根据搜索条件构建搜索查询,然后执行queryForIds():

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withIndices(indexName)
            .withTypes(typeName)
            .withQuery(getQueryBuilder(searchParams))
            .withPageable(pageable)
            .build();

    return elasticsearchTemplate.queryForIds(searchQuery);

如果我还需要特定搜索查询的总数,我可以做另一个elasticsearchTemplate。count(searchQuery)调用,但据我所知,这是多余的。我认为有一种方法可以通过使用类似elasticsearchTemplate的东西来获取id列表和总计数。queryformage()在单个调用中。

此外,我可以在queryformage(SearchQuery查询,class)中使用自定义类吗

共有2个答案

郭浩穰
2023-03-14

也可以考虑使用AggregatedPage

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(indexName)
        .withTypes(typeName)
        .withQuery(queryBuilder)
        .withPageable(pageable)
        .build();

AggregatedPage<ElasticDTO> queryResult = elasticsearchTemplate.queryForPage(searchQuery , ElasticDTO.class);

夏嘉德
2023-03-14

如果您想防止两次调用elasticsearch,我建议您编写一个自定义ResultExtractor:

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(indexName)
        .withTypes(typeName)
        .withQuery(queryBuilder)
        .withPageable(pageable)
        .build();
SearchResult result = template.query(searchQuery, new ResultsExtractor<SearchResult>() {

    @Override
    public SearchResult extract(SearchResponse response) {
        long totalHits = response.getHits()
                .totalHits();
        List<String> ids = new ArrayList<String>();
        for (SearchHit hit : response.getHits()) {
            if (hit != null) {
                ids.add(hit.getId());
            }
        }
        return new SearchResult(ids, totalHits);
    }
});
System.out.println(result.getIds());
System.out.println(result.getCount());

其中SearchResult是自定义类:

public class SearchResult {

    List<String> ids;
    long count;

    //getter and setter
}

这样,您可以从elasticsearch获得所需的信息。

关于你的第二个问题:据我所知,当调用queryForPage(SearchQuery查询,Class

 类似资料:
  • 问题内容: 我正在为项目使用spring-data- elasticsearch,以为其提供全文搜索功能。我们将真实数据保存在关系数据库中,并将相关元数据以及各自的ID保留在elasticsearch中。因此,对于搜索结果,仅需要id字段,因为将从关系数据库中检索实际数据。 我正在基于搜索条件构建搜索查询,然后执行queryForIds(): 如果我还需要该特定searchQuery的总数,则可以

  • 我试图使用Spring数据Elasticsearch连接到Elasticsearch 5。 根据链接-https://github.com/spring-projects/spring-data-elasticsearch,spring数据弹性搜索-3.0.0。M4与Elasticsearch 5.4.0兼容 但我在尝试连接Elasticsearch时出现以下错误 请告诉我,如果你们中的任何一个人

  • 我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,

  • 我正在配置elasticsearch spring应用程序,并遵循我创建的RestHighLevelClient文档: 现在我希望我所有的文档都有snake_case的命名策略,在文档上这是我发现的: 在没有进一步配置的情况下,Spring Data Elasticsearch将使用对象的属性名称作为Elasticsearch中的字段名称。这可以通过使用该属性上的@Field注释来更改单个字段。

  • 我目前正在将我所做的一个项目从使用Hibernate的Spring Data转换为使用ElasticSearch的Spring Data。 以前,我能够使用注释自动生成实体的id。这样,当实体被保存时,就会为它生成一个id号。 使用Hibernate注释的实体: 是否存在与@GeneratedValue注释等价的ElasticSearch?如果不是,使用ElasticSearch时填充id字段的最

  • 我使用的是spring boot 1.5.7。发布,spring data elasticsearch 3.0.2。释放和弹性搜索5.6.3。然而,当使用maven进行构建时,它似乎在加载elasticsearch 2.4.6。当我试图通过pom文件强制elasticsearch 5.6.3时,我收到运行时异常,该异常显示缺少运行时依赖项。有什么想法吗?