ES7預設自帶了中文分詞,根據實際情況,可自選擇配置分詞政策
//1、索引庫
SearchRequest searchRequest = new SearchRequest("resource");
//2、查詢條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
//資源類型type是精确比對
.must(QueryBuilders.termQuery("type", type));
if(StringUtils.isNotEmpty(code)) {
//樹編碼是字首比對
boolQueryBuilder.must(QueryBuilders.matchPhrasePrefixQuery("code", code));
}
boolean havKeywords = StringUtils.isNotEmpty(keywords);
if(havKeywords) {
//關鍵字多字段分詞比對:搜尋範圍字段(分詞)
String[] searchFields = {"name","pName","source","scope","desc","fieldNames"};
BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery()
.should(QueryBuilders.multiMatchQuery(keywords, searchFields));
boolQueryBuilder.must(boolQueryBuilder2);
//3、設定高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("name");
highlightBuilder.field("pName");
highlightBuilder.field("source");
highlightBuilder.field("scope");
highlightBuilder.field("desc");
highlightBuilder.field("fieldNames");
//設定高亮前置标簽,設定紅色
highlightBuilder.preTags("<span style='color:red'>");
//設定高亮後置标簽
highlightBuilder.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
}
//排序 2審批時間排序
if(sortType == 2) {
searchSourceBuilder.sort("approvalTime.keyword",SortOrder.DESC);
}
//3、執行查詢
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.from(from);
searchSourceBuilder.size(size);
searchSourceBuilder.timeout(new TimeValue(10000));
searchSourceBuilder.trackTotalHits(true);
searchRequest.source(searchSourceBuilder);
try {
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//通過發送初始搜尋請求來初始化搜尋上下文
searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
map.put("total",searchResponse.getHits().getTotalHits().value);
SearchHit[] rows = searchResponse.getHits().getHits();
for(SearchHit row : rows) {
Map<String,Object> rowMap = row.getSourceAsMap();
Map<String, HighlightField> highlightFields = row.getHighlightFields();
rowMap.put("fieldNames", "");
for(String highlightField : highlightFields.keySet()) {
//高亮值,預設取第一個即可
String val = highlightFields.get(highlightField).getFragments()[0].toString();
if("fieldNames".equals(highlightField)) {
//有關鍵字輸入才查詢傳回該字段
if(havKeywords) {
String[] fieldVals = val.split(",");
List<String> resultFields = new ArrayList<String>();
for(String field : fieldVals) {
if(field.contains("</span>")) {
resultFields.add(field);
}
}
val = StringUtils.join(resultFields.toArray(), ",");
rowMap.put(highlightField, val);
}
}
rowMap.put(highlightField, val);
}
list.add(rowMap);
}
map.put("list",list);