一.邏輯
1.設置高亮的配置:
(1)設置高亮顯示的字段
(2)設置高亮顯示的前綴
(3)設置高亮顯示的後綴
2.在client對象執行查詢之前,設置高亮顯示的信息【通知】。
3.遍歷結果列表時可以從結果中取高亮結果。
二.代碼塊
package cn.demo04;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.util.Iterator;
import java.util.Map;
public class StringHighLine {
@Test
/*
根據分頁設置進行查詢
*/
public void testStringHighLine()throws Exception{
// 1創建一個Settings對象,相當於一個配置信息。主要配置集羣名稱。
Settings settings = Settings.builder()
//put參數1是配置名稱,參數2是配置值
.put("cluster.name","my-elasticsearch")
.build();
// 2創建一個客戶端Client對象。
TransportClient client = new PreBuiltTransportClient(settings);
//2.2 獲取集羣的節點列表
//2.2.1 參數1是InetAddress.getByName獲取ip地址(PPT方式),參數二是端口號(節點對外的端口),而不是服務端口號
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
// 3.創建一個查詢對象,可以使用QueryBuilders工具類創建QueryBuilder對象。
QueryBuilder queryBuilder = QueryBuilders
.queryStringQuery("文檔對象2")//根據字符串進行創建QueryBuilder對象
.defaultField("title");//設置默認搜索域【field】
// 4.使用client執行查詢。
//4.1創建一個HighlightBuilder
HighlightBuilder highlightBuilder = new HighlightBuilder();
//設置高亮的前綴,域,後綴
highlightBuilder.field("title");//域【field】
highlightBuilder.preTags("<em>");//前綴
highlightBuilder.postTags("</em>");//後綴
//4.2添加一個高亮設置
SearchResponse searchResponse = client.prepareSearch("index_hello")//查詢的索引庫
.setTypes("article")//查詢的type
.setQuery(queryBuilder)//查詢條件
.setFrom(0)//設置起始頁
.setSize(5)//設置每頁顯示的記錄數
.highlighter(highlightBuilder)//設置關鍵詞高亮
.get();//執行查詢
// 5.得到查詢的結果集。
SearchHits hits = searchResponse.getHits();
// 6.取查詢結果的總記錄。
System.out.println("查詢結果的總記錄:" + hits.getTotalHits());
// 7.取查詢結果列表。
//7.1獲取查詢結果的迭代器
Iterator<SearchHit> iterator = hits.iterator();
//7.2遍歷迭代器
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
System.out.println("------------獲取字符串形式的文檔對象數據---------");
System.out.println("查詢的結果爲:" + searchHit.getSourceAsString());
System.out.println("--------獲取文檔的屬性---------");
Map<String, Object> document = searchHit.getSource();//獲取map集合
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("context"));
//獲取高亮的結果集合
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
System.out.println(highlightFields);
HighlightField field = highlightFields.get("title");//通過鍵名取出高亮的值,鍵爲指的域名【field】
Text[] fragments = field.getFragments();//返回的高亮結果集是數組,需要進行遍歷
if(fragments != null){
String fragment = fragments[0].toString();
System.out.println("高亮部分的鍵爲title,值爲" + fragment);
}
}
// 8.關閉client對象。
client.close();
}
}
三.範例