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