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();
    }
 
原文地址:https://www.cnblogs.com/huqi96/p/14881593.html