elasticsearch 查询索引以及nested查询

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

查询索引


上一篇已经创建索引 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.

<think>好的,我现在需要帮助用户解决在Java中使用Elasticsearchnested结构进行范围查询的问题。首先,我得回顾用户的问题,确保我理解正确。用户想要一个示例,展示如何在Java中实现这种查询。根据用户提供的引用,特别是引用[1]中的Maven依赖,用户可能已经配置了Elasticsearch的客户端,但需要具体的代码示例。首先,我应该确认用户提到的nested结构是什么样子的。通常,nested类型在Elasticsearch中用于处理对象数组,这些数组需要独立查询。例如,用户可能有一个包含多个嵌套对象的字段,每个对象有自己的属性,需要进行范围查询。接下来,我需要考虑如何在Java中使用HighLevelREST Client来构建这样的查询。根据引用[2]中的示例,用户可能已经了解基本的布尔查询结构,但需要将其应用到nested类型中。这里的关键是使用NestedQueryBuilder,并指定正确的路径(path)。然后,范围查询的部分需要使用RangeQueryBuilder,并设置相应的字段和范围条件。需要注意的是,nested字段的路径需要正确指定,比如在示例中的“tags”字段,每个tag可能有“value”属性,用户可能想在这个属性上进行范围查询。另外,引用[3]提到了分片和副本的设置,但这个问题可能与用户的当前需求无关,暂时可以忽略。不过,如果用户的数据量较大,可能需要考虑分片的影响,但当前问题主要是查询实现。现在,我需要构建一个完整的Java代码示例。首先,确保导入了正确的依赖,如引用[1]中的版本7.4.0。然后,创建Elasticsearch客户端,构建查询请求,其中包含NestedQuery和RangeQuery的组合。需要注意的几点是:nested查询需要指定路径,正确的字段路径可能需要使用点符号,比如“tags.value”。同时,范围查询的参数,如gte和lte,需要正确设置。最后,执行查询并处理结果。 用户可能还会遇到常见问题,比如路径错误、字段类型不匹配(例如,是否被正确映射为nested类型),或者版本兼容性问题。因此,在回答中应该包含这些注意事项,帮助用户避免常见的陷阱。最后,生成的相关问题应该围绕用户可能进一步的需求,比如分页查询结果、处理更复杂的嵌套查询,或者性能优化。这些问题可以帮助用户深入理解Elasticsearch的高级用法。</think>在Java中使用Elasticsearch实现nested结构范围查询,需结合`NestedQueryBuilder`和`RangeQueryBuilder`。以下是具体实现步骤: ### 1. 创建nested结构映射 首先确保索引的字段已定义为nested类型: ```json PUT /products { "mappings": { "properties": { "tags": { "type": "nested", "properties": { "value": { "type": "integer" }, "name": { "type": "keyword" } } } } } } ``` ### 2. Java代码实现 ```java import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.index.query.NestedQueryBuilder; // 构建nested范围查询 NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery( "tags", // nested字段路径 QueryBuilders.boolQuery() .must(QueryBuilders.rangeQuery("tags.value") // 嵌套字段的范围查询 .gte(10) .lte(20)), ScoreMode.None // 评分模式 ); SearchRequest searchRequest = new SearchRequest("products"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(nestedQuery); searchRequest.source(sourceBuilder); // 执行查询 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); ``` ### 3. 关键参数说明 - `path`: 对应mapping中定义的nested字段名称 - `rangeQuery()`: 指定嵌套字段的数值范围条件 - `ScoreMode`: 控制评分计算方式,常用`None`表示不评分[^2] ### 4. 注意事项 1. 字段类型必须预先定义为nested类型 2. 查询路径需使用`父字段.子字段`的格式 3. 若需要同时查询多个嵌套条件,可在bool查询中添加多个must子句 4. 7.x版本需保持Java客户端与ES服务端版本一致[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值