elasticsearch 嵌套查询
********************************
相关类
QueryBuilders:查询构造类
public final class QueryBuilders {
public static NestedQueryBuilder nestedQuery(String path, QueryBuilder query, ScoreMode scoreMode) {
ScoreMode:打分模式
public enum ScoreMode {
None,
Avg,
Max,
Total,
Min;
private ScoreMode() {
}
}
********************************
示例
**************************
pojo 层
Student
@Data
@Document(indexName = "student")
public class Student {
@Id
private Integer id;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Nested)
private School school;
}
School
@Data
@Document(indexName = "school")
public class School {
@Id
private Integer id;
@Field(type = FieldType.Keyword)
private String name;
}
**************************
controller 层
StudentController
@RestController
public class StudentController {
@Resource
private StudentRepository studentRepository;
@RequestMapping("/save3")
public String save(){
for (int i=0;i<10;i++){
Student student=new Student();
student.setId(i);
student.setName("瓜田李下 "+i);
student.setAge(i%10+2);
School school=new School();
switch (i%3){
case 0: {
school.setId(i);
school.setName("南天门");
} break;
case 1: {
school.setId(i);
school.setName("北天门");
} break;
case 2: {
school.setId(i);
school.setName("冬天门");
} break;
}
student.setSchool(school);
studentRepository.save(student);
}
return "success";
}
@RequestMapping("/get5")
public List<Student> get(){
QueryBuilder queryBuilder= QueryBuilders.nestedQuery("school",
QueryBuilders.termQuery("school.name","南天门"), ScoreMode.Avg);
NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
List<Student> list= studentRepository.search(nativeSearchQuery).getContent();
list.forEach(System.out::println);
return list;
}
@RequestMapping("/get6")
public List<Student> get2(){
QueryBuilder queryBuilder=QueryBuilders.nestedQuery("school",
QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("school.name","南天门"))
.must(QueryBuilders.rangeQuery("school.id").gte(5)),ScoreMode.Avg);
NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
List<Student> list= studentRepository.search(nativeSearchQuery).getContent();
list.forEach(System.out::println);
return list;
}
}
********************************
控制台输出
/get5
Student(id=3, name=瓜田李下 3, age=5, school=School(id=3, name=南天门))
Student(id=9, name=瓜田李下 9, age=11, school=School(id=9, name=南天门))
Student(id=0, name=瓜田李下 0, age=2, school=School(id=0, name=南天门))
Student(id=6, name=瓜田李下 6, age=8, school=School(id=6, name=南天门))
/get6
Student(id=9, name=瓜田李下 9, age=11, school=School(id=9, name=南天门))
Student(id=6, name=瓜田李下 6, age=8, school=School(id=6, name=南天门))