2014-03-30 20 views
1

在Elasticsearch中,我爲文檔類型定義了一個_parent映射(我們稱之爲homes),並對一些文檔編制索引。他們似乎正確索引,因爲當我尋找父母與孩子符合一些條件(使用has_child)預期的結果返回。刪除不正確的父項仍然成功

「問題」是,當我發出了一個刪除一個孩子一樣......

curl -XDELETE 'http://localhost:9200/test/homes/1?parent=11' 

它成功即使homes文檔ID爲1的父母是不是11

這是預期的行爲?

從我的Elasticsearch delete API docs文件的理解也不會在這種情況下被刪除(但是這不是我所看到的)...

家長可以設置參數,這將主要是與設置routing參數的 相同。

...

發出刪除不正確的路由,會導致文檔 不會被刪除。

回答

0

路由(以及父節點)決定使用哪個分片。在ES 1.0中,DB知道,父母需要的只是用它來決定,在哪裏尋找。如果對象在那裏,它將被刪除,但父母是否是「真正的父母」並不重要。重要的是父母的相同哈希結果。

您可以使用父鍵或使用幻想鍵創建碰撞數據(不同分片上的索引/類型/ ID相同) - 您擁有的碎片越多,發生衝突的可能性越大,但這不會使其安全。只記得:親本沒有外鍵或者像我們在SQL世界中那樣強大。

+0

如果父母(另一個孩子)的ID爲「11」,這將是一個合理的解釋,但即使沒有這樣的父母也會發生這種情況。 – Xavi

+0

家長只需要將孩子存儲在同一個分片上。 ES並不能保護你免於在父母的腳下射擊(還沒有調查到1.0)。如果你通過父節點(或者甚至沒有),它將被用於路由,如果路由偶然在同一個分片上結束,那麼你會刪除你的對象。反過來也是如此 - 您可以在不同的分片中爲不同的父母編制相同的對象(相同的ID)。 ES中的父母關係非常脆弱,遲早會得到你。 – cfrick

+0

據我所知,即使指定的父母不是正確的父母,如果碰巧與不正確的父母在相同的分片中,該文檔也會被刪除。然而,父'11'不存在(沒有那個id的文檔),所以應該返回一個錯誤,並且不應該刪除該子項? (即使ES親子關係很弱) – Xavi

相關問題