1. 程式人生 > >Elasticsearch5.5.1 使用JEST客戶端高亮顯示

Elasticsearch5.5.1 使用JEST客戶端高亮顯示

高亮顯示是在結果文件中顯示查詢中的哪個或哪些單詞被匹配的過程。先來看看ES的指令碼是如何顯示高亮的:

資料如下:


在Sense中執行如下指令碼

GET http://localhost:9200/article/content/_search
 {
    "query" : {
       "term" : {
            "view" : "100"
        }
    },
    "highlight" : {
        "pre_tags" : [ "<em>" ],
        "post_tags" : [ "</em>" ],
        "fields" : {
            "view" : {}
        }
    }
}

輸出如下:
{
   "took": 4,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 0.9808292,
      "hits": [
         {
            "_index": "article",
            "_type": "content",
            "_id": "AV5Qs4GbXljy_f1_Lvwl",
            "_score": 0.9808292,
            "_source": {
               "author": "AAAA",
               "titile": "中國獲租巴基斯坦瓜達爾港2000畝土地 為期43年",
               "tag": "JAVA,ANDROID,C++,LINUX",
               "content": "據瞭解,瓜達爾港務局於今年6月完成了1500畝土地的徵收工作,另外500畝的徵收工作也將很快完成",
               "view": "100",
               "date": "2017-09-05T14:21:34"
            },
            "highlight": {
               "view": [
                  "<em>100</em>"
               ]
            }
         }
      ]
   }
}

view中的值被加入了<em>標籤.

注意:

要高亮顯示的內容必須要包含在你查詢的內容中,如果不在,就不能正確的顯示。以下就是一個反例:


那麼如何使用Jest客戶端來高亮顯示了?具體程式碼如下:

    private static JestClient jestClient;
    private static String indexName = "article";  
    private static String typeName = "content"; 

    
    @Before
    public void getClient() throws Exception{
		JestClientFactory factory = new JestClientFactory();  
        factory.setHttpClientConfig(new HttpClientConfig  
                               .Builder("http://localhost:9200")  
                               .gson(new GsonBuilder().setDateFormat("yyyy-MM-dd'T'hh:mm:ss").create())  
                               .connTimeout(1500)  
                               .readTimeout(3000)  
                               .multiThreaded(true)  
                               .build());
        jestClient=factory.getObject();
    }
	
	
	    /**
     * 搜尋高亮顯示
     * @throws Exception
     */
    @Test
    public void createSearch() throws Exception {
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.query(QueryBuilders.termQuery("view", "200"));
		HighlightBuilder highlightBuilder = new HighlightBuilder();
		highlightBuilder.field("view");//高亮title
		highlightBuilder.preTags("<em>").postTags("</em>");//高亮標籤
		highlightBuilder.fragmentSize(500);//高亮內容長度
		searchSourceBuilder.highlighter(highlightBuilder);
		
		System.out.println(searchSourceBuilder.toString());

		Search search = new Search.Builder(searchSourceBuilder.toString())
        .addIndex(indexName)
        .build();
		
		
		SearchResult result = jestClient.execute(search);
		System.out.println(result.getJsonString());
		System.out.println("本次查詢共查到:"+result.getTotal()+"篇文章!");
		List<Hit<CsdnBlog,Void>> hits = result.getHits(CsdnBlog.class);
		
		System.out.println(hits.size());
		for (Hit<CsdnBlog, Void> hit : hits) {
			
			CsdnBlog source = hit.source;
			//獲取高亮後的內容
			Map<String, List<String>> highlight = hit.highlight;
			
			
			List<String> views = highlight.get("view");//高亮後的title
			if(views!=null){
				source.setView(views.get(0));
			}
			System.out.println("標題:"+source.getTitile());
			System.out.println("內容:"+source.getContent());
			System.out.println("瀏覽數:"+source.getView());
			System.out.println("標籤:"+source.getTag());
			System.out.println("作者:"+source.getAuthor());
		}
	}


輸出如下:

標題:中國獲租巴基斯坦瓜達爾港2000畝土地 為期43年
內容:據瞭解,瓜達爾港務局於今年6月完成了1500畝土地的徵收工作,另外500畝的徵收工作也將很快完成
瀏覽數:<em>200</em>
標籤:JAVA,ANDROID,C++,LINUX
作者:BBBB