springBoot集成es(三)spring-data集成es与常用查询操作

接着上一篇博客,看下spring-data集成es的常用查询操作(这里只写serviceImpl部分代码):ElasticsearchRepository使用QueryBuilder构造查询条件 :Iterable<T> search(QueryBuilder var1);

官网介绍:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-query-builders.html

一、单条件查询:

1、matchAllQuery 查询所用:相当于sql中的select * from 。当然,除了使用QueryBuilder,ElasticsearchRepository的findAll方法也是查询所有。

//查询全部列表,方法1
    @Override
    public Iterable<UserDTO> getAll() {
        return userRepository.findAll();
    }

  
  //查询全部列表,方法2
    @Override
    public Iterable<UserDTO> getAll1() {
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        return iterable;
    }

 2、matchQuery 匹配查询:matchQuery可以简单理解为mysql中的like,因为在elasticsearch中使用matchQuery查询时,他会对查询的field进行分词。当然我们进行查询的这个field的mapping必须是text类型。

 //条件查询
    @Override
    public List<UserDTO> getByName(String name) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", name);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    

3、matchPhraseQuery短语搜索:相当于sql的=查询,与matchQuery的区别在于,matchPhraseQuery查询不会被分词,而是直接以一个短语的形式查询,而如果你在创建索引所使用的field的value中没有这么一个短语(顺序无差,且连接在一起),那么将查询不出任何结果。

//条件短语查询
    @Override
    public List<UserDTO> getByNamePhrase(String name) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("name", name);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

   

4、termQuery等值搜索:相当于sql语句中的“=”,使用这个搜索一般是对索引中keyword的mapping进行等值搜索。term query 属于过滤器查询,可以处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。

(1)数字:

单个:

QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}", "${fieldValue}");

批量:

QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}", "${fieldValues}");
//根据年龄查询,等值查询
    @Override
    public List<UserDTO> termByAge(String age) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder queryBuilder = QueryBuilders.termQuery("age", age);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

   http://localhost:9999/es/user/termByAge?age=3查询出:

    

(2)字符串:

    单个:

QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}.keyword", "${fieldValue}");

    批量:

QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}.keyword", "${fieldValues}");
@Override
    public List<UserDTO> termByName(String name) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder queryBuilder = QueryBuilders.termQuery("name.keyword", name);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

  http://localhost:9999/es/user/termByName?name=测试7 查询出:

   

5、prefixQuery前缀搜索

二、组合(多条件)查询:boolQuery 组合查询条件:boolQuery用来将搜索的条件进行组合,即将多个组合条件组合在一起,常用的几种组合方式有must(and,必须匹配)、should(or,或者)、mustNot(!=,必须不匹配)。

1、select * from wtyy where name = '测试7' and address like '%地址%'

 //组合查询,根据name、address查询
    @Override
    public List<UserDTO> getByNameAndAddress(String name, String address) {
        List<UserDTO> list = new ArrayList<>();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.must(QueryBuilders.matchPhraseQuery("name",name));
        queryBuilder.must(QueryBuilders.matchQuery("address",address));
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

   

2、select * from wtyy where name = '测试7' or address like '%地址%'

//组合查询,根据name、address查询
    @Override
    public List<UserDTO> getByNameAndAddress(String name, String address) {
        List<UserDTO> list = new ArrayList<>();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.should(QueryBuilders.matchPhraseQuery("name",name));
        queryBuilder.should(QueryBuilders.matchQuery("address",address));
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    

3、select * from wtyy where name = '测试7' and address not  like '%地址%'

//组合查询,根据name、address查询
    @Override
    public List<UserDTO> getByNameAndAddress(String name, String address) {
        List<UserDTO> list = new ArrayList<>();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.must(QueryBuilders.matchPhraseQuery("name",name));
        queryBuilder.mustNot(QueryBuilders.matchQuery("address",address));
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    

4、select * from wtyy where ( name like  '%测试7%' and address  like '%地址%' ) and age !=3

@Override
    public List<UserDTO> getByNameAddressAge(String name, String address, String age) {
        List<UserDTO> list = new ArrayList<>();
        BoolQueryBuilder inner = QueryBuilders.boolQuery();
        BoolQueryBuilder out = QueryBuilders.boolQuery();
        inner.should(QueryBuilders.matchQuery("name", name))
                .should(QueryBuilders.termQuery("address", address));
        out.must(inner)
                .mustNot(QueryBuilders.termQuery("age", age));
        Iterable<UserDTO> iterable = userRepository.search(out);
        iterable.forEach(e->list.add(e));
        return list;
    }

    

三、范围查询:rangeQuery,range query可以处理数字(numbers)、日期(dates)以及字符串,不过字符串还是不要用范围查询的好,效率会很低。

1、闭区间查询:select * from wtyy where age >=2 and age <=4:

 @Override
    public List<UserDTO> getByAge(String age1, String age2) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
                .from(age1).to(age2);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

   

2、开区间查询:select * from wtyy where age >2 and age <4:

 @Override
    public List<UserDTO> getByAge(String age1, String age2) {
        List<UserDTO> list = new ArrayList<>();
        QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
                .from(age1,false).to(age2,false);
        Iterable<UserDTO> iterable = userRepository.search(queryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

     

3、大于:select * from wtyy where age >1

QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
               .gt(age);

4、大于等于:select * from wtyy where age >=1

QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
               .gte(age1);

5、小于:select * from wtyy where age <4

QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
               .lt(age1);

6、小于等于:

QueryBuilder  queryBuilder = QueryBuilders.rangeQuery("age")
               .lte(age1);

7、多条件查询:

QueryBuilder qb1 = QueryBuilders.moreLikeThisQuery(new String[]{"${fieldName1}"}, new String[]{"${fieldValue1}"}, null);
QueryBuilder qb2 = QueryBuilders.rangeQuery("${fieldName2}").gt("${fieldValue2}");
QueryBuilder qb3 = QueryBuilders.boolQuery().must(qb1).must(qb2);

四、高亮查询:

五、分页查询:

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值