分散式搜尋elasticsearch java API 之 highlighting (對搜尋結果的高亮顯示)
阿新 • • 發佈:2019-01-01
搜尋請求的Body如下::
{
"query" : {...},
"highlight" : {
"fields" : {
"title":{},
"intro" : {}
}
}
}
java API :
client.prepareSearch("product")
.setQuery(buildQuery()).setSize(10).setFrom(0)
.addHighlightedField("title").addHighlightedField("intro");
這裡對title和intro兩欄位進行高亮顯示,所以構造QueryBuilder要對兩個fields 進行檢索,buildQuery()方法如下:
private QueryBuilder buildQuery() {
return boolQuery().must(fieldQuery("title", "不鏽鋼"))
.should(fieldQuery("intro", "不鏽鋼"));
}
下一步是提取高亮欄位的文字:
SearchHits hits = response.getHits(); for(SearchHit hit : hits){ Map<String, HighlightField> result = hit.highlightFields(); System.out.println("A map of highlighted fields:" + result); HighlightField titleField = result.get("title"); Text[] titleTexts = titleField.fragments(); for(Text text : titleTexts){ System.out.println("title text: "+text); } HighlightField introField = result.get("title"); Text[] introTexts = introField.fragments(); for(Text text : introTexts){ System.out.println("intro text: "+text); } System.out.println("--------------------------"); }
取得高亮結果hit.highlightFields(),result.get("field")得到對應欄位,然後呼叫HighlightField.fragments()得到高亮之後的文字片段。