搜索使用json文件创建的弹性搜索索引

时间:2017-02-18 03:03:24

标签: json elasticsearch nested parent-child

我使用以下代码将json文件(如下所示)推送到ES: # kubeadm init with open('test.json','rb') as payload: headers = {'content-type': 'application/json'} r = requests.post('http://localhost:9200/test_nest_json/1',data=payload, verify=False, headers=headers)

我尝试更新映射并使用{ "data": [ { "keyword": "abc", "lists": [ { "item_val": "some_val" } ], "another_key": "some_key" }, { "keyword": "xyz", "lists": [ { "item_val":"another_val" } ], "another_key": "pqr" } ] }查询但仍然会导致显示所有索引。我无法使用术语查询仅查询term这样的关键字。

2 个答案:

答案 0 :(得分:2)

看起来你遇到了嵌套对象的问题 https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html

  

这种跨对象匹配的原因,如数组中所讨论的   Inner Objects,是我们结构精美的JSON文档   在索引

中展平为简单的键值格式

所以存储的有效文档如下所示:

{
  "data.keyword":            [ abc, xyz ],
  "data.another_key":        [ some_key, pqr ],
}

这意味着您发布的查询将匹配任何文档,只要至少一个嵌套对象包含xyz关键字。我建议您阅读上面的链接以获得澄清。

答案 1 :(得分:1)

这对我有用:

es.indices.refresh(index="test-index")
with open('abc.json','rb') as payload:
json_data = json.load(payload);
leng = len(json_data["data"])
for i in range (leng):
    doc = json.dumps(json_data["data"][i]);
    res = es.index(index="sample-index", doc_type='pdf',id=str(uuid.uuid4()), body=doc)

我正在解析json并逐个提取数组项并将其推送到ElasticSearch。

{
        "keyword": "abc", 
        "lists": [
            {
                "item_val": "some_val"
            }
        ], 
        "another_key": "some_key"
},  

仍在寻找优化的解决方案。