在Elasticsearch中,我为文档类型(我们称之为homes
)定义了一个_parent
映射,并索引了一些文档。它们似乎正确索引,因为当我搜索匹配某些条件(使用has_child
)的孩子的父母时,返回预期的结果。
"问题"是,当我为子对象发出删除时,如…
curl -XDELETE 'http://localhost:9200/test/homes/1?parent=11'
即使id为1
的homes
文档的父文档不是11
,它也会成功。
这是预期的行为吗?
根据我对Elasticsearch删除API文档的理解,在这种情况下,文档不必被删除(但这不是我所看到的)…
可以设置父参数,基本与设置
routing
参数…
在没有正确路由的情况下发出删除,将导致文档不能删除
路由(以及父节点)决定使用哪个分片。在ES 1.0中,DB知道需要父节点,但仍然只使用它来决定在哪里查找。如果对象存在,它将被删除,但是父对象是否是"真正的父对象"并不重要。重要的是父节点的哈希结果相同。
您可以使用父键或幻想键完美地创建冲突数据(在不同的分片上相同的索引/类型/id)—您拥有的分片越多,就越不可能发生冲突,但这并不能使其安全。只要记住:父不是外键,也不是SQL中的强键。