当前位置: 首页 > news >正文

ES 嵌套查询

背景

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

配方实体类

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

// 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

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
);
http://www.lryc.cn/news/389089.html

相关文章:

  • 《等保测评实战指南:从评估到加固的全程解析》
  • 【24考研·交通】我的考研经历
  • ERP系统中有哪些模块?有哪些具体实现方案呢?
  • 扩散模型在机器学习中的应用及原理
  • fastapi自定义中间件
  • 基于 MCU 的开发,能不能对代码进行单元测试?
  • 基于OpenCV与Keras的停车场车位自动识别系统
  • YOLOv10改进教程|C2f-CIB加入注意力机制
  • 算法训练营day06 哈希表(统计数,去重,降低时间复杂度)
  • 影帝郭晋安关联保健品企业,草姬集团无研发费用销售成本不低
  • leetcode-19-回溯-组合问题(剪枝、去重)
  • Java案例实现双色球
  • JS(JavaScript)的BOM操作
  • 【CT】LeetCode手撕—82. 删除排序链表中的重复元素 II
  • C++ STL unique_ptr智能指针源码剖析
  • Unity中的的文件夹(特殊文件夹)
  • Go语言定时器Timer和Ticker到底怎么用
  • 41、web基础和http协议
  • 6-173 二分查找的关键字比较次数
  • 【基础篇】第5章 Elasticsearch 数据聚合与分析
  • 【网络安全】修改Host文件实现域名解析
  • Spring Boot 全面解析:从入门到实践案例
  • 222222222
  • Boost 智能指针
  • 在WSL Ubuntu中启用root用户的SSH服务
  • C语⾔数据类型和变量
  • 运行时类型信息(RTTI)
  • 使用 NVivo 定性数据分析软件指导癌症护理研究
  • R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性
  • 第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)