2017-02-18 16 views
1

を使用して作成した(以下に示すように)私は、次のコードを使用して、ESにJSONファイルをプッシュ: 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ファイル

をIは、マッピングを更新しようとしたtermクエリを使用それでもすべてのインデックスが表示されます。用語クエリを使用して"data.keyword" = "abc"のような1つのキーワードのみを照会することはできません。

+0

Iは、次の 'term'クエリ試み: ' { "クエリ":{ "ネスト":{ "パス": "データ"、 "クエリ":{ "一致":{ " daya.keyword ":『XYZ』 }} }} }' これは、期待される結果 – vku

+0

ではありませんすべてのインデックスは、あなたが 'フルquery'の代わりに、上記のクエリの本体だけを提供することができます取得しますか? 可能であれば、複数のサンプル文書と期待される結果で質問を更新することもできますか? "XYZ": ' { "学生":[ { "名": "ABC"、 "件名": "computer_science" }、 { "名前" – avr

+0

@avrは、ここでは別のサンプルドキュメントです、 "件名": "物理学" } ] } ' – 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 ], 
} 

少なくとも1つのネストされたオブジェクトのにxyzキーワードが含まれている限り、投稿したクエリはどのドキュメントにも一致します。説明のために上記のリンクを読むことをお勧めします。

+0

あなたが言及したリンクを読んだことがありますが、ElasticSearchのドキュメントによれば、弾性検索に向いているJSONの構造を変更する必要があります。一致するエントリだけを抽出します。インナーオブジェクトまたは各要素をプッシュ '{ "キーワード": "XYZ"、 "リスト":[ { "item_val": "another_val" } ]、 "another_key": "PQR" }' Separetely 。 – vku

+0

test_indexのマッピングテンプレートを定義しましたか?はいの場合は、質問を編集してそれを含めることができますか?それぞれのドキュメントを別々の要素として格納することをお勧めしますが、実際にそのクエリを使用してオブジェクトを入れ子にしたい場合は、データ型フィールドをtypeオブジェクトの代わりに入れ子にしてマップする必要があります。隠された別の文書として索引付けされています。 – deathyr