上篇講了索引的管理,接着講查詢。
查詢基本代碼
@Autowired
RestHighLevelClient restHighLevelClient;
/**
* @param idxName index
* @param builder 查詢參數
* @param pageNo 查詢參數
* @param pageSize 查詢參數
* @return java.util.List<T>
*/
public Page<Map<String, Object>> searchByPage(String idxName, SearchSourceBuilder builder, int pageNo, int pageSize) {
SearchRequest request = new SearchRequest(idxName);
request.source(builder);
try {
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
Page<Map<String, Object>> resultPage = getSearchResultPage(pageNo, pageSize, response);
return resultPage;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/***
*/
protected Page<Map<String, Object>> getSearchResultPage(int pageNo, int pageSize, SearchResponse response) {
SearchHits hits = response.getHits();
Long totalCount = hits.getTotalHits().value;
Page<Map<String, Object>> page = new Page<>(pageNo, pageSize, totalCount.intValue());
page.setList(getHitList(hits));
return page;
}
查詢條件
構造查詢條件開始
創建一個bool查詢開頭
// 構造查詢條件,使用標準分詞器.
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
加入且查詢條件
類似 sql 語句的且。
queryBuilder.must(QueryBuilders.matchPhrasePrefixQuery("categoryCode", categoryCode));
加入帶或子查詢關係的查詢條件
查詢條件中,可以有嵌套查詢,可以是且可以是或。
// title 和 content 兩個字段or 模糊查詢
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "content")
.analyzer("ik_max_word")
.operator(Operator.OR)
//默認在operator:or 下,這個是設置匹配精度75%
.minimumShouldMatch("75%");
queryBuilder.must(multiMatchQueryBuilder);
加入排序
如果有按某個字段排序需要,則加入排序條件,可以同時多字段排序。
// 排序
List<SortBuilder> sortBuilderList = new ArrayList<>();
SortBuilder sortBuilder = new FieldSortBuilder("publishDate");
sortBuilder.order(SortOrder.ASC);
sortBuilderList.add(sortBuilder);
高亮顯示
有需要高亮顯示時,就可以設置高亮返回的字段。
// 設置高亮,使用默認的highlighter高亮器
HighlightBuilder highlightBuilder = ElasticUtil.createHighlightBuilder("title", "content");
/**
* 構造高亮器
*/
public static HighlightBuilder createHighlightBuilder(String... fieldNames) {
// 設置高亮,使用默認的highlighter高亮器
HighlightBuilder highlightBuilder = new HighlightBuilder()
.preTags("<span style='color:red'>")
.postTags("</span>");
// 設置高亮字段
for (String fieldName : fieldNames) {
//highlightBuilder.field(fieldName);
HighlightBuilder.Field highlightField = new HighlightBuilder.Field(fieldName);
highlightField.highlighterType("unified");
highlightBuilder.field(highlightField);
}
return highlightBuilder;
}