2016-03-02 5 views
1

Я недавно напал на typeahead/bloodhound и попытался реализовать его на странице с локальными данными. Получил все это и работал, но остался один вопрос.Typeahead для управления синонимами?

Возможно ли реализовать какой-то статический список синонимов? Я хотел бы обрабатывать примеры, как:

  • больницы <> Sygehus
  • Куб <> Кубэ

Поиск одного или другого нужно либо искать на обоих, или поиск, если результат не были возвращены на первое слово. Список, вероятно, не будет содержать больше, чем несколько слов, поэтому я думаю о ручном обновлении списка.

Но где/как это можно сделать? Моя настройка аналогична примеру для нескольких наборов данных на typeahead.js (typeahead example)

ответ

0

Я сделал решение своей проблемы, но, вероятно, не очень красиво. Question about accents

Я нашел вдохновение в этом примере и сделал двух ищейков с нормализацией. Один с "Cube" : "Kube" и один с "Kube" : "Cube". Тогда я получаю результаты как для Kube, так и для Cube, а не только для Cube или Kube (используя только одну нормализацию).

 var charMap = { 
     'a': /[àáâã]/gi, 
     'c': /[ç]/gi, 
     'e': /[èéêë]/gi, 
     'i': /[ïí]/gi, 
     'o': /[ôó]/gi, 
     'oe': /[œ]/gi, 
     'u': /[üú]/gi 
    }; 

var normalize = function (str) { 
    $.each(charMap, function (normalized, regex) { 
     str = str.replace(regex, normalized); 
    }); 
    return str; 
}; 

var queryTokenizer = function (q) { 
    var normalized = normalize(q); 
    return Bloodhound.tokenizers.whitespace(normalized); 
}; 

var foo_keywords = [ 
{name: 'foo1', keywords_query: normalize('foo1à, foo1ç, foo1ê'), keywords: 'foo1à, foo1ç, foo1ê', picture: '/img/foo1.png'}, 
{name: 'foo2', keywords_query: normalize('foo2à, foo2ç, foo2ê'), keywords: 'foo2à, foo2ç, foo2ê', picture: '/img/foo2.png'}, 
{name: 'foo3', keywords_query: normalize('foo3à, foo3ç, foo3ê'), keywords: 'foo3à, foo3ç, foo3ê', picture: '/img/foo3.png'} 
]; 

var foo = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace(normalize('keywords_query')), 
    queryTokenizer: queryTokenizer, 
    local: foo_keywords 
}); 

foo.initialize(); 

$('.typeahead').typeahead(
    { 
     hint: true, 
     highlight: true, 
     minLength: 1, 
    }, 
    { 
     name: 'foo', 
     displayKey: 'name', 
     source: foo.ttAdapter(), 
     templates: { 
      suggestion: function(el){return '<div style=\"display:table;\"><div style=\"display:table-cell;text-align:left;margin:0;width:100px;\"><img src="'+el.picture+'" style=\'width:100px;height:auto;\'/></div><div style=\"display:table-cell;text-align:left;margin:0;padding:10px;vertical-align:top;">'+el.name+'<br><font style=\"font-size:0.6em;color:#7b7b7b;\">'+el.keywords+'</font></div></div>'} 
     } 
    } 
); 

А затем просто используя два источника с помощью ttAdapter().

+0

Теперь моя единственная проблема заключается в том, что результат будет иметь дубликаты для результатов, не входящих в список нормализации. хммм – user1865820

 Смежные вопросы

  • Нет связанных вопросов^_^