elasticsearch - 如何使用 Spring data elasticsearch 提供高亮显示

标签 elasticsearch spring-data spring-data-elasticsearch

SpringData ES好像没有提供类来获取ES返回的highlights。 Spring Data 可以返回对象列表,但 ES 返回的 Json 中的高亮部分位于一个单独的部分,“ElasticSearchTemplate”类不处理。

代码示例:-

QueryBuilder query = QueryBuilders.matchQuery("name","tom"); 
SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(query).
                               with HighlightFields(new Field("name")).build();
List<ESDocument> publications = elasticsearchTemplate.queryForList
                                                (searchQuery, ESDocument.class);

我可能是错的,但我想不出只使用 SpringDataES。有人可以发布我们如何使用 Spring Data ES 获得亮点的示例吗?

提前致谢!

最佳答案

从 spring data elasticsearch 的测试用例中,我找到了解决方案:

这很有用。

@Test
public void shouldReturnHighlightedFieldsForGivenQueryAndFields() {

    //given
    String documentId = randomNumeric(5);
    String actualMessage = "some test message";
    String highlightedMessage = "some <em>test</em> message";

    SampleEntity sampleEntity = SampleEntity.builder().id(documentId)
            .message(actualMessage)
            .version(System.currentTimeMillis()).build();

    IndexQuery indexQuery = getIndexQuery(sampleEntity);

    elasticsearchTemplate.index(indexQuery);
    elasticsearchTemplate.refresh(SampleEntity.class);

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(termQuery("message", "test"))
            .withHighlightFields(new HighlightBuilder.Field("message"))
            .build();

    Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() {
        @Override
        public <T> Page<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
            List<SampleEntity> chunk = new ArrayList<SampleEntity>();
            for (SearchHit searchHit : response.getHits()) {
                if (response.getHits().getHits().length <= 0) {
                    return null;
                }
                SampleEntity user = new SampleEntity();
                user.setId(searchHit.getId());
                user.setMessage((String) searchHit.getSource().get("message"));
                user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString());
                chunk.add(user);
            }
            if (chunk.size() > 0) {
                return new PageImpl<T>((List<T>) chunk);
            }
            return null;
        }
    });

    assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage));
}

关于elasticsearch - 如何使用 Spring data elasticsearch 提供高亮显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37049764/

相关文章:

java - Spring MongoRepository 正在更新或更新插入而不是插入

java - 在Spring中将包含json属性的实体保存到ElasticSearch

java - 查询 Spring Data Elasticsearch 的嵌套属性

elasticsearch - HTTP URL的GROK模式

elasticsearch - elasticsearch过滤器按什么顺序应用?

python - 在elasticsearch中查询一个空字符串

Java -> Kotlin。数据类转换模式

search - Elasticsearch 返回给定类型的所有文档

java - 查询文档及其所有与 mongodb 中的条件匹配的子文档(使用 spring)

spring-java-config - spring data elasticsearch 初始化方法调用失败;嵌套异常是 java.lang.AbstractMethodError