elasticsearch 查询索引以及nested查询

本文深入探讨Elasticsearch的索引管理,包括数据添加、布尔查询、聚合分析及嵌套字段查询等高级功能。通过具体案例,讲解如何利用bool查询、must与should条件组合实现精准搜索,以及agg分组、nested和script_field查询的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询索引


上一篇已经创建索引 link.
现在先往索引里添加数据

PUT bank/_bulk
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"杜克","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL","obj1":{"name":"blue"}}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"伯纳德","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN","obj1":{"name":"green"}}
{"index":{"_id":"13"}}
{"account_number":13,"balance":32838,"firstname":"Nanette","lastname":"巴特斯","age":28,"gender":"F","address":"789 Madison Street","employer":"Quility","email":"nanettebates@quility.com","city":"Nogal","state":"VA","obj1":{"name":"blue"}}
{"index":{"_id":"18"}}
{"account_number":18,"balance":4180,"firstname":"Dale","lastname":"奥达曼斯","age":33,"gender":"M","address":"467 Hutchinson Court","employer":"Boink","email":"daleadams@boink.com","city":"Orick","state":"MD"} 

数据使用https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json
我在索引中新加了"obj1" : {“type” : “nested”} 类型;

query查询

bool查询 must 必须 匹配gender为M并且state为MD的数据

GET bank/_search
{"query": {"bool": {"must": [
  {"match": {
    "gender": "M"
  }},{"match": {
    "state": "MD"
  }} 
]}}}

如果我需要查询gender 为M 或者 gender为F的数据

GET bank/_search
{"query": {"bool": {"should": [
    {"match": {
      "gender": "F"
    }} ,{"match": {
      "gender": "M"
    }}
  ]}
  }
}

must 和should组合使用

GET bank/_search
{"query": {"bool": {"must": [
  {"match": {
    "gender": "M"
  }},{"bool": {"should": [
    {"match": {
      "gender": "F"
    }} ,{"match": {
      "gender": "M"
    }}
  ]}}
]}}}

agg分组

GET bank/_search
{"query": {"match_all": {}},"aggs": {
  "age_avg": {
    "avg": {
      "field": "age"
    }
  }
},"size": 0}

nested 查询

GET bank/_search
{"query": {"nested": {
    "path": "obj1",
    "query": {"bool": {"must": [
      {"exists": {"field" : "obj1" }}
    ]}}
  }} }

script_field 查询

GET bank/_search
{"query": {"bool": {"must": [
  {"match_all": {}}
]}},"script_fields": {
  "firstname_length": {
    "script": {"lang": "painless",
        "source": "doc['firstname'].length"}
  }
},"_source": "*"}

想要计算下firstname 的长度 结果报错

"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [firstname] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."

英文firstname 为text类型 进行了分词 我们换成keyword字段试一试

GET bank/_search
{"query": {"bool": {"must": [
  {"match_all": {}}
]}},"script_fields": {
  "email_length": {
    "script": {"lang": "painless",
        "source": "doc['email'].length"}
  }
},"_source": "*"}

随便用一个keyword字段email试一下 结果是成功的
但是好像返回长度都为1。。。
script的api可以访问链接 link.

### Elasticsearch 索引查询方法与示例 Elasticsearch 提供了灵活的查询接口,支持从简单到复杂的多种查询方式。以下是几种常见的索引查询方法及其示例: #### 1. 基本查询 最基本的查询方式是通过 `match` 查询来匹配字段内容。例如,查找标题中包含特定关键词的文档: ```json GET /my_index/_search { "query": { "match": { "title": "Elasticsearch" } } } ``` 此查询将返回所有 `title` 字段中包含 "Elasticsearch" 的文档[^1]。 #### 2. 分页查询 在处理大量数据时,分页查询非常有用。可以通过设置 `from` `size` 参数实现分页: ```json GET /my_index/_search { "from": 0, "size": 10, "query": { "match": { "title": "guide" } } } ``` 上述查询将跳过前 0 条记录,返回接下来的 10 条记录[^1]。 #### 3. 范围查询 范围查询用于筛选特定范围内的数据。例如,查找日期在指定范围内的文档: ```json GET /my_index/_search { "query": { "range": { "date": { "gte": "2023-01-01", "lte": "2023-12-31" } } } } ``` 此查询将返回 `date` 字段值在 2023 年 1 月 1 日至 2023 年 12 月 31 日之间的所有文档。 #### 4. 全文搜索 对于需要进行全文搜索的场景,可以使用 `match` 查询直接作用于文本字段。例如: ```json GET /product/_search { "query": { "match": { "product_name": "Elasticsearch" } } } ``` 此查询将在 `product_name` 字段中查找包含 "Elasticsearch" 的所有文档[^2]。 #### 5. 嵌套文档查询 当需要对嵌套结构的数据进行查询时,可以使用 `nested` 查询。例如: ```json GET /my_index/_search { "query": { "nested": { "path": "comments", "query": { "match": { "comments.content": "example" } } } } } ``` 此查询将查找 `comments` 数组中 `content` 字段包含 "example" 的文档[^3]。 #### 6. 别名查询 为了简化跨多个索引查询操作,可以使用索引别名。例如,创建一个别名指向多个索引后,可以直接通过别名进行查询: ```json GET /logs_last_month/_search { "query": { "match": { "log_message": "error" } } } ``` 此查询将通过别名 `logs_last_month` 查找所有包含 "error" 的日志消息[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值