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