Elasticsearch 基本使用(二)简单查询 & 嵌套查询

简单查询

按id查询单条记录

GET bank/_doc/1

在这里插入图片描述

查询所有数据

  • 默认只查询10条记录
GET bank/_search
{
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

  • 设置分页条件
GET bank/_search
{
  "query": {
  # 无条件查询
    "match_all": {}
  },
  # 偏移量,从第一条开始查
  "from": 0,
  # 记录条数
  "size": 1000
}

设置排序

两种设置方式

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "字段名": "asc"
    },
    {
      "字段名": {
        "order": "desc/asc"
      }
    }
  ]
}

注意:_id 为字符串,其排序方式为按位比较,并非数值大小

filter 过滤

在 bool 查询内,可以使用 filter 对数据进行过滤。
单从最终数据来看,filter 也是用于过滤数据,用于条件查询。
不同点在于,filter 查询的结果不进行评分,但也不影响bool查询内其他查询的评分结果。

# 查询 age = 10 & province = 600 的数据
# 使用 filter 过滤,filter 仅过滤数据,而不进行评分,当然也不影响 使用 query 内其他查询的评分结果
GET /stu/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "address",
            "query": {
              "term": {
                "address.province": {
                  "value": "600"
                }
              }
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "age": 10
          }
        }
      ]
    }
  }
}

查询数组内的值查询

ES没有数组一说,对数组值的查询就像普通值那样查询即可。
数组内其中一项匹配就算成功
terms:在多个条件值里面匹配,匹配上一个就算成功。
term:只能传一个条件值,不分词的字段值 或者 数组内某项字段值 或者 字段分词后的词典 匹配上这个值就算成功。
直接匹配数组字段,只要匹配上数组内任一项(或者关系)就算成功;
如果要同时匹配数组内多个值,可以使用bool must 对多个值进行(与关系匹配)

# 查询 hobbies 包含 swimming 或者 music 的数据
GET /stu/_search
{
  "query": {
    "terms": {
      "hobbies": [
        "movie",
        "music"
      ]
    }
  }
}

可以查到以下数据


      {
        "_index" : "stu",
        "_type" : "_doc",
        "_id" : "jjoE7YgBKFUjhQBi3mz1",
        "_score" : 1.0,
        "_source" : {
          "id" : 2,
          "name" : "李四",
          "age" : 20,
          "hobbies" : [
            "music",
            "speaking",
            "drive"
          ],
          "address" : [
            {
              "province" : "500",
              "city" : "025",
              "county" : "1993"
            },
            {
              "province" : "502",
              "city" : "027",
              "county" : "1999"
            }
          ]
        }
      },
      {
        "_index" : "stu",
        "_type" : "_doc",
        "_id" : "jzoE7YgBKFUjhQBi_2zu",
        "_score" : 1.0,
        "_source" : {
          "id" : 3,
          "name" : "张三四",
          "age" : 30,
          "hobbies" : [
            "movie",
            "book",
            "swimming"
          ],
          "address" : [
            {
              "province" : "600",
              "city" : "021",
              "county" : "1887"
            },
            {
              "province" : "601",
              "city" : "073",
              "county" : "1953"
            }
          ]
        }
      }
    

嵌套查询

有时,我们查询的条件字段不在最外层;此时需要使用嵌套查询

  • 如果多个条件是在一个 nested 字段内,则可以在netsted 内的query 中使用 bool 查询
  • 如果多个条件不在同一个 nested 字段内,则在外层query中使用 bool 查询

查询一个外层条件字段 内的嵌套字段

GET xxx_index/_search
{
  "query": {
  	# 嵌套查询,其他字段该怎么查怎么查,如果还有不属于这个嵌套字段的其他条件,依然使用 bool ,处理
    "nested": {
      "path": "外层字段名",
      # 基于这个path,当前的层级,再写一个 普通的query
      "query": {
        "bool": {
        	# 多条件
          "must": [
            {
              "term": {
                "外层字段名.内层字段名1": 条件值1
              }
            },
            {
              "match_phrase": {
                "外层字段名.内层字段名2": 条件值2
              }
            }
          ]
        }
      }
    }
  }
}

查询多个条件,其中有嵌套字段

# 一个嵌套字段 & 一个普通字段
GET xxx_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "外层字段名1",
            "query": {
              "term": {
                "外层字段名1.内层字段名1": 条件值1
              }
            }
          }
        },
        {
          "match": {
            "外层字段名2": " 条件值2"
          }
        }
      ]
    }
  }
}

如果还有,其他外层字段,依旧在 外层 bool 里面加条件。

自定义查询字段

返回指定字段
{
  "_source": [
    "字段名",
    "字段名.属性名",
    "字段名.*"
  ],
  "query": {
    xxxx
  }
}

{
  "_source": {
    "includes": [
      "字段名",
	  "字段名.属性名",
	  "字段名.*"
    ]
  },
  "query": {
    xxx
  }
}
不显示字段
{
  "_source": false,
  "query": {
    xxxx
  }
}
排除指定字段
{
  "_source": {
    "exclude": [
      "字段名",
	  "字段名.属性名",
	  "字段名.*"
    ]
  },
  "query": {
    xxxx
  }
}
### 回答1: Java ESElasticsearch)聚合查询是一种在Java开发中使用Elasticsearch进行聚合分析的方法。 聚合查询是指对数据进行统计分析,例如计算最大值、最小值、平均值、总和等。Java ES提供了丰富的聚合查询功能,可进行多层次、多字段的聚合计算。 在Java中使用Elasticsearch进行聚合查询,首先需要创建一个Elasticsearch客户端连接,获取到与Elasticsearch集群的通信管道。 然后,使用Java代码构建聚合查询请求。聚合查询的请求是基于JSON结构的DSL查询语言,可以使用Java提供的相关工具类来构建查询请求。 聚合查询请求中包含了聚合的类型(例如求和、平均值等)、聚合的字段、聚合的范围(例如按某个字段进行分组)等参数。 构建好查询请求后,通过客户端发送请求到Elasticsearch集群,并获取返回的查询结果。 最后,解析返回的查询结果,获取到聚合计算的结果数据,可以进一步进行业务处理或展示。 通过Java ES聚合查询,我们可以灵活地对大规模数据进行聚合分析,从中挖掘出有价值的信息,为业务决策提供支持。同时,Java ES的分布式计算能力也保证了聚合查询在大规模数据集上的高效执行。 总之,Java ES聚合查询是一种使用Java语言与Elasticsearch集群进行交互,进行多维度、多层次聚合计算的方法,能够帮助开发者快速获取到数据统计结果,为业务分析提供数据支持。 ### 回答2: Java ESElasticsearch)是一个基于Java开发的开源搜索引擎,它能够以高效的方式存储、搜索和分析大量的数据。 聚合查询是Java ES中的一种重要功能,它可以帮助我们以更灵活的方式对数据进行聚合和分析,从而得出有价值的业务洞察。聚合查询可以对数据进行分组、排序、统计和过滤等操作,使我们能够深入了解数据的特征和趋势。 聚合查询可以针对多个字段进行聚合操作,比如求和、平均值、最大值、最小值等。它还支持桶聚合,可以将数据按照指定的条件进行分组,比如按照地区、时间段、类别等进行分组统计分析。此外,聚合查询还可以进行嵌套聚合,即在一个聚合查询中嵌套另一个聚合查询进行进一步的分析。 在Java ES使用聚合查询十分简单,首先需要建立一个Elasticsearch客户端连接,然后准备查询DSL语句,通过调用相关API进行查询。聚合查询的结果以JSON格式返回,我们可以解析这些结果并进行业务处理。 总之,Java ES的聚合查询功能提供了丰富的数据分析能力,能够满足不同业务场景的需求。通过聚合查询,我们可以更轻松地理解和挖掘数据的潜在价值,为业务决策和优化提供有力支持。 ### 回答3: Java ESElasticsearch)聚合查询是一种用于分析和统计数据的功能。聚合查询可以对索引中的数据进行分组、筛选、计数和计算。 首先,聚合查询可以根据指定的字段将数据分组。例如,可以按照地区将销售数据进行分组,然后统计每个地区的销售额、订单数量等信息。 其次,聚合查询还可以根据一定的条件对数据进行筛选。例如,可以筛选出销售额大于10000的地区,或者筛选出销售数量超过100的产品类别。 除了基本的分组和筛选功能,聚合查询还支持各种常用的统计计算。例如,可以计算每个地区的销售额总和、平均值、最大值、最小值等。还可以计算每个月的销售额趋势和增长率等统计信息。 此外,聚合查询还支持多种聚合函数的组合和嵌套。例如,可以先按地区分组,然后在每个地区内再按销售年份进行分组,最后计算每个地区每年的销售额总和或平均值等。 Java ES聚合查询功能强大且灵活,可以满足各种复杂的统计分析需求。通过灵活的组合和嵌套,可以得到更详细和全面的统计结果,为数据分析和决策提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值