Множественный набор данных Bloodhound вызывает проблему шаблона typehhead
У меня локальный эластичный поисковый сервер, установлен и запущен.
Я создаю 2 примера следования объекта Bloodhound (не могу опубликовать ссылку из-за ограничений репутации)
Если я использую вывод, как есть, у меня есть результаты из моего источника данных 2, никаких проблем.
Когда я хочу использовать параметр remote: transform или filter для форматирования данных, для использования собственного шаблона, у меня возникают проблемы, когда шаблон 2 никогда не получает вызов.
Вот мой код:
Первый бладхаунд:
var nameSuggest = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace,
queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
identify: 'nameSuggest',
sufficient: 50,
remote: {
url: 'http://localhost:9200/test2/_suggest?pretty',
prepare: function (query, settings) {
settings.type = "POST";
settings.contentType = "application/json; charset=UTF-8";
search_payload = {
"suggest": {
"text": query,
"completion": {
"field": "suggest"
}
}
};
settings.data = JSON.stringify(search_payload);
return settings;
},
transform: function(response) {
return $.map(response.suggest[0].options, function (option) {
return {
optionText: option.text,
optionId:option.payload.id
};
});
}
}
});
Второй набор данных:
var mailSuggest = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace,
queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
identify: 'mailSuggest',
sufficient: 50,
remote: {
url: 'http://localhost:9200/test2/_suggest?pretty',
prepare: function (query, settings) {
settings.type = "POST";
settings.contentType = "application/json; charset=UTF-8";
search_payload = {
"suggestMail": {
"text": query,
"completion": {
"field": "suggest2"
}
}
};
settings.data = JSON.stringify(search_payload);
return settings;
},
transform: function(response) {
return $.map(response.suggestMail[0].options, function (option) {
return {
optionText2: option.text,
optionId2:option.payload.id
};
});
}
}
});
И напечатать
jQuery('#topSearch').typeahead({
name:'topSearch',
hint: true,
highlight: true,
limit: 20
},
{
name: 'nameSuggest',
display: 'data',
source: nameSuggest,
templates: {
header: '<div><h3 class="">Noms</h3></div>',
suggestion: function (data) {
console.log("Name");
return '<div>'+data.optionId+' - '+data.optionText+'</div>';
}
}
},
{
name: 'mailSuggest',
display: 'data',
source: mailSuggest,
templates: {
header: '<div><h3 class="">Mails</h3></div>',
suggestion: function (data) {
console.log("Mail");
return '<div>'+data.optionText2+'</div>';
}
}
}
);
Когда я делаю:
console.log(nameSuggest);
console.log(mailSuggest);
У меня есть два отдельных объекта с уникальными именами (опция идентификации):
Bloodhound { identify="nameSuggest", sufficient=50, local=[0], plus...}
Bloodhound { identify="mailSuggest", sufficient=50, local=[0], plus...}
но в удаленной части каждого объекта я вижу раздел преобразования и подготовки с двумя именами объектов (есть скриншот):
Если я уберу опцию трансформации из экземпляров Bloodhound и шаблонов для typeahead, это сработает, и я буду предлагать.
Если я удаляю преобразование второго экземпляра Bloodhound и связанного с ним шаблона, отображаются первые результаты вместе с шаблоном, а второй результат отображается необработанным, но это работает.
Если я позволю второму шаблону в initahead typeahead без преобразования, связанного с Bloodhound, отобразится заголовок второго шаблона, но данные не определены (нормальное поведение, я полагаю).
Так или иначе, трансформация второго бладхаунда что-то сломает, но я не могу понять, что и как.
Я что-то пропустил или сделал что-то не так?
1 ответ
Решено:
Я должен добавить опцию размера к запросу, чтобы сказать эластичный, чтобы отправить больше результата:
var mailSuggest = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace,
queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
identify: 'mailSuggest',
sufficient: 50,
remote: {
url: 'http://localhost:9200/test2/_suggest?pretty',
prepare: function (query, settings) {
settings.type = "POST";
settings.contentType = "application/json; charset=UTF-8";
search_payload = {
"suggestMail": {
"text": query,
"completion": {
"field": "suggest2",
"size": 20
}
}
};
settings.data = JSON.stringify(search_payload);
return settings;
},
transform: function(response) {
return $.map(response.suggestMail[0].options, function (option) {
return {
optionText2: option.text,
optionId2:option.payload.id
};
});
}
}
});
Я попробовал с 20 для тестирования prupose.