{
"first" : "李",
"last" : "四"
}
]
}
这里想要查询first为“张”,last为“四”的数据,按照我们的理解应该没有这种数据。按如下语句查询。
GET /user/user_info/_search
{
“query”:{
“bool”:{
“must”:[
{
“match”:{
“userName.first”:“张”
}
},
{
“match”:{
“userName.last”:“四”
}
}
]
}
}
}
查询结果如下:居然查询到了。这显然不符合我们的预期。
![](https://img-blog.csdnimg.cn/69d2f65f32c84367a2e81fc69e746f1e.png)
这个原因就是前面所说的lucene没有内部对象的概念,所谓的内部对象实际是被扁平化为一个简单的字段名称和值列表。文档内部存储是这个样子的:
{
“group” : “human”,
“sex” : “man”,
“userName.first” : [ “张”, “李” ],
“userName.last” : [ “三”, “四” ]
}
显然 userName.first 和 userName.last 字段平面化为多值字段,之前的关联性丢失,查询就不会得到预期的结果。
那么要如何实现自己想要的语义呢? —— 显然就是本文想要说的nested了。
### 3、nested类型的使用
##### 3.1、首先插入如下一条记录
其含义为博客文章信息数据,其中每篇文章的评论以comments字段数组存储。
PUT /financeblogs/blog/docidart1
{
“title”: “Invest Money”,
“body”: “Please start investing money as soon…”,
“tags”: [“money”, “invest”],
“published_on”: “18 Oct 2017”,
“comments”: [
{
“name”: “William”,
“age”: 34,
“rating”: 8,
“comment”: “Nice article…”,
“commented_on”: “30 Nov 2017”
},
{
“name”: “John”,
“age”: 38,
“rating”: 9,
“comment”: “I started investing after reading this.”,
“commented_on”: “25 Nov 2017”
},
{
“name”: “Smith”,
“age”: 33,
“rating”: 7,
“comment”: “Very good post”,
“commented_on”: “20 Nov 2017”
}
]
}
现在对于这条数据评论人姓名、年龄如下。
| name | age |
| --- | --- |
| William | 34 |
| John | 38 |
| Smith | 33 |
##### 3.2、非nested时内部对象无法按预期查询
我们尝试查询{name:John, age:34}评论过的博客,按照我们的理解应该没有符合条件的记录。但是由于前面说过的平铺的原因实际上如下查询语句是检索到这条数据了的。
GET /financeblogs/blog/_search
{
“query”:{
“bool”:{
“must”:[
{
“match”:{
“comments.name”:“John”
}
},
{
“match”:{
“comments.age”:“34”
}
}
]
}
}
}
##### 3.3、接下来换成nested的玩法
**0.把这个索引删除再来一遍**
DELETE financeblogs
**1.创建如下索引。主要是mapping中的comments字段指定了类型为 nested。**
PUT /financeblogs
{
“mappings”: {
“blog”: {
“properties”: {
“title”: {
“type”: “text”
},
“body”: {
“type”: “text”
},
“tags”: {
“type”: “keyword”
},
“published_on”: {
“type”: “keyword”
},
“comments”: {
“type”: “nested”,
“properties”: {
“name”: {
“type”: “text”
},
“comment”: {
“type”: “text”
},
“age”: {
“type”: “short”
},
“rating”: {
“type”: “short”
},
“commented_on”: {
“type”: “text”
}
}
}
}
}
}
}
**2.插入同样的目标数据**
PUT /financeblogs/blog/docidart1
{
“title”: “Invest Money”,
“body”: “Please start investing money as soon…”,
“tags”: [“money”, “invest”],
“published_on”: “18 Oct 2017”,
“comments”: [
{
“name”: “William”,
“age”: 34,
“rating”: 8,
“comment”: “Nice article…”,
“commented_on”: “30 Nov 2017”
},
{
“name”: “John”,
“age”: 38,
“rating”: 9,
“comment”: “I started investing after reading this.”,
“commented_on”: “25 Nov 2017”
},
{
“name”: “Smith”,
“age”: 33,
“rating”: 7,
“comment”: “Very good post”,
“commented_on”: “20 Nov 2017”
}
]
}
**3.使用nested查询方法**
#查询name为John,age为34的记录发现是没有数据的。
GET /financeblogs/blog/_search?pretty
{
“query”: {
“bool”: {
“must”: [
{
“nested”: {
“path”: “comments”,
“query”: {
“bool”: {
“must”: [
{
“match”: {
“comments.name”: “John”
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-0K78IcIv-1712950618091)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!