0x00 elasticsearch
elasticsearch 简称 ES,是一个当前流行的搜索服务器(全文搜索引擎),不得不说,它的搜索速度以及提供的丰富搜索选项,在面对企业级的需求时,大多数情况都可以应付自如。从 2010 年诞生至今,已经更新到了 5.6 版本,github 上获得了 25000+的 star。但有些问题在国内还是很少见到解决办法,国内整体还是要比老外落后几年。
最近在面对一个较复杂的索引结构时,使用了多代父子关系文档,但其中遇到了一些问题,这里将解决过程中的收获总结出来给后来的人提供一些借鉴和思路。
0x01 父子文档
父子文档,你可以简单的理解为关系型数据库中的一对多关系,但我们不必自己去维护映射关系,ES 维护了父子映射关系,我们要想使用这个功能,需要完成下面两件事,缺一不可:
指定某一个文档 type 是另一个文档 type 的父亲
在存储子文档时通过 parent 参数指定父文档 id
其实还有一个隐含前提条件,父子关系文档必须被索引在同一个分片上,但最简单的父子关系(只有一代,没有祖辈及以上)不必去考虑,完成上面第二点其实就已经保证了这一点,多代父子的问题下面我会提。
对于指定关系,我们只有两个时间点去设置,创建索引时或者在子 type 创建之前更新父 type 的 mapping,大家可能发现了,这两种方式几乎都是需要重新定义相关的索引结构,所以父子关系的最好在设计之初就想好。
0x02 定义父子关系
PUT /es_test
{
“map