2016-05-05 7 views
2

Es scheint, dass SpringData ES keine Klassen zum Abrufen der von ES zurückgegebenen Highlights bereitstellt. Spring Data kann Listen von Objekten zurückgeben, aber die Hervorhebungsabschnitte in dem von ES zurückgegebenen Json befinden sich in einem getrennten Teil, der nicht von der Klasse "ElasticSearchTemplate" behandelt wird.So bieten Sie die Hervorhebung mit Spring-Daten elasticsearch

Code-Beispiel: -

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); 

Ich muss falsch sein, aber ich kann nur mit SpringDataES zu tun, nicht herausgefunden. Jemand kann ein Beispiel veröffentlichen, wie wir mit Spring Data ES Highlights erzielen können?

Vielen Dank im Voraus!

Antwort

2

Aus den Testfällen im Frühjahr Daten Elasticsearch ich Lösung dieses Problems gefunden habe: -

Dies kann hilfreich sein.

@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)); 
}