Java中ElasticSearch的几个简单查询

这篇具有很好参考价值的文章主要介绍了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”

java使用es查询,elasticsearch,大数据,搜索引擎

 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子句进行子桶的继续嵌套,指标放在最里面的子桶内。统计各个城市的开门和没开门的快递点平均价格。文章来源地址https://www.toymoban.com/news/detail-738833.html

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

到了这里,关于Java中ElasticSearch的几个简单查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch进阶:多种查询操作,各种ES查询以及在Java中的实现

    目录 前言 1 词条查询 1.1 等值查询-term 1.2 多值查询-terms 1.3 范围查询-range 1.4 前缀查询-prefix 1.5 通配符查询-wildcard 2 复合查询 2.1 布尔查询 2.2 Filter查询 3 聚合查询 3.1 最值、平均值、求和 3.2 去重查询 3.3 分组聚合 3.3.1 单条件分组 3.3.2 多条件分组 3.4 过滤聚合 ElasticSearch 第一篇

    2024年02月02日
    浏览(39)
  • 【ElasticSearch】ES自动补全查询与Java接口实现

    自动补全就是当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项。 要实现根据字母做补全,就必须对文档按照拼音分词。GitHub上有相关插件,地址:https://github.com/medcl/elasticsearch-analysis-pinyin,下载和ES对应的版本。 安装步骤: 解压 上传到虚拟机中,elasti

    2024年02月15日
    浏览(31)
  • ElasticSearch进阶:一文全览各种ES查询在Java中的实现

    ElasticSearch进阶:一文全览各种ES查询在Java中的实现 es基本语句详解 查询语句详解 ElasticSearch第一篇: ElasticSearch基础:从倒排索引说起,快速认知ES 完整项目已上传至:ElasticSearch Demo 项目,该项目是关于springboot的集成项目,ElasticSearch部分请关注【elasticSearch-demo】模块。觉得

    2024年02月02日
    浏览(42)
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果  三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧  总结         也许在您的工作当中会碰到如下的一些场景,比

    2024年02月16日
    浏览(35)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(54)
  • 【ES】Elasticsearch 常见的简单查询

    查看es中有哪些索引 请求方式:GET 请求地址: http://localhost:9200 /_cat/indices?v 参数:无 结果: 查看索引全部数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 参数: 结果:  查询多1个数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 解释:http:

    2024年02月07日
    浏览(29)
  • java直接使用dsl语句查询ES

    2024年02月03日
    浏览(29)
  • es使用java来查询文档(基于es7.8)

    注意,索引的字段mapping是如下类型,如果index是FALSE的话,会导致条件查询失败: 先引入pom依赖: 创建User类: 然后在名为user的索引里,插入多条数据,在main方法里进行测试: 然后进行测试:

    2024年02月11日
    浏览(34)
  • 使用java来查询es索引(基于es7.8)

    1、先引入pom依赖: 2、然后在main方法里进行测试: 运行一下,打印结果跟在postman里执行出来是一样的: 后面会根据字段进行条件查询,所以在建立映射的时候,需要指定index属性为true。如下图,在postman创建映射:

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包