如何使用 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
中是不可能的
我正在使用 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
中是不可能的