我正在尝试设置具有以下特征的索引:
所以我们创建了索引和别名:
curl -XDELETE http://localhost:9200/famtest
curl -XPOST http://localhost:9200/famtest -d '
{ "mappings" :
{ "mama" :
{ "properties" :
{ "project_id" : { "type" : "string", "index" : "not_analyzed" } }
},
"baby" :
{ "_parent" :
{ "type" : "mama" },
"properties" :
{ "project_id" : { "type" : "string", "index" : "not_analyzed" } }
}
}
}'
curl -XPOST "http://localhost:9200/_aliases" -d '
{ "actions":
[ { "add":
{ "alias": "family1",
"index": "famtest",
"routing": "100",
"filter":
{ "term": { "project_id": "100" } }
}
} ]
}'
curl -XPOST "http://localhost:9200/_aliases" -d '
{ "actions":
[ { "add":
{ "alias": "family2",
"index": "famtest",
"routing": "200",
"filter":
{ "term": { "project_id": "200" } }
}
} ]
}'
现在让我们做一些妈妈:
curl -XPOST localhost:9200/family1/mama/1 -d '{ "name" : "Family 1 Mom", "project_id" : "100" }'
curl -XPOST localhost:9200/family2/mama/2 -d '{ "name" : "Family 2 Mom", "project_id" : "200" }'
现在可以通过/ familyX / _search获取这些文档。所以现在我们想要添加一个婴儿:
curl -XPOST localhost:9200/family1/baby/1?parent=1 -d '{ "name": "Fam 1 Baby","project_id" : "100" }'
不幸的是,ES并不喜欢这样:
{"error":"ElasticSearchIllegalArgumentException[Alias [family1] has index routing associated with it [100], and was provided with routing value [1], rejecting operation]","status":400}
那么......任何想法如何使用别名路由并仍然设置父ID?如果我理解这一点,那应该不是问题:所有项目操作(在这种情况下,“family1”)都会通过别名,因此无论如何,父文档和子文档将会在同一个分片上结束。是否有一些替代方法来设置父ID,而不会干扰路由?
感谢。如果我可以更具体,请告诉我。
答案 0 :(得分:1)
有趣的问题!您已经知道父ID也用于路由,因为必须在与父文档相同的分片中索引子项。您尝试做的很好,因为父母和孩子会属于同一个家庭,因此无论如何都要在同一个分片中,因为您在家庭别名中配置了路由。
但我担心父ID的优先级高于别名中定义的路由,后者会被覆盖,但这是不可能的,这就是你得到错误的原因。实际上,如果您再次尝试在索引请求中提供路由,则可以正常工作:
curl -XPOST 'localhost:9200/family1/baby/1?parent=1&routing=100' -d '{ "name": "Fam 1 Baby","project_id" : "100" }'