2017-02-18 152 views
1

我推JSON文件(如下所示)用下面的代码至ES创建: 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" } ] }搜索使用JSON文件

我试图更新所述映射,并且所使用的term查询,但仍它会导致显示所有的指标。我无法使用术语查询仅查询一个关键字,如"data.keyword" = "abc"

+0

我尝试以下'term'查询: '{ “查询”:{ “嵌套”:{ “路径”: “数据”, “查询”:{ “匹配”:{ “ daya.keyword“:‘XYZ’ }} } } } ' 它检索所有的指标是不是预期的结果 – vku

+0

你能否提供充分'而不是query'查询的只是身体的上方设置? 如果可能的话,您是否也可以更新您的问题并提供多个样本文档和预期结果!这里 – avr

+0

@avr是另一个样DOC: ' { “学生”: { “名”: “ABC”, “主题”: “computer_science” }, { “名”: “XYZ” , “受试者”: “物理” } ] } ' – vku

回答

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" 
}, 

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

2

看起来像您有嵌套的对象的问题 https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html

这样做的原因跨对象匹配,如在 内对象阵列所讨论的,是我们的精美的结构化JSON文档是 平坦化入索引的简单键值格式

所以存储的有效文件看起来是这样的:

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

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

+0

感谢您的回答,我确实通读了您提到的链接,通过ElasticSearch文档的说明看起来像我必须更改JSON的结构,以推动弹性搜索,使用相同的结构,我不知道如何查询和只提取匹配的条目,或者我必须使用内的物体或推每个元素'{ “关键字”: “XYZ”, “清单”:[ { “item_val”: “another_val” } ], “another_key”: “PQR” }'Separetely 。 – vku

+0

您是否为您的test_index定义了一个映射模板?如果是的话,你可以编辑你的问题,包括它?我仍然建议将每个文档存储为一个单独的元素,但是如果您确实想要使用该查询并保持对象嵌套,则可能需要将数据字段映射为嵌套类型而不是类型对象,以便每个嵌套对象索引为隐藏的单独文档。 – deathyr