2017-02-18 81 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