我正在为项目使用spring-data-elasticsearch为其提供全文搜索功能.我们将真实数据保存在关系数据库和相关元数据中以及弹性搜索中的相应ID.因此,对于搜索结果,只需要id字段,因为将从关系数据库中检索实际数据.
我正在构建基于搜索条件的搜索查询,然后执行queryForIds():
SearchQuery searchQuery = new NativeSearchQueryBuilder() .withIndices(indexName) .withTypes(typeName) .withQuery(getQueryBuilder(searchParams)) .withPageable(pageable) .build(); return elasticsearchTemplate.queryForIds(searchQuery);
如果我还需要特定searchQuery的总计数,我可以再做一次elasticsearchTemplate.count(searchQuery)
调用,但是根据我的理解,这将是多余的.我认为有一种方法可以通过使用类似于elasticsearchTemplate.queryForPage()
单个调用的方式来获取id和总计数列表.
另外,我可以使用queryForPage(SearchQuery query, Class
未注释的自定义类@Document
吗?实际的文档类非常大,如果我不确定传递大类是否会导致引擎上的任何额外负载,因为有超过100个字段要进行json映射,但我需要的只是id字段..withFields("id")
无论如何,我将在查询构建器中有一个.
如果你想阻止两次调用elasticsearch,我建议写一个自定义的ResultsExtractor:
SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(indexName) .withTypes(typeName) .withQuery(queryBuilder) .withPageable(pageable) .build(); SearchResult result = template.query(searchQuery, new ResultsExtractor() { @Override public SearchResult extract(SearchResponse response) { long totalHits = response.getHits() .totalHits(); List ids = new ArrayList (); 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 { Listids; long count; //getter and setter }
这样,您就可以从elasticsearch获取所需的信息SearchResponse
.
关于你的第二个问题:据我所知,在调用queryForPage(SearchQuery query, Class
传递的类时没有检查@Document
注释.试试吧!