【问题标题】:bloodhound multiple dataset cause typeahead template issueBloodhound 多个数据集导致 typeahead 模板问题
【发布时间】:2015-11-12 10:44:31
【问题描述】:

我有本地弹性搜索服务器,安装并运行。

我实例化了 2 个寻血猎犬对象跟随示例(由于声誉限制,无法发布链接)

如果我按原样使用输出,我的结果来自我的 2 数据源,没问题。

当我想使用远程:转换或过滤选项来格式化数据,使用自定义模板时,我很麻烦,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...}

但是,在每个对象的远程部分,我可以看到带有两个对象名称的转换和准备部分(有屏幕截图):

first object

seconde object

如果我从 Bloodhound 实例和 typeahead 模板中删除 transform 选项,它会起作用,我会提出建议。

如果我删除第二个猎犬实例和关联模板的 transform,则会显示第一个结果,使用模板,第二个结果显示为原始结果,但它可以工作。

如果我让第二个模板在 typeahead init 中,没有与 Bloodhound 关联的 transform,则显示第二个模板标题,但数据未定义(我想是正常行为)。

所以,不知何故,第二只猎犬的变形破坏了一些东西,但我不知道是什么,以及如何。

我错过了什么,还是做错了什么?

【问题讨论】:

    标签: templates transform typeahead.js bloodhound


    【解决方案1】:

    已解决:

    我必须在查询中添加 size 选项,告诉 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 进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多