?
searchTextQueryOne = new MatchQuery.Builder().field(searchFieldOne).query(searchText).build();// 幫助中心文檔切分 只查詢6條Integer finalTopK = 10;List<String> newReturnFileds = returnFields;newReturnFileds.add("kid"); // 需要返回kidHighlight highlight = new Highlight.Builder().fields("content_answer", new HighlightField.Builder().preTags("<em style='color:red'>").postTags("</em>").build()).requireFieldMatch(false) // 跨字段高亮.build();response = client.search(s -> s.index(aliasName).query(boolQuery._toQuery()).source(SourceConfig.of(sf -> sf.filter(f -> f.includes(newReturnFileds)))).highlight(highlight) // 添加高亮.size(finalTopK),ObjectNode.class);返回結果的處理// 檢查是否有高亮內容if (hit.highlight() != null && hit.highlight().containsKey("content_answer")) {List<String> highlightedContent = hit.highlight().get("content_answer");// 拼接高亮內容到原始 contentAnswerString highlightedAnswer = String.join(" ", highlightedContent); // 高亮片段拼接String fullAnswer = contentAnswer.replaceFirst(Pattern.quote(question), // 匹配原始查詢關鍵字highlightedAnswer // 替換為高亮內容);// 設置拼接后的高亮內容到 question1question1.setAnswer(fullAnswer);} else {// 如果沒有高亮內容,直接設置原始 contentAnswerquestion1.setAnswer(contentAnswer);}
關鍵點說明
-
requireFieldMatch(false)
這是實現跨字段高亮的關鍵設置,允許在?content_answer
?字段上高亮,即使查詢的是其他字段(如?question
?字段) -
其他可選參數
-
fragmentSize()
?- 控制每個高亮片段的大小 -
numOfFragments()
?- 控制返回的高亮片段數量 -
noMatchSize()
?- 當沒有匹配時返回的文本長度
?// 例子Highlight highlight = new Highlight.Builder().fields(new HighlightField.Builder("content_answer").preTags("<em style='color:red'>").postTags("</em>").requireFieldMatch(false) // 關鍵設置.fragmentSize(150) // 可選:設置片段大小.numOfFragments(3) // 可選:設置片段數量.build()).build();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchQuery("question", "搜索詞")) // 搜索question字段.highlighter(highlight);SearchRequest searchRequest = new SearchRequest("your_index").source(searchSourceBuilder);SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);注意事項 確保 content_answer 字段是 text 類型并且可搜索對于大型富文本內容,適當增加 fragmentSize 值如果高亮結果不理想,可以嘗試不同的高亮類型:java 復制 .highlighterType("fvh") // 快速向量高亮器
-
?