2

我测试了弹性搜索高亮领域的功能,它工作正常。我用弹性搜索2.4.4弹簧数据elasticsearch-2.0.0.RELEASE弹性搜索5.5高光领域不工作

的示例代码是在后下

How to provide highlighting with Spring data elasticsearch

我最近升级为弹性搜索到5.5.0spring-data-elasticsearch-3.0.0.M4

当我测试相同的代码时,高亮做n OT发生

下面是示例代码

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("occindex") 
       .withPageable(new PageRequest(0, mySpecification.getNoOfRecords())) 
       .withQuery(QueryBuilders.multiMatchQuery(
         searchText.toLowerCase()).field("transformedTitle", 10.0f). 
         minimumShouldMatch("50%").fuzziness(Fuzziness.ONE).prefixLength(3) 
         .field("transformedDesription").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)) 
       .withHighlightFields(
         new HighlightBuilder.Field("transformedTitle").preTags("<span style='background-color: #FFFF00'>") 
           .postTags("</span>"), 
         new HighlightBuilder.Field("transformedDesription").fragmentSize(250).numOfFragments(3) 
           .preTags("<span style='background-color: #FFFF00'>").postTags("</span>")) 
       .build(); 




     Page<MyResultRecord> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, 
       MyResultRecord.class, new SearchResultMapper() { 
        @Override 
        public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) { 
         List<MyResultRecord> chunk = new ArrayList<MyResultRecord>(); 
         for (SearchHit searchHit : response.getHits()) { 
          if (response.getHits().getHits().length <= 0) { 
           return null; 
          } 
          MyResultRecord myResultRecord = new MyResultRecord(); 
          myResultRecord.setRecordId(searchHit.getId()); 

          Map<String, Object> source = searchHit.getSource(); 
          myResultRecord.setRisk((String) source.get("actualRisk")); 

          String highlightedTitle = null; 
          System.out.println(" Check the highlighted fileds " + searchHit.getHighlightFields()); 
          System.out.println(" Is this null ?? " + searchHit.getHighlightFields().get("transformedTitle")); 

          if (searchHit.getHighlightFields().get("transformedTitle") != null) 
           highlightedTitle = searchHit.getHighlightFields().get("transformedTitle").fragments()[0] 
             .toString(); 
          else 
           highlightedTitle = (String) source.get("transformedTitle"); 

          myResultRecord.setHighlightedTitle(highlightedTitle); 
          myResultRecord.setScore(searchHit.getScore()); 

          chunk.add(myResultRecord); 
         } 
         if (chunk.size() > 0) { 
          return new AggregatedPageImpl(chunk); 
         } 
         return null; 
        } 
       }); 

有没有为了突出在弹性搜索5.5.0领域需要更改任何代码?

当我打印在弹性搜索日志查询,我发现只有一个亮点场被传递到弹性搜索

{ 
    "from":0, 
    "size":2, 
    "query":{ 
     "multi_match":{ 
     "query":" My Query String", 
     "fields":[ 
      "transformedDesription^1.0", 
      "transformedTitle^1.0" 
     ], 
     "type":"best_fields", 
     "operator":"OR", 
     "slop":0, 
     "prefix_length":0, 
     "max_expansions":50, 
     "lenient":false, 
     "zero_terms_query":"NONE", 
     "boost":1.0 
     } 
    }, 
    "highlight":{ 
     "fields":{ 
     "transformedDesription":{ 
      "pre_tags":[ 
       "<bold>" 
      ], 
      "post_tags":[ 
       "</bold>" 
      ] 
     } 
     } 
    } 
} 

当我调试,我观察到NativeSearchQuery有两个突出显示的字段,但最终发送给Elastic Search的查询仅请求一个突出显示字段。

+0

您可以添加当前的mappin G ? – dadoonet

+0

更新了问题 – lives

+0

听起来像一个,但在Spring中将高亮部分翻译为JSON。你有什么机会可以展示生成的JSon是什么?可能在elasticsearch方面用slowqueries调试? – dadoonet

回答

0

制造它通过改变下面的代码在工作org.springframework.data.elasticsearch.core.ElasticsearchTemplate.doSearch

现有代码

if (searchQuery.getHighlightFields() != null) { 
      for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { 
       searchRequest.highlighter(new HighlightBuilder().field(highlightField)); 
      } 

     } 

修改代码

if (searchQuery.getHighlightFields() != null) { 
      HighlightBuilder myBuilder = new HighlightBuilder(); 
      for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { 
       myBuilder.field(highlightField); 

      } 
      searchRequest.highlighter(myBuilder); 
     }