当前位置: 首页 > 面试题库 >

如何通过Spring数据Elasticsearch提供突出显示

融修平
2023-03-14
问题内容

似乎SpringData ES不提供类来获取ES返回的突出显示。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数据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));
}


 类似资料:
  • 我正在使用Spring Elasticsearch chRepository来查询Elasticsearch: 我可以成功运行搜索查询并检索映射到MyDocument bean中的elasticsearch结果列表 虽然发送到elasticsearch和响应的查询是正确的(我可以在调试日志中看到突出显示块)并且结果也合适,但我不知道如何在我的java代码中获取突出显示信息。 我不想使用Elasti

  • 我正在尝试从网页上的表格中提取数据。到目前为止,我已经能够从标题标签中提取数据——但不能提取表格数据。如何使用下面显示的源来实现这一点? 资料来源: 编辑——回应马泰·斯皮利的以下评论: ^-(导致错误:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图)

  • 我有一个spring boot 1.5.9应用程序,它使用spring数据elasticsearch(2.1.3)连接到elasticsearch 2.4.0实例。现在,我需要将spring boot升级到版本2,使其能够与新的依赖项一起工作。 如果我使用最新的spring启动版本(2.1.0),它附带了spring数据elasticsearch 3.1.2,它使用elasticsearch 6.

  • 我不知道如何使用上描述的功能https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html -- 给定一个包含两个术语“foo”和“bar”的查询,我希望“foo”的突出显示方式与“bar”不同。上面链接的文档使它看起来像是可以用来将类应用到

  • 我正在尝试在嵌套查询的命中时返回突出显示。根据文档,这是可能的。文档说: 父/子和嵌套特性允许返回在不同范围内匹配的文档。在嵌套的情况下,基于嵌套内部对象中的匹配返回文档。内部命中功能在搜索响应中为每个搜索命中返回导致搜索命中在不同范围内匹配的附加嵌套命中。通过在嵌套、has_child或has_parent查询和筛选器上定义inner_hits定义,可以使用内部命中。Inner hits还支持以

  • 问题内容: 我有以下三个应用程序: 项目1举行 业务逻辑(Spring Cloud功能) 接口 IDemoEntity 项目二 AWS特定的处理程序 IDemoEntity的 一种实现,具有DynamoDB特定的注释 该项目基于Spring Boot 项目3 IDemoEntity的 一种实现,带有CosmosDB批注 Azure特定的处理程序 项目1的类如下所示: 对于项目2,IDemoEnti