Что такое Bloodhound.tokenizers.obj.whitespace

Все, я пытался применить Twitter typeahead и Bloodhound в свой проект на основе некоторого рабочего образца, но я не могу понять приведенный ниже код.

datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'),
queryTokenizer: Bloodhound.tokenizers.whitespace,

Исходный код выглядит так, как показано ниже.

var songlist = new Bloodhound({
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                limit: 10,
                remote: '/api/demo/GetSongs?searchTterm=%QUERY'

            });

В официальном документе только что сказано:

datumTokenizer - функция с подписью (датум), которая преобразует датум в массив строковых токенов. Необходимый.

queryTokenizer - функция с сигнатурой (запросом), преобразующая запрос в массив строковых токенов. Необходимый.

Что это значит ? Не мог бы кто-нибудь помочь мне рассказать об этом больше, чтобы я лучше понимал?


person Joe.wang    schedule 28.10.2015    source источник
comment
Это действительно недостаточно документировано. У меня сложилось впечатление, что когда пользователь делает запрос, скажем, Dog cat, пробел queryTokenizer разбивает его на пробелы, в результате получается массив типа ["Dog", "cat"]. Затем, когда приходят результаты, datumTokenizer также разделяет их. Итак, если у вас есть результат с названием песни Dogs and cats rock out, он также будет разделен на массив. Наконец, Bloodhound сравнивает два массива, и, если весь массив запроса находится в массиве данных, он считает это совпадением. Я уверен в этом примерно на 80%.   -  person mlissner    schedule 02.12.2015


Ответы (2)


Я нашел здесь полезную информацию:

https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

Наиболее распространенные методы токенизации разбивают заданную строку на пробелы или символы, не являющиеся словами. Bloodhound предоставляет готовые реализации для этих методов:

  // returns ['one', 'two', 'twenty-five']
  Bloodhound.tokenizers.whitespace('  one two  twenty-five');

  // returns ['one', 'two', 'twenty', 'five']
  Bloodhound.tokenizers.nonword('  one two  twenty-five');

Для токенизации запроса вы, вероятно, захотите использовать один из перечисленных выше методов. Для токенизации данных здесь вы можете сделать что-то более продвинутое.

Для датумов иногда требуется, чтобы токены извлекались из более чем одного свойства. Например, если вы создавали поисковую систему для репозиториев GitHub, вероятно, было бы разумно иметь токены, производные от имени репо, владельца и основного языка:

  var repos = [
    { name: 'example', owner: 'John Doe', language: 'JavaScript' },
    { name: 'another example', owner: 'Joe Doe', language: 'Scala' }
  ];

  function customTokenizer(datum) {
    var nameTokens = Bloodhound.tokenizers.whitespace(datum.name);
    var ownerTokens = Bloodhound.tokenizers.whitespace(datum.owner);
    var languageTokens = Bloodhound.tokenizers.whitespace(datum.language);
    
    return nameTokens.concat(ownerTokens).concat(languageTokens);
  }

Также может быть сценарий, в котором вы хотите, чтобы токенизация данных выполнялась на бэкэнде. Лучший способ сделать это - просто добавить свойство к вашим данным, содержащее эти токены. Затем вы можете предоставить токенизатор, который просто возвращает уже существующие токены:

  var sports = [
    { value: 'football', tokens: ['football', 'pigskin'] },
    { value: 'basketball', tokens: ['basketball', 'bball'] }
  ];

  function customTokenizer(datum) { return datum.tokens; }

Есть много других способов токенизации данных, на самом деле это просто зависит от того, чего вы пытаетесь достичь.

К сожалению, эту информацию было нелегко найти в основной документации.

person davew    schedule 20.04.2017

Это токен, используемый для разделения данных или запроса на массив слов для выполнения поиска / сопоставления. datumTokenizer ссылается на ваши данные, а queryTokenizer - на сделанный запрос (обычно текст, введенный во входных данных).

Если ваши данные представляют собой массив объектов (например, json), datumTokenizer позволяет вам указать, в каком поле (ах) вашего объекта вы хотите выполнить поиск. Например, если вы хотите выполнить поиск по полям имени и кода, вы можете ввести что-то вроде Bloodhound.tokenizers.obj.whitespace(['name','code']) или указать настраиваемую функцию.

Дополнительную информацию можно найти по адресу: https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

person sunix    schedule 13.04.2016