2017-02-18 24 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", используя термин query.

+0

Я попытался следующий 'term' запрос: ' { "запрос": { "вложенными": { "путь": "данные", "запрос": { "Матч": { " daya.keyword ":„хуг“ }} }} }' Он извлекает все индексы, которые не является ожидаемым результатом – vku

+0

Можете ли вы предоставить 'полного query' вместо всего тело запроса представленного выше? Можете ли вы также обновить свой вопрос более чем с одним образцом документов и ожидаемым результатом, если это возможно! – avr

+0

@avr вот другой пример документ: ' { "студенты": [ { "имя": "а", "субъект": "computer_science" }, { "имя": "хуг" , "субъект": "Физика" } ] } ' – 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

Вы определили шаблон сопоставления для своего тестового_индекса? Если да, можете ли вы изменить свой вопрос, чтобы включить его? Я бы по-прежнему предлагал хранить каждый документ как отдельный элемент, но если вы действительно хотите использовать этот запрос и удерживать объект вложенным, вам может понадобиться сопоставить поле данных как тип, вложенный вместо объекта типа, так что каждый вложенный объект индексируется как скрытый отдельный документ. – deathyr