Java中ElasticSearch的几个简单查询

1 term查询

单值查询,代表完全匹配,类似于mysql中的 = 。在搜索前不会对关键字进行分词,直接去文档分词库匹配。筛选出一个字段等于特定值的所有记录。

会对查询结果进行打分(score),分值越高的数据排名越靠前。

在SQL中:

select * from Chine where address = '北京';

 ES中的查询有很大差别,它把sql中的一条数据变成了一个文档

GET /China/_search
{
    "query": {
        "term": {
            "address": {
                 "value":"北京"           
             }
        }
    }
}

Java中用ES查询: 

//索引创建查询请求
SearchRequest request = new SearchRequest("China");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//创建查询语句
searchSourceBuilder.query(QueryBuilders.termQuery("address", "北京"));
request.source(searchSourceBuilder);
SearchResponse response = client.search(request, RequestOption.DEFAULT);

2 terms查询

多值查询,和term的查询机制是一样的,不会分词,直接词库匹配。类似于sql里的in查询。terms是在针对一个字段包含多个值的时候使用。

同term一样也会进行打分。

比如,想查询 address 字段中包含关键词 “北京” 或 “天津” 的文档

SQL:

select * from China where address in ('北京', '天津')

 ES:

GET /China/_search
{
    "query": {
        "terms": {
            "address": ["北京", "天津"]
        }
    }
}

Java查询条件:

SearchSourceQuery searchSourceQuery = new SearchSourceQuery();
//构建查询条件
searchSourceQuery.query(QueryBuilders.termsQuery("address","北京","天津"));

就是在北京和天津中间加了个or

3 range查询

范围查询,针对数值类型和日期类型,对某个field进行范围指定,的在查询中能使用gt:>      gte:>=     lt:<     lte:<=。

SQL:

select * from China where distance between 10 and 20

ES:

GET /China/_search
{
    "query":{
        "range":{
             "distance":{
                    "to":10,
                    "from":20
             }  
         }    
    }
}

Java查询条件:

searchSourceBuilder.query(QueryBuilders.rangeQuery("distance").gte(10).lte(20))

 4 复合查询(布尔查询)

这可能是今后用的最频繁的查询方式了,它将多个子查询组合成一个布尔表达式(将多个查询查询条件,以一定逻辑组合在一起),子查询间的逻辑关系是“与”,只有子查询的结果都为“true”时,布尔查询的结果才为“true”

 must:=;should:or;must not:不匹配条件中的,not;filter:前三个都是看匹配程度,它关注是否匹配,不会进行打分

当涉及到要过滤多个子段时:

select * from China where express_delivery = '顺丰' and address = '北京';

 ES:

GET /China/_search
{
    "bool":{
        "must":[
            "term":{
                "express_delivery":{
                    "value":"顺丰"
                }
            },
            "term":{
                "address":{
                    "value":"北京"
                }
            }
        ]
    }
}

Java查询条件:

searchSourceBuilder.must(QueryBuilders.term("express_delivery","顺丰"));
searchSourceBuilder.must(QueryBuilders.term("address","北京"));

//添加上另两种方式的查询
//查除了北京之外的城市
searchSourceBuilder.mustnot(QueryBuilders.term("address","北京"));

//查北京或天津
searchSourceBuilder.should(QueryBuilders.term("address","北京"));
searchSourceBuilder.should(QueryBuilders.term("address","天津"));

 5 聚合查询

5.1 简单聚合

使用aggs来标记聚合语句

ES格式为:

GET /China/_search
{
  "aggs": {
    "NAME": {
      "AGG_TYPE": {}
    }
  }
}

AGG_TYPE的取值类型有:平均值avg,最大值max,最小值min,加和值sum,基础统计stats,统计非空个数value_count

比如max:

GET /China/_search
{
  "aggs":{
    "my_distance":{
      "max": {
        "field": "distance"
      }
    }
  }
}

在Java中:

SearchRequest searchRequest = new SearchRequest("China");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 聚合查询条件
AggregationBuilder aggsBuilder = AggregationBuilders.max("my_distance").field("distance");
// 将聚合查询条件构建到SearchSourceBuilder中
searchSourceBuilder.aggregation(aggsBuilder);

 其它的修改一下就好了

AggregationBuilder aggsBuilder = AggregationBuilders.min("my_distance").field("distance");
AggregationBuilder aggsBuilder = AggregationBuilders.avg("my_distance").field("distance");
AggregationBuilder aggsBuilder = AggregationBuilders.count("my_distance").field("distance");
 5.2 单维度桶聚合

可以看作是单条件分组

比如查询每个城市有多少快递收货点:

select point,count(id) from China group by address
GET /China/_search
{ 
  "aggs": {
    "my_agg": {
      "terms": {
        "field": "address"
      }
    }
  }
}
AggregationBuilder aggsBuilder = AggregationBuilders.terms("my_agg").field("address");
5.3 多维度桶嵌套聚合 

ES支持嵌套桶聚合,进行嵌套时,可以使用aggs子句进行子桶的继续嵌套,指标放在最里面的子桶内。统计各个城市的开门和没开门的快递点平均价格。

GET /China/_search
{
  "size": 0,
  "aggs": {
    "my_city": {
      "terms": {
        "field": "address"
      },
      "aggs": {
        "be_besiness": {
          "terms": {
            "field": "opening"
          },
          "aggs": {
            "my_sum": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值