Использование typeahead Bloodhound для обработки искомых элементов, которые имеют псевдонимы или синонимы.

Я пытаюсь реализовать что-то похожее на поле ввода предложения тега stackoverflow. В базе данных у меня есть две таблицы: одна для тегов, а другая для тагалиасов или синонимов тегов (tagSynonyms).

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


person Seme1    schedule 26.09.2014    source источник


Ответы (1)


Просто отправьте введенный термин на сервер и выполните sql-оператор, подобный этому:

выберите имя из тега t ​​левого внешнего соединения tagSyms s на s.tagID=t.tagID, где s.alias=$searchstring ИЛИ t.tagName=$searchstring

и вернуть данные в формате json. JSON-формат: { val: 'тэг' }

На сайте клиента:

var engine = new Bloodhound({
  name: 'tags',
  remote: 'http://example.com/tags?q=%QUERY',
  datumTokenizer: function(d) {
    return Bloodhound.tokenizers.whitespace(d.val);
  },
  queryTokenizer: Bloodhound.tokenizers.whitespace
});
engine.initialize();

$("#inputField").typeahead(...);

Также взгляните на ключи displayKey и template в typeahead.js.

Когда вам нужен отсортированный список, все будет в порядке, если sql будет упорядочен.

Вы контролируете, что в поле предложений отображается с помощью шаблонов:

Например, если вы хотите также отобразить счетчик, просто отредактируйте JSON на { val: 'tagname', counter:x }, а тип впереди на:

.typeahead(
        ....,{
        templates:{
            suggestion:function(data){
               return "<p>"+data.val+"(used: "+data.counter+" times)</p>";
            }
        },
        source: engine.ttAdapter()

});

person anstue    schedule 27.09.2014
comment
Большое спасибо за ответ. Ожидается, что SQL-запрос на стороне сервера вернет отсортированный список тегов в зависимости от частоты их использования. Другими словами, вместе с именем каждого тега мне также нужно передать счетчик. Отображаемые предложения должны отображать возможные теги в порядке убывания на основе значения счетчика, связанного с именем каждого тега. Возможно ли реализовать это с помощью Bloodhound? - person Seme1; 28.09.2014
comment
Некоторые из синонимов, которые у меня есть, полностью отличаются от терминов запроса. Как я могу сказать ищейке, что они одинаковые? например, когда пользователь вводит голубой цвет, у меня в базе данных сохраняется голубой цвет как синоним синего. В списке предложений я хотел бы, чтобы синий отображался вместо голубого, даже если пользователь набрал голубой. - person Seme1; 28.09.2014