我正在尝试将父/子关系放入ElasticSearch。我能够让我的父母进入ES,但当我尝试添加子对象时,我得到以下错误
elasticsearch.exceptions.RequestsError: TransportError(400:, 'illegal_argument_exception', "Can't specify parent if no parent field has been configured")
我明白,我必须告诉ES,我的父母实际上是映射中的父母。但是在哪里以及如何?
这就是我现在这样做的方式:
# the parent
es.index(index='www01', doc_type='domain', id=k, body=json.dumps(rest))
# the child
es.index(index='www01', doc_type='framework', id=key, body=json.dumps(value), parent=k)
修改
好的。我想我现在已经有了。您必须先将显式偏离标准设置的所有内容输入到映射中,然后首先使用该映射创建一个空索引
在此映射中,您必须说您的子类型具有特定类型的父类型。 (ElasticSearch文档很清楚)RTFM
在空索引上创建特定映射后,您可以将您的内容放入。
注意:您不必在映射中指定所有内容,只需指定不是“标准”的所有内容。所以一开始就足以给出关系。如果您稍后想要说某些字段是日期或地理坐标,您可以稍后指定。但请记住,您必须先清空索引。 在某处保存您的数据!
这是我做的:
def del_all_indices():
print "----- deleting the following indices (not >>.kibana<<) -----"
for idx in es.indices.get('*'):
print idx
if not idx == ".kibana":
es.indices.delete(index=idx, ignore=[400, 404])
print "----- remaining indices -----"
for idx in es.indices.get('*'):
print idx
create_index_body = {
"mappings": {
"domain": {},
"framework": {
"_parent": {
"type": "domain"
}
}
}
}
del_all_indices()
es.indices.create(index='www01', body=create_index_body)
# the parent
es.index(index='www01', doc_type='domain', id=k, body=json.dumps(rest))
# the child
es.index(index='www01', doc_type='framework', id=key, body=json.dumps(value), parent=k)
不言而喻,如果我遗失了什么,请告诉我。 (我希望这会有所帮助,因为几乎没有关于该主题的文档。)