1. 程式人生 > >分散式搜尋elasticsearch java API 之 highlighting (對搜尋結果的高亮顯示)

分散式搜尋elasticsearch java API 之 highlighting (對搜尋結果的高亮顯示)

搜尋請求的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()得到高亮之後的文字片段。