用elasticsearch-py定义parent

时间:2017-03-30 14:04:21

标签: python elasticsearch parent-child

我正在尝试将父/子关系放入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)

不言而喻,如果我遗失了什么,请告诉我。 (我希望这会有所帮助,因为几乎没有关于该主题的文档。)

0 个答案:

没有答案