ES 嵌套查询

背景

一个配方由多种原材料组成,需求是根据各种原材料的用量搜索出对应的配方

配方实体类

java 复制代码
class Formula {

    private long id;

    private String name;

    private List<Material> materials;

}

class Material {

    @JsonProperty("material_id")
    private long materialId;

    private float amount;

}

1、定义索引映射 Mapping

复制代码
PUT /formula
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "name": {
        "type": "text"
      },
      "materials": {
        "type": "nested",
        "properties": {
          "material_id": {
            "type": "long"
          },
          "amount": {
            "type": "float"
          }
        }
      }
    }
  }
}

2、添加测试数据

复制代码
POST /formula/_doc/1
{
  "id": "1",
  "name": "formula A",
  "materials": [
    { "material_id": "material_1", "amount": 100 },
    { "material_id": "material_2", "amount": 50 }
  ]
}

POST /formula/_doc/2
{
  "id": "2",
  "name": "formula B",
  "materials": [
    { "material_id": "material_2", "amount": 30 },
    { "material_id": "material_3", "amount": 20 }
  ]
}

3、查询

复制代码
GET /formula/_search
{
  "query": {
    "bool": {
        "must": [
            {
                "match": {
                    "name": "formula A"
                }
            },
            {
                "nested": {
                    "path": "materials",
                    "query": {
                        "bool": {
                        "must": [
                            { "match": { "materials.material_id": "2" } },
                            { "range": { "materials.amount": { "gte": 40, "lte": 60 } } }
                        ]
                        }
                    }
                }
            }
        ]
    }
  }
}

RestHighLevelClient

java 复制代码
// nested
BoolQueryBuilder nestedBoolQueryBuilder = new BoolQueryBuilder();
nestedBoolQueryBuilder.must().add(QueryBuilders.matchPhraseQuery("materials.material_id", 1));
nestedBoolQueryBuilder.must().add(QueryBuilders.rangeQuery("materials.amount").from(40).to(60));
NestedQueryBuilder nestedQueryBuilder =  QueryBuilders.nestedQuery("materials", nestedBoolQueryBuilder, ScoreMode.Avg);

// query
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(nestedQueryBuilder);
// simple
boolQueryBuilder.must(QueryBuilders.matchQuery("name", "formula A"));

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);

SearchRequest searchRequest = new SearchRequest(new String[]{index}, searchSourceBuilder);

// response
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

ElasticsearchClient

java 复制代码
SearchResponse<Formula> response = elasticsearchClient.search(s -> s
                .index("formula")
                .query(q -> q.match(t -> t.field("name").query("formula A")))
                .query(q -> q.nested(nq -> nq.path("materials")
                                .query(nq1 -> nq1.match(t -> t.field("materials.material_id").query("2")))
                                .query(nq2 -> nq2.range(r -> r.field("materials.amount").from("40").to("60")))
                        )
                ),
        Formula.class
);
相关推荐
Elasticsearch12 小时前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
elasticsearch
core5121 天前
Elasticsearch 车牌号片段搜索:n-gram 倒排索引实战方案
elasticsearch·n-gram·索引·倒排索引·号牌·片段
এ慕ོ冬℘゜1 天前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
Sayai1 天前
Elasticsearch 日志写入链路调优实战:ingest pipeline 补时间戳、时区偏移修复与按值类型路由(附 translog 实测)
大数据·运维·elasticsearch·搜索引擎·性能优化
总爱写点小BUG1 天前
git-tidy:一个把「提交规范治理」做成闭环的 Git 桌面客户端
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客2 天前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
BreezeJiang3 天前
写了 Dockerfile 却没生效:ES + Kibana 的 compose 配置里,藏着三个反直觉的点
elasticsearch
Elasticsearch3 天前
Elastic 计划利用 NVIDIA RTX GPU 将 Jina 模型推理速度提升至 8 倍
elasticsearch
Elastic 中国社区官方博客3 天前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客3 天前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es