elasticsearch 嵌套查询


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 层

@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=南天门))
发布了320 篇原创文章 · 获赞 91 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43931625/article/details/103851244