我在弹性搜索中使用父关系,我想知道父级是否必须存在于子级之前。当我添加id为尚未存在的父级的子级时,Elasticsearch不会抱怨。然而,它接缝(我还没有完全验证它),一旦添加了父级,有时“has_parent”查询返回条目而其他时间不返回。 我找了一个答案,但还没找到。任何人都有线索?
答案 0 :(得分:3)
ElasticSearch不是关系数据库:父类,其id用于插入子类型的文档,不必存在。
但是,一旦添加父文档,您可能会遇到问题,因为父文档及其子文件必须位于同一个分片上。
为实现此目的,ElasticSearch使用父ID作为路由键。如果未指定父ID,则该请求可能会转发到错误的分片as specified in the documentation。这可以解释你所说的" has_parent"查询。
如果要在子项之后添加父项,则必须删除并重新索引它,以确保它与父项存储在同一个分片上。
答案 1 :(得分:2)
正如我所理解的那样,这种关系是松散耦合的。因此,您可以在孩子被索引之前对其进行索引,但必须确保孩子在与其未来父级相同的分片中编入索引。这意味着如果您有一个简单的父子关系,您必须知道父ID的id值。但是如果索引的结构更复杂,路由也可能变得复杂。如果您的父母本身有父母,那么一切都应该与祖父母在同一个地方进行路由。