Я получаю некоторые результаты поиска от Elastic в этом формате
{
"took": 267,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1911,
"max_score": 29.118078,
"hits": [
{
"_index": "myIndex",
"_type": "doc",
"_id": "27c9d14495f7732c6756f0d2688874f",
"_score": 21.179974,
"_source": {
"file": {
"filename": "file1.pdf"
},
"content": "samplecontent"
}
},
{
"_index": "myIndex",
"_type": "doc",
"_id": "27c9d14495f7732c6756f0d2688874f",
"_score": 21.179974,
"_source": {
"file": {
"filename": "file2.pdf"
},
"content": "samplecontent"
}
},
{
"_index": "myIndex",
"_type": "doc",
"_id": "27c9d14495f7732c6756f0d2688874f",
"_score": 21.179974,
"_source": {
"file": {
"filename": "file3.pdf"
},
"content": "samplecontent"
}
}
]
}
}
и хотел бы, например, отображать hit.total (1911) в заголовке моей сетки, а также hit.hits._source.file.filename и hit.hits._source.content в моей сетке. Я полагаю, что мне нужно настроить модель hasMany / ownTo, но меня немного смущают какие-либо документы / примеры, которые я нашел в отношении того, как настроить это отношение, а также выбрать и выбрать эти вложенные поля для отображения в сетке. Любая помощь или разъяснения будут оценены
Мой магазин определен как
Ext.define('search.store.results', {
extend: 'Ext.data.Store',
alias: 'store.results',
model: 'search.model.hits',
autoLoad: false,
proxy: {
type: 'ajax',
url: 'http://myServer:9200/_search',
reader: {
type: 'json',
rootProperty: 'hits'
}
}
});
А мои модели определены как
база
Ext.define('search.model.Base', {
extend: 'Ext.data.Model',
schema: {
namespace: 'search.model'
}
});
хиты
Ext.define('search.model.hits', {
extend: 'search.model.Base',
fields: [
{name: 'total', type: 'number'}
],
hasMany:{
model: 'hit',
name: 'hit'
}
});
хит
Ext.define('search.model.hit', {
extend: 'search.model.Base',
fields: [
{name: '_source', type: 'source'}
]
});
источник
Ext.define('search.model.source', {
extend: 'search.model.Base',
fields: [
{name: 'file', type: 'file'},
{name: 'content', type: 'string'}
]
});
и файл
Ext.define('search.model.file', {
extend: 'search.model.Base',
fields: [
{name: 'filename', type: 'string'}
]
});
однако, когда я загружаю свою страницу, я сразу же получаю эти ошибки
Uncaught Error: [Ext.createByAlias] Unrecognized alias: data.field.source
и
Uncaught Error: [Ext.createByAlias] Unrecognized alias: data.field.file
ОБНОВЛЕНИЕ: Вот как будут выглядеть результаты, если я поменяю свои модели на использование 'reference' вместо hasMany
Ext.define('search.model.hits', {
extend: 'search.model.Base',
fields: [
{name: 'total', type: 'number'},
{name: 'hits', reference: 'hit'}
]
});
Ext.define('search.model.hit', {
extend: 'search.model.Base',
fields: [
{name: '_source', reference: 'source'}
]
});
Ext.define('search.model.source', {
extend: 'search.model.Base',
fields: [
{name: 'file', reference: 'file'},
{name: 'content', type: 'string'}
]
});
Ext.define('search.model.file', {
extend: 'search.model.Base',
fields: [
{name: 'filename', type: 'string'}
]
});
Прослушиватель «load» моего магазина отображает эту информацию, разбитую на отдельные структуры данных, вместо того, чтобы все находилось под структурой «data», где находится стрелка (где я привык находить записи своего хранилища)
ОБНОВЛЕНИЕ № 2:
Если я изменяю свою модель «хитов» для использования hasMany, но оставляю остальное с помощью «ссылки», кажется, что это сработает, если правильно сгруппировать мои данные в записях - теперь мне просто нужно знать, как отображать вложенные результаты в сетке
Ext.define('search.model.hits', {
extend: 'search.model.Base',
fields: [
{name: 'total', type: 'number'}
],
hasMany:{
model: 'hit',
name: 'hit'
}
});
производит