ElasticSearch integrates the most comprehensive query tutorial in SpringData history

1. Briefly introduce
springboot to use springdata to operate es, and ElasticsearchRepository to use QueryBuilder to construct query conditions

2. Integrated 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. Query all data matchAllQuery **

Used by matchAllQuery query: equivalent to select * from in sql. Of course, in addition to using QueryBuilder, the findAll method of ElasticsearchRepository also queries all.

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 field matching query

matchQuery can be simply understood as like in mysql, because when using matchQuery query in elasticsearch, it will segment the query field. Of course, the mapping of the field we query must be of text type, and the entries passed to the match query will be processed by the same analyzer when indexing

  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

Compared with other available queries, query_string query supports all Apache Lucene query syntax for multi-field query_string query

 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. Wildcard query wildcardQuery

Match multiple characters,? Match 1 character to avoid the beginning, it will retrieve a lot of content and cause slow efficiency

   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. Term query termQuery

A term query is a simple query in Elasticsearch. It only matches documents that contain the term in the given field, and the exact, unanalyzed term is equivalent to "=" in the SQL statement. Using this search is generally equivalent to the mapping of the keyword in the index search. term query is a filter query that can handle numbers (numbers), Boolean values ​​(Booleans), dates (dates) and text (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. Query ID (identifier query) 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. Similarity query fuzzyQuery

The fuzzy query is the third type of fuzzy query, which matches documents based on the edit distance algorithm

    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. Range query rangeQuery

Range queries allow us to find documents where a field value is within a certain range. Fields can be numeric or string-based

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. Combined query (complex query)

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. Compound query + sorting

 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. Compound query + sorting + pagination

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. Compound query + sorting + page highlighting

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

​Follow
my WeChat public account

**INSERT PICTURE DESCRIPTION HERE**

​​​

Guess you like

Origin blog.csdn.net/CharlesYooSky/article/details/120331397