2016-05-05 11 views
2

SpringData ESは、ESによって返されるハイライトをフェッチするクラスを提供していないようです。 Springデータはオブジェクトのリストを返すことができますが、ESによって返されたJsonのハイライトセクションは、 "ElasticSearchTemplate"クラスで処理されない分離部分にあります。Springデータelasticsearchで強調表示を提供する方法

コード例: -

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でハイライトを取得する方法の例を投稿できますか?

ありがとうございます!私はこれに解決策を見つけたelasticsearch春データのテストケースから

答えて

2

は: -

に役立ちます。

@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)); 
} 
関連する問題