如何使用 Spring Data Elasticsearch ElasticsearchRepository 突出显示

How to get highlighting using Spring Data Elasticsearch ElasticsearchRepository

我正在使用 spring ElasticsearchRepository 来查询 Elasticsearch:

@Repository
public interface MyDocumentRepository extends ElasticsearchRepository<MyDocument, String>{

}

我可以成功 运行 搜索查询并检索映射到 MyDocument bean

中的 elasticsearch 结果列表
private final MyDocumentRepository myDocumentRepository;

...

Pageable pageable = PageRequest.of(0, 10);
QueryBuilder query = QueryBuilders.boolQuery().must(queryStringQuery("my query"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(query)
        .withPageable(pageable)
        .withHighlightFields(
                new HighlightBuilder.Field("field1"),
                new HighlightBuilder.Field("field2"))
                .build();

Iterable<MyDocument> = myDocumentRepository.search(searchQuery);

虽然发给elasticsearch的query和response都是正确的(我在debug log中可以看到高亮块)而且结果也合适,但是我不知道如何在我的java中获取高亮信息代码。

我想使用ElasticsearchTemplate和ResultExtractor来获取高亮信息。

提前致谢!

实际上,如果您收到 ES 响应,您将拥有一个 SearchHit 对象。这个 SearchHit 对象只是表示 ES 结果的 HTTP Response。

如果您的结果命中突出显示的字段,SearchHit 会提供一个 Map<String, HighlightField> 的地图,您可以在其中迭代和过滤突出显示的文本和属性。

SearchHit 中返回附加信息是当前 master 分支中实现的一项功能,可在快照构建中使用。它将与下一个版本 (4.0) 一起发布

这不是来自 Elasticsearch 的 SearchHit class,而是 Spring Data Elasticsearch 中新引入的 class。

在当前版本 (3.2.x) 中,这只能使用自定义结果映射器(在 4.0 中不再可用)

编辑:

关于即将发布的版本4中的配置,请查看https://docs.spring.io/spring-data/elasticsearch/docs/current-SNAPSHOT/reference/html/#elasticsearch.clients.rest

使用此配置,您可以将一个 ElasticsearchOperations 实例注入到您的代码中,此 bean 在 AbstractElasticsearchConfiguration class 中定义。必要的代码片段:

@Autowired ElasticsearchOperations operations;

...

SearchHits<MyDocument> searchHits = operations.search(searchQuery,
                                        MyDocument.class,
                                        IndexCoordinates.of("index-name");

关于 returned 数据检查的更多信息 https://docs.spring.io/spring-data/elasticsearch/docs/current-SNAPSHOT/reference/html/#elasticsearch.operations.searchresulttypes

我们知道 4.0 版中有相当多的弃用和一些重大更改,但我们将有一个更干净的 API 我们将有可能 return 所有这些搜索结果元数据, 这在 3.2

中是不可能的