zoukankan      html  css  js  c++  java
  • es的QueryBuilder学习使用

    1.pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>elasticsearch</name>
        <description>Demo project for Spring Boot</description>
        <properties>
    
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter</artifactId>
                <version>RELEASE</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    2.application.yml

    spring:
      data:
        elasticsearch:
          cluster-nodes: 127.0.0.1:9300
          cluster-name: elasticsearch
          repositories:
            enabled: true

    3.测试代码

    1.bean层
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Document(indexName = "student",type = "_doc")
    public class Student {
        @Id
        private Integer id;
        @Field(type = FieldType.Keyword)
        private String name;
        @Field(fielddata = true)
        private String age;
    
    }
    2.must的是使用(must是必须包含的)
           BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            // 不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到
            boolQueryBuilder.must(QueryBuilders.termQuery("name.keyword","胡琪"));
            Iterable<Student> list = dao.search(boolQueryBuilder);
            for(Student s:list){
                System.out.println(s);
            }
    3.mustNot的使用(mustMot不能包含的查询条件)
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    // mustNot QueryBuilders.termQuery()在这其中的分词数据需要排除,name.keyword完全匹配
    boolQueryBuilder.mustNot(QueryBuilders.termQuery("name.keyword","胡琪"));
    Iterable<Student> list = dao.search(boolQueryBuilder);
    for(Student s:list){
    System.out.println(s);
    }
    3.QueryBuilders.wildcardQuery对分词进行模糊匹配
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    // QueryBuilders.wildcardQuery对分词进行模糊匹配
    boolQueryBuilder.must(QueryBuilders.wildcardQuery("name","*胡*"));
    Iterable<Student> list = dao.search(boolQueryBuilder);
    for(Student s:list){
    System.out.println(s);
    }

    4.RangeQueryBuilder范围查询,对age进行范围查询

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(QueryBuilders.wildcardQuery("name","*漫*"));
    // RangeQueryBuilder范围查询,对age进行范围查询
    RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
    rangeQueryBuilder.gte(12);
    rangeQueryBuilder.lte(12);
    boolQueryBuilder.must(rangeQueryBuilder);
    Iterable<Student> list = dao.search(boolQueryBuilder);
    for(Student s:list){
    System.out.println(s);
    }

    模糊、分页、排序查询(对应的排序字段要设置@Field(fielddata = true),有的版本设置不起作用,当时Integer类型有用
    /**
         * 模糊、分页、排序查询
         *
         * @param id
         * @param name
         * @param pageindex 页码
         * @param pageSize  每页多少条
         * @return
         */
        public List<Student> getLikeUser( int id,
                                       String name,
                                       int pageindex,
                                       int pageSize) {
            //检索条件
            BoolQueryBuilder bqb = QueryBuilders.boolQuery();
            if (id != 0)
               bqb.must(QueryBuilders.matchPhraseQuery("id", id));
            if (!Strings.isEmpty(name))
                // matchPhraseQuery("name.keyword", name) 不分词,不加keyword可分词,不分词用matchQuery
                bqb.must(QueryBuilders.matchPhraseQuery("name", name));
            //排序条件
            FieldSortBuilder fsb = SortBuilders.fieldSort("age").order(SortOrder.DESC);
            //分页条件
            pageindex = pageindex == 0 ? 1 : pageindex;
            pageSize = pageSize == 0 ? 10 : pageSize;
            Pageable pageable = PageRequest.of(pageindex - 1, pageSize);
            //构建查询
            SearchQuery query = new NativeSearchQueryBuilder()
                    .withQuery(bqb)
                    .withSort(fsb)
                    .withPageable(pageable)
                    .build();
            Page<Student> searchResponse = dao.search(query);
    
            return searchResponse.getContent();
        }
     
  • 相关阅读:
    24.Spring-Boot-Actuator与Spring-Security整合应用
    Spring Boot 和 Spring 到底有啥区别?用了这么久,你知道吗?
    一文,5 分钟搞明白 MySQL 是如何利用索引的!
    大厂面试必问的Spring全家桶 4 大开源框架,思维脑图全总结,终于出来了
    这些SQL错误用法,如果经常犯,说明你的水平还很low...
    新技能 MyBatis 千万数据表,快速分页!
    牛逼!在IDEA里搞Spring Boot Mybatis反向工程,太爽咯~
    有了 HTTP 协议,为什么还要 RPC 协议,两者有什么区别?
    把 Spring Cloud 给拆了!详解每个组件的作用,值得收藏!
    27个阿里 Java 开源项目,值得收藏!
  • 原文地址:https://www.cnblogs.com/huqi96/p/14881593.html
Copyright © 2011-2022 走看看