Спасибо за публикацию кода точно в том виде, в котором вы его выполняете, и в том смысле, что он может быть скопирован и запущен.Это очень помогает.
В JSON вашего отображения отсутствовала запятая, но ошибка была проигнорирована, поскольку вы установили ignore="400"
.
Вот как должен выглядеть фиксированный скрипт:
import time
from elasticsearch import Elasticsearch
es = Elasticsearch()
# fix typo - missing comma after "nested"
mapping = '''{
"mappings": {
"tablets": {
"properties": {
"Names": {
"type": "nested",
"properties":{
"ID": {"type" : "long"},
"Combination": {"type" : "text"},
"Synonyms": {"type" : "text"}
}
}
}
}
}
}'''
# remove ignore="400"
es.indices.create(index="2", body=mapping)
tablets = {
"Names": [
{
"ID": 1,
"Combination": "Paracetamol",
"Synonyms": "Crocin"
}, {
"ID": 2,
"Combination": "Pantaprazole",
"Synonyms": "Pantap"
}
]
}
Нам также нужно установить doc_type
на тот, который объявлен в отображении:
# set doc_type to 'tablets' since this is what we defined in mapping
res = es.index(index="2", doc_type='tablets', id=1, body=tablets)
z = "patient took Pantaprazole."
# allow Elasticsearch to refresh data so it is searchable
time.sleep(2)
res= es.search(index='2',body=
{
"query": {
"nested": {
"path": "Names",
"query": {
"match": {"Names.Combination" : z}
},
"inner_hits": {}
}
}
})
print(res)
ЭтоЭто!Вывод сценария будет выглядеть следующим образом:
{'take': 7, 'timed_out': False, '_shards': {'total': 5, 'success': 5, 'skipped': 0,' не удалось ': 0},' хиты ': {' всего ': 1,' max_score ': 0.6931472,' хиты ': [{' _index ':' 2 ',' _type ':' таблетка ','_id': '1', '_score': 0.6931472, '_source': {'Names': [{'ID': 1, 'Combination': 'Paracetamol', 'Synonyms': 'Crocin'}, {'ID ': 2,' Комбинация ':' Пантапразол ',' Синонимы ':' Пантап '}]},' inner_hits ': {' Имена ': {' hit ': {' total ': 1,' max_score ': 0.6931472, 'hit': [{'_index': '2', '_type': 'tablet', '_id': '1', '_nested': {'field': 'Names', 'offset': 1}, '_score': 0.6931472, '_source': {'ID': 2, 'Combination': 'Pantaprazole', 'Synonyms': 'Pantap'}}]}}}}]}}
Почему я получил это сообщение об ошибке failed to create query
?
Elasticsearch выдал ошибку failed to create query
, потому что ему не удалось создать вложенный запрос против не nested
поле.
Поле должно было быть nested
, почему не так?
В отображении была опечатка, пропущена запятая.Elasticsearch не удалось поставить отображение.Почему не произошел сбой сценария?
Поскольку в вызове Python для es.indices.create()
был установлен параметр ignore="400"
, из-за чего клиент Python Elasticsearch игнорировал HTTP 400код ответа , который, в свою очередь, соответствует «ошибочной форме данных».
Так почему же Elasticsearch позволил вам выполнять другие запросы, такие как индексация документов и поиск?
Потому чтоПо умолчанию Elasticsearch не потребует сопоставления и выведет его из структуры документов.Это называется динамическое отображение .
Надеюсь, это поможет!