我使用以下代码将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
这样的关键字。
答案 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"
},
仍在寻找优化的解决方案。