1、簡單介紹
springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder構造查詢條件
2、集成es
//maven集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
//實現ElasticsearchRepository
public interface NewsInfoRepository extends ElasticsearchRepository<NewInfoItem,Long> {
}
**3、 查詢所有數據matchAllQuery **
matchAllQuery 查詢所用:相當於sql中的select * from 。當然,除了使用QueryBuilder,ElasticsearchRepository的findAll方法也是查詢所有。
public RestResult queryAll() {
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
List<NewInfoItem> resultList = new ArrayList<>();
Iterable<NewInfoItem> search = this.newsInfoRepository.search(queryBuilder);
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
4、matchQuery字段匹配查詢
matchQuery可以簡單理解為mysql中的like,因為在elasticsearch中使用matchQuery查詢時,他會對查詢的field進行分詞。當然我們進行查詢的這個field的mapping必須是text類型,傳給match查詢的詞條將被建立索引時相同的分析器處理
public RestResult matchQuery(String title) {
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", title);
//多字段進行匹配
//MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(title, "title", "name");
Iterable<NewInfoItem> search = this.newsInfoRepository.search(matchQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
5、query_string查詢
相比其他可用的查詢,query_string查詢支持全部的Apache Lucene查詢語法針對多字段的query_string查詢
public RestResult queryString(String field) {
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(field);
List<NewInfoItem> resultList = new ArrayList<>();
Iterable<NewInfoItem> search = this.newsInfoRepository.search(queryBuilder);
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
6、通配符查詢wildcardQuery
匹配多個字符,?匹配1個字符 避免 開始, 會檢索大量內容造成效率緩慢
public RestResult wildcardQuery(String field) {
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("title", "故事*");
Iterable<NewInfoItem> search = this.newsInfoRepository.search(wildcardQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
7、 詞條查詢termQuery
詞條查詢是Elasticsearch中的一個簡單查詢。它僅匹配在給定字段中含有該詞條的文檔,而且是確切的、未經分析的詞條相當於sql語句中的“=”,使用這個搜索一般是對索引中keyword的mapping進行等值搜索。term query 屬於過濾器查詢,可以處理數字(numbers)、布爾值(Booleans)、日期(dates)以及文本(text)。
public RestResult termQuery(String title) {
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", title);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(termQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
8、查詢ID(標識符查詢)idsQuery
public RestResult queryIdsQ(String id) {
//可以添加多個id
IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds(id);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(idsQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
9、相似度查詢fuzzyQuery
fuzzy查詢是模糊查詢中的第三種類型,它基於編輯距離算法來匹配文檔
public RestResult fuzzyQuery(String str) {
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("title", str);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(fuzzyQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
10、范圍查詢rangeQuery
范圍查詢使我們能夠找到在某一字段值在某個范圍里的文檔,字段可以是數值型,也可以是基於字符串的
public RestResult rangeQuery(String str) {
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(10).to(20);
//大於:select * from wtyy where age >1
QueryBuilder queryBuilder1 = QueryBuilders.rangeQuery("age").gt(str);
//大於等於:select * from wtyy where age >=1
QueryBuilder queryBuilder2 = QueryBuilders.rangeQuery("age").gte(str);
//小於:select * from wtyy where age <4
QueryBuilder queryBuilder3 = QueryBuilders.rangeQuery("age").lt(str);
//小於等於
QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("age").lte(str);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(rangeQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
11、 組合查詢(復雜查詢)
must(QueryBuilders) : AND
mustNot(QueryBuilders): NOT
should(QueryBuilders):OR
public RestResult multiQuery(String title, String stockCode) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode));
Iterable<NewInfoItem> search1 = this.newsInfoRepository.search(boolQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search1.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
12、復合查詢+排序
public RestResult sortQuery(String title, String stockCode) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));
Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
13、復合查詢+排序+分頁
public RestResult pageQuery(String title, String stockCode, Integer pageNum, Integer pageSize) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC))
.withPageable(PageRequest.of(pageNum, pageSize));
Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
14、復合查詢+排序+分頁 高亮顯示
public RestResult pageQuery(String title, Integer pageNum, Integer pageSize) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
String preTag = "<font color='#dd4b39'>";//google的色值
String postTag = "</font>";
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", title)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC))
.withHighlightFields(new HighlightBuilder.Field("stockCode").preTags(preTag).postTags(postTag))
.withPageable(PageRequest.of(pageNum, pageSize));
Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}
關注我的微信公眾號