Elasticsearch nested嵌套类型
第一次接触es,感觉啥啥都是懵逼状态,不得不吐槽一下,出了问题网上写的那些文章真的是看不懂,要么代码不全,要么就是各种抄,根本结局不了问题,还是决定自己写一个吧,没准哪天就帮别人节省了时间.
话不多说,这里使用的版本是7.12.1,查看es版本方法:
直接在浏览器访问es端口号就行 ps:搞了一天才发现看的是2.0的api 我吐了
博主现在查看的api是7.14版本的(直接看最新的了)
为什么要用nested嵌套结构呢?具体可以看官网的解释,这里就不在多做赘述了:
https://www.elastic.co/guide/en/elasticsearch/reference/7.14/nested.html
简单来说就是需要一个多层嵌套的对象结构,例如:
公司下面有部门员工,员工下面有所属项目,都是一对多的关系,后面的代码也是使用的这个逻辑(可能有点不太合理,但是大致是这么个意思)
公司:
____部门名称
____部门员工:
________id
________姓名
________年龄
________所属项目:
____________项目名称
直接上代码
1.声明结构
PUT localhost:9200/test_mapping7{"mappings": {"properties":{"group": {"type": "text"},"user":{"type": "nested", //嵌套类型type应为nested"properties":{"id": {"type": "keyword"},"name":{"type": "text"},"age":{ "type": "short"},"project":{"type": "nested","properties":{"name": {"type": "text"}}}}}} }
}
nested类型结构的属性应用properties表示,以下是官网api
2.声明成功后我们可以查询一下声明的结构
GET localhost:9200/test_mapping7?pretty //pretty是输出json格式化后的数据{ "test_mapping7" : { "aliases" : { }, "mappings" : { "properties" : { "group" : { "type" : "text" }, "user" : { "type" : "nested", "properties" : { "age" : { "type" : "short" }, "id" : { "type" : "keyword" }, "name" : { "type" : "text" }, "project" : { "type" : "nested", "properties" : { "name" : { "type" : "text" } } } } } } }, "settings" : { "index" : { "routing" : { "allocation" : { "include" : { "_tier_preference" : "data_content"} } }, "number_of_shards" : "1", "provided_name" : "test_mapping7", "creation_date" : "1630464120543", "number_of_replicas" : "1", "uuid" : "stKB9OdESUmnqJwBKOK-pQ", "version" : { "created" : "7120199" } } } }
}
3.插入数据
重点: 插入数据这块必须在index名后面加上/_doc/ , 本身这里应该是设置type的字段,但是在实际插入数据时,用自定义的stu,class等都会报错,难道只能插入doc类型? ps:正常猜想是在mapping中没有设置最外层的type,但是实际操作时声明type会报错
POST localhost:9200/test_mapping7/_doc/1 {"group": "研发","user":[{"id": 1,"name": "zhangsan","age": 12,"project":[{"name": "pro1"}]},{"id": 2,"name": "lisi","age": 15,"project":[{"name": "pro12"}]}]
}result:{"_index": "test_mapping7","_type": "_doc","_id": "2","_version": 1,"result": "created","_shards": {"total": 1,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}
再插入一条
POST localhost:9200/test_mapping7/_doc/2{"group": "市场","user":[{"id": 3,"name": "xiaomei","age": 21,"project":[{"name": "pro3"}]},{"id": 4,"name": "xiaoxue","age": 25,"project":[{"name": "pro4"}]}]
}result:{"_index": "test_mapping7","_type": "_doc","_id": "2","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}
查询一下插入的数据
GET localhost:9200/test_mapping7/_search?pretty{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "test_mapping7", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "group" : "研发", "user" : [ { "id" : 1, "name" : "zhangsan", "age" : 12, "project" : [ { "name" : "pro1" } ] }, { "id" : 2, "name" : "lisi", "age" : 14, "project" : [ { "name" : "pro12" } ] } ] } }, { "_index" : "test_mapping7", "_type" : "_doc", "_id" : "2", "_score" : 1.0, "_source" : { "group" : "市场", "user" : [ { "id" : 3, "name" : "xiaomei", "age" : 21, "project" : [ { "name" : "pro3" } ] }, { "id" : 4, "name" : "xiaoxue", "age" : 25, "project" : [ { "name" : "pro4" } ] } ] } } ] }
}
4.查询
首先查询一下name=zhangsan的index
GET localhost:9200/test_mapping7/_search{"query": {"nested":{"path": "user","query": {"bool":{"must": [{"match": {"user.name":"zhangsan"}}]}}}}
}result:{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.2039728,"hits": [{"_index": "test_mapping7","_type": "_doc","_id": "1","_score": 1.2039728,"_source": {"group": "研发","user": [{"id": 1,"name": "zhangsan","age": 12,"project": [{"name": "pro1"}]},{"id": 2,"name": "lisi","age": 14,"project": [{"name": "pro12"}]}]}}]}
}
可以看到直接返回了整个doc1对象,符合预期结果
那么我们如果查询条件是project.name=pro4呢?划重点
nested.path必须是从外层开始写: user.project,不可以直接写project
match条件也要从最外层开始写 user.project.name=pro4,不可以直接写project.name=pro4
POST localhost:9200/test_mapping7/_search{"query": {"nested":{"path": "user.project","query": {"bool":{"must": [{"match": {"user.project.name":"pro4"}}]}}}}
}result:{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.2039728,"hits": [{"_index": "test_mapping7","_type": "_doc","_id": "2","_score": 1.2039728,"_source": {"group": "市场","user": [{"id": 3,"name": "xiaomei","age": 21,"project": [{"name": "pro3"}]},{"id": 4,"name": "xiaoxue","age": 25,"project": [{"name": "pro4"}]}]}}]}
}
成功命中
未完待续,欢迎补充指正
Elasticsearch nested嵌套类型相关推荐
- 【Elasticsearch】 es nested 嵌套类型 详解
1.概述 数据类型,大合集参考 [Elasticsearch]Elasticsearch的数据类型 (text.keyword.date.object.geo等) 2 嵌套类型 - nested 嵌套 ...
- 嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...
- es内嵌文档查询_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...
- 转:elasticsearch nested嵌套查询
转自: [弄nèng - Elasticsearch]DSL入门篇(七)-- Nested类型查询,聚合_司马缸砸缸了-CSDN博客文章目录1. nested query2. nested 对象聚合项 ...
- (五)ElasticSearch 6.1.1数据类型
1.elasticsearch的数据类型 1.1.核心数据类型 1.1.1.字符串类型(string不再支持) 当一个字段需要用于全文搜索(会被分词), 比如产品名称.产品描述信息, 就应该使用tex ...
- elasticsearch 学习须知
人工智能.大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需.Elasticsearch 作为开源领域的后起之秀,从2010年至今得到飞跃式的发展. Elasticsearc ...
- elasticsearch 数据类型
参考 aggregate_metric_double:预聚合指标值 字段有4个子字段 min, max, sum, value_count来分别存储double数值,专做聚合使用 metrics: [ ...
- elasticsearch-rest-high-level-client操作elasticsearch
文章目录 摘要 依赖 yml配置 连接配置 索引结构 普通常见非嵌套结构的CRUD 新增 更新(根据id更新) 更新(高级,根据搜索条件更新,采用无痛painless脚本) 删除 删除(根据搜索条件删 ...
- Elasticsearch中字段类型(Field Type)详解
ElasticSearch 7.7 字段类型(Field datatype)详解 字符串, object, 数值, 日期, 数组, 0x00 字符串: text, keyword 5.0以后,stri ...
- Elasticsearch 5.4 Mapping详解
为什么80%的码农都做不了架构师?>>> 前言 一Field datatype字段数据类型 1string类型 2 text类型 3 keyword类型 4 数字类型 5 Ob ...
最新文章
- centos7 系统下搭建 lnmp 环境
- React如何使用 Ant Design(简单使用)
- java中wait和sleep的区别
- webpack中实现按需加载
- hive 十六进制转十进制_hive 常用运算
- 第16课 “远程 Git文档库” 的基础操作
- linux源码安装 rpm命令
- 女博士实名举报北航人工智能教授:性骚扰!
- app测试用mysql数据库,数据库: 安装配置数据库,使用Navicat for MySQL和手机APP 连接测试...
- 【HDU 杭电 5773 The All-purpose Zero】
- ICE的Timer和TimerTask
- KEIL expected an identifier
- Android仿淘宝头条垂直滚动,垂直走马灯,公告
- 脉冲响应不变法C语言程序,脉冲响应不变法-数字信号处理总结.ppt
- 【前端CSS】CSS的选择器属性详细介绍
- CES 2011—少数派报告
- 想进大厂, Jira 管理平台你会用么?
- Hadoop 深入浅出 ---- 入门 (1)
- 科学家在类脑芯片上实现类似LSTM的功能,能效高1000倍
- 哈工大数据库系统(上):关系模型之基本概念(三)课后测验与作业
热门文章
- 合肥学院计算机论文,合肥学院本科生毕业论文.doc
- video截取视频内容作为封面
- 怎么在线制作软件的logo
- 证件照怎么制作?怎样自己在线制作2寸照片?
- 傻白入门芯片设计,Substrate/RDL/Interposer/EMIB/TSV(三)
- NC如何在打印模板中添加打印审批流记录
- C# 利用Excel及Spire.xls实现用户自定义打印模板
- 罗振宇2019-2020“时间的朋友”跨年演讲精华版全文
- 2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!(转载)
- 专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用