wordpress 伪静态 iis,秦皇岛网络优化排名,一份完整的个人简历模板,做算命网站挣钱么关于父子索引
ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.
父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有…
关于父子索引
ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.
父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有减少文档数量,而且增加了父子绑定关系,会导致查询效率低下,因此我们并不建议您在实际开发中使用父子类型.
ES本身更适合大宽表模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避父子类型的使用,不仅效率高,功能也更强大。
建议
如果对文档的写多于读,那么建议你选择父子类型,如果文档读多于写, 那么请选择嵌套类型。
对比嵌套文档
父子文档在理解上来说可以理解为一个关联查询有些类似MySQL中的JOIN查询通过某个字段关系来关联。 父子文档与嵌套文档主要的区别在于父子文档的父对象和子对象都是独立的文档而嵌套文档中都在同一个文档中存储。
父-子关系的主要优势有
更新父文档时不会重新索引子文档。创建修改或删除子文档时不会影响父文档或其他子文档。这一点在这种场景下尤其有用子文档数量较多并且子文档创建和修改的频率高时。子文档可以作为搜索结果独立返回。
实战案例
本篇以博客文章和评论作为文档模型演示文章和评论这个一对多的父子关系增删改查如何操作。 假设数据如下
[{title:这是一篇博文,content:适当方式连接管理工具螺丝钉解放了送到房间里伺机待发...},{username:Jack,comment:nice post, good job!,date:2023-09-04},{username:王老五,comment:写得很一般啊,date:2023-08-04},{username:技术我最牛,comment:仅次于我,date:2022-05-01}
]
创建索引
创建blog索引父文档与子文档分别用不同的字段来存储对应的数据在创建索引文档的时需要指定父子文档的关系即文章为parent评论为child创建索引语句如下
{mappings: {properties: {date: {type: date},username: {type: text,fields: {keyword: {type: keyword}}},comment: {type: text,fields: {keyword: {type: keyword}}},content: {type: text,fields: {keyword: {type: keyword}}},title: {type: text,fields: {keyword: {type: keyword}}},relation: {type: join,relations: {parent: child}}}}
}添加文档
父文档 POST /blog/_doc/1
如果不指定relation会报错
子文档 子文档的插入语法如下注意routing是父文档的id平时我们插入文档时routing的默认就是id。
POST /blog/_doc/1?routing1
查询文档
父子查询方式常用分为两种特殊情况
根据子文档查询父文档 has_parent 例如我要查询王老五的留言 POST /blog/_search {query: {has_child: {type: comment,query: {match: {username: 王老五}}}}
}根据父文档查询子文档 has_child 例如我要查询文章内容包含“工具”的所有评论 POST /blog/_search 聚合查询与嵌套文档类似比较简单这里在说明另外一种场景祖辈和孙辈可以创建吗比如本文中的留言如果它也有子文档那么可以根据文章查询孙辈吗答案是可以的只需要在has_child里面在嵌套一层has_child查询即可。