這期內容當中小編將會給大家帶來有關Elasticsearch實現復合查詢高亮結果功能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一.Es的配置
實現es的全文檢索功能的第一步,首先從與es進行連接開始,這里我使用的是es的5.x java api語法.
public TransportClient esClient() throws UnknownHostException{ Settings settings = Settings.builder() .put("cluster.name", "my-application") //節點的名字 .put("client.transport.sniff", true) .build(); InetSocketTransportAddress iAddress = new InetSocketTransportAddress( //連接es的ip地址和端口號 InetAddress.getByName("127.0.0.1"),9300 ); //根據先前的配置生成client,后面的操作基本都是基于這個 TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(iAddress); return client; }
二.功能的實現
以下是全文檢索的核心代碼,包括我遇到的錯誤以及解決,包括如何對高亮失效,高亮不全等的解決.
1.查詢條件
TransportClient esClient = esClient(); //獲取先前生成的client BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //生成復合查詢構造器 boolQuery.mustNot( QueryBuilders.matchQuery("",) //字段必須不包含啥 ); boolQuery.should( QueryBuilders.matchQuery(, ) //字段可以包含啥,相當于或者 ); boolQuery.must( QueryBuilders.matchQuery(,) //字段必須包含啥 );
2.高亮條件
//配置標題高亮顯示 HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查詢器 highlightBuilder.field(title); //高亮查詢字段 highlightBuilder.field(content); //高亮查詢字段 highlightBuilder.requireFieldMatch(false); //如果要多個字段高亮,這項要為false highlightBuilder.preTags("<span style=\"color:red\">"); //高亮設置 highlightBuilder.postTags("</span>"); //下面這兩項,如果你要高亮如文字內容等有很多字的字段,必須配置,不然會導致高亮不全,文章內容缺失等 highlightBuilder.fragmentSize(800000); //最大高亮分片數 highlightBuilder.numOfFragments(0); //從第一個分片獲取高亮片段
3.查詢配置
// 根據字段進行排序,這里我根據時間進行倒排 FieldSortBuilder timeSort = SortBuilders.fieldSort("time").order(SortOrder.DESC); //查詢請求生成 SearchRequestBuilder requestBuilder = esClient.prepareSearch(indexname)//索引名字 .setTypes(indextype) //索引類型 .setQuery(boolQuery) //配置查詢條件 .addSort(new ScoreSortBuilder()) //根據查詢相關度進行排序 .addSort(timeSort) //再根據時間進行排序 .setTrackScores(true) //避免分頁之后相關性亂了 .highlighter(highlightBuilder) //配置高亮 .setFrom(from) //設置分頁 .setSize();
4.獲取查詢結果對其高亮
//獲取查詢結果 SearchResponse searchResponse = requestBuilder.get(); List<Map<String, Object>> course = new ArrayList<>(); if(searchResponse.status() != RestStatus.OK){ return course; } for(SearchHit hit:searchResponse.getHits()){ //獲取高亮字段 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField titleField = highlightFields.get(""); HighlightField contentField = highlightFields.get(""); Map<String, Object> source = hit.getSource(); //千萬記得要記得判斷是不是為空,不然你匹配的第一個結果沒有高亮內容,那么就會報空指針異常,這個錯誤一開始真的搞了很久 if(titleField!=null){ Text[] fragments = titleField.fragments(); String name = ""; for (Text text : fragments) { name+=text; } source.put("", name); //高亮字段替換掉原本的內容 } course.add(source); } esClient.close(); //用完記得關閉 return course;
上述就是小編為大家分享的Elasticsearch實現復合查詢高亮結果功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。