bloodhound 多数据集导致 typeahead 模板问题
bloodhound multiple dataset cause typeahead template issue
我有本地弹性搜索服务器,安装并运行。
我实例化了 2 只猎犬 object followig 示例(不能 post link 因为声誉限制)
如果我按原样使用输出,我的结果来自我的 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);
我有两个单独的 object,具有唯一的名称(标识选项):
Bloodhound { identify="nameSuggest", sufficient=50, local=[0], plus...}
Bloodhound { identify="mailSuggest", sufficient=50, local=[0], plus...}
但是,在每个 object 的远程部分,我可以看到带有两个 object 名称的转换和准备部分(有屏幕截图):
如果我从 bloodhound 实例和 typeahead 模板中删除 transform 选项,它就可以工作,而且我有建议。
如果我删除第二个猎犬实例和关联模板的 transform,将显示第一个结果,使用模板,第二个结果显示为原始结果,但它有效。
如果我让第二个模板在 typeahead init 中,没有 bloodhound 关联 transform,第二个模板 header 会显示,但数据未定义(我想是正常行为).
所以,不知何故,第二个猎犬的 transform 打破了一些东西,但我不知道是什么,以及如何。
我是漏掉了什么,还是做错了什么?
已解决:
我必须在查询中添加大小选项,以告诉 elastic 发送更多结果:
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 来测试目的。
我有本地弹性搜索服务器,安装并运行。
我实例化了 2 只猎犬 object followig 示例(不能 post link 因为声誉限制)
如果我按原样使用输出,我的结果来自我的 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);
我有两个单独的 object,具有唯一的名称(标识选项):
Bloodhound { identify="nameSuggest", sufficient=50, local=[0], plus...}
Bloodhound { identify="mailSuggest", sufficient=50, local=[0], plus...}
但是,在每个 object 的远程部分,我可以看到带有两个 object 名称的转换和准备部分(有屏幕截图):
如果我从 bloodhound 实例和 typeahead 模板中删除 transform 选项,它就可以工作,而且我有建议。
如果我删除第二个猎犬实例和关联模板的 transform,将显示第一个结果,使用模板,第二个结果显示为原始结果,但它有效。
如果我让第二个模板在 typeahead init 中,没有 bloodhound 关联 transform,第二个模板 header 会显示,但数据未定义(我想是正常行为).
所以,不知何故,第二个猎犬的 transform 打破了一些东西,但我不知道是什么,以及如何。
我是漏掉了什么,还是做错了什么?
已解决:
我必须在查询中添加大小选项,以告诉 elastic 发送更多结果:
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 来测试目的。