1. 程式人生 > 其它 >ElasticSearch整合SpringData史上最全查詢教程

ElasticSearch整合SpringData史上最全查詢教程

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);
    }


關注我的微信公眾號

​​​