ElasticSearch查询之bool查询及java调用bool查询demo

elasticsearch 同时被 2 个专栏收录
5 篇文章 0 订阅
34 篇文章 0 订阅

其实之前关于ElasticSearch的一些书,感觉对于查询是有点懵逼的,一会查询,一会过滤查询。而且有的语法在6.x的版本上已经废弃了。所以看起来更加困惑了。五一这两天又静下心来看了一些,感觉像我平时的一些基本使用,用bool查询都可以满足,而且当你理解了bool查询之后,用java来调用es也会比较得心应手。

一、kibana es 查询:如下例子都是以6.x的版本

bool查询如下:

GET /cartoonindex/_search/
{
    "query": {
      "bool": {
        "must": [
          {
            "multi_match": {
              "query": "人 忍者",
              "fields": ["name","introduction"],
              "operator": "or"
            }
          },
          {
            "range": {
              "time": {
                "gte": "2009-09-30",
                "lte": "2010-09-30"
              }
            }
          }
        ]
      }
    }
}

如上是我本地es的一个bool查询,boot查询主要包括三个部分,must,should,must_not,分别对应类似数据库查询and,or,"非"

比如在must中,又是一个中括号,类似于数组,表示里面又可以写多个查询条件。

如上截图中的查询,查询条件就是查询name和introduction字段中,包含“人”或者“忍者”的记录,且时间是在"2009-09-30"和“2010-09-30”

二、java接口实现如上调用:

其实搞清楚了如上的es查询语句,再用java去调用也会比较有的放矢。

如下代码主要包括两个部分:

1、构建查询语句

2、执行查询

@ResponseBody
@RequestMapping("/searchCartonBool")
public List<Carton> searchCartonBool(String keyWord){
    BoolQueryBuilder catronBoolquery = QueryBuilders.boolQuery();
    if (!StringUtils.isEmpty(keyWord)) {
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyWord, new String[]{"name", "introduction"});
        multiMatchQueryBuilder.operator(Operator.OR);//默认是"or",如果修改成"and",则表示记录中要同时包含条件
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time");
        rangeQueryBuilder.gte("2009-09-30");
        rangeQueryBuilder.lte("2010-09-30");
        catronBoolquery.must(multiMatchQueryBuilder);//将第一个条件插入到must
        catronBoolquery.must(rangeQueryBuilder);//将第二个根据时间筛选的条件插入到must
    }
    System.out.println(catronBoolquery);//打印查询语句
    SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(catronBoolquery).build();//执行查询
    List<Carton> cartons = elasticsearchTemplate.queryForList(searchQuery, Carton.class);
    System.out.println(cartons);
    return cartons;
}

postman返回结果:

搞清楚这个bool查询,再看这个java调用的代码感觉就清晰多了,而且查询再变化,也大概了解要调用哪些方法。

如上只是我这个初学者的有些理解,如有问题还请各位指出,谢谢

 

  • 2
    点赞
  • 1
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值