Настройка параметров поиска

Поиск в Tom Select основан на комбинации внутреннего механизма ранжирования, конфигурации полей индексации и возможности переопределения алгоритма через пользовательские функции. Поведение поиска определяется не одним параметром, а набором взаимосвязанных настроек, которые управляют тем, как данные индексируются, сравниваются с запросом и сортируются в выдаче.

Основой выступает параметр searchField, определяющий, какие поля объекта данных участвуют в поиске. Если элементы представляют собой сложные структуры, именно этот массив задаёт границы поискового индекса.

new TomSelect("
  searchField: ["title", "description", "tags"]
});

Каждое поле рассматривается как источник текстовых токенов. При поиске Tom Select формирует внутренний индекс и сравнивает введённый запрос с каждым значением из указанных полей. Чем больше полей включено, тем выше полнота поиска, но тем больше вычислительная нагрузка при больших наборах данных.


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

Каждому элементу присваивается числовой score, отражающий релевантность:

  • точное совпадение в начале строки имеет максимальный вес
  • совпадения внутри строки имеют сниженный вес
  • частичные и нестрогие совпадения учитываются, но ранжируются ниже

Эта модель позволяет реализовать «интеллектуальный» поиск без подключения внешних движков.


Поведение алгоритма можно модифицировать через параметр score, который позволяет полностью переопределить функцию ранжирования:

new TomSelect("#select", {
  searchField: ["title"],
  score: function(search) {
    return function(item) {
      let value = item.text.toLowerCase();
      let query = search.toLowerCase();

      if (value === query) return 100;
      if (value.startsWith(query)) return 50;
      if (value.includes(query)) return 10;
      return 0;
    };
  }
});

В этой модели функция score возвращает другую функцию, принимающую элемент и возвращающую числовую оценку. Это позволяет внедрять полностью кастомные правила сортировки: учитывать бизнес-логику, приоритеты пользователей, историю выбора или внешние данные.


Следующий важный параметр — searchConjunction. Он определяет логику объединения нескольких слов в запросе.

new TomSelect("#select", {
  searchField: ["title"],
  searchConjunction: "and"
});

Возможны два режима:

  • and — элемент должен соответствовать всем словам запроса
  • or — достаточно совпадения хотя бы одного слова

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


Фильтрация может быть дополнительно ограничена через shouldLoad, который управляет моментом начала загрузки и активации поиска. Это особенно важно при работе с удалёнными источниками данных.

new TomSelect("#select", {
  load: function(query, callback) {
    fetch(`/api/items?q=${query}`)
      .then(res => res.json())
      .then(data => callback(data));
  },
  shouldLoad: function(query) {
    return query.length > 2;
  }
});

В этом примере поиск не запускается до тех пор, пока пользователь не введёт минимум три символа. Это снижает количество запросов к серверу и уменьшает нагрузку на API.


При работе с удалённым поиском важна синхронизация локального и серверного фильтров. Tom Select позволяет комбинировать локальный поиск с серверной логикой, где сервер возвращает предварительно отфильтрованные данные, а клиент применяет дополнительную сортировку через score.

Такой подход полезен при больших базах данных, где сервер отвечает за грубую фильтрацию, а клиент — за точность и UX.


Параметр maxOptions ограничивает количество отображаемых результатов после поиска:

new TomSelect("#select", {
  searchField: ["title"],
  maxOptions: 10
});

Это ограничение влияет только на визуальную выдачу, не на сам процесс поиска. Даже если найдено 1000 совпадений, пользователь увидит только первые 10, отсортированные по релевантности.


Дополнительное влияние на результат поиска оказывает sortField. Хотя он чаще ассоциируется с сортировкой уже выбранных элементов, в контексте поиска он определяет порядок отображения результатов:

new TomSelect("#select", {
  searchField: ["title"],
  sortField: [
    { field: "score", direction: "desc" },
    { field: "title", direction: "asc" }
  ]
});

Здесь используется приоритетная сортировка: сначала по релевантности, затем по алфавиту. Это стабилизирует выдачу и делает поведение поиска предсказуемым.


При необходимости полного контроля над поисковым процессом используется комбинация score и кастомной подготовки данных. Например, можно заранее нормализовать строки, добавлять скрытые поля индексации или внедрять веса:

new TomSelect("#select", {
  searchField: ["title", "keywords"],
  score: function(search) {
    return function(item) {
      let base = item.score || 0;
      let text = item.title.toLowerCase();

      let bonus = text.startsWith(search.toLowerCase()) ? 20 : 0;

      return base + bonus;
    };
  }
});

Такой подход превращает поиск в гибридную систему, где учитываются как статические веса, так и динамическое соответствие запросу.


Отдельного внимания требует поведение поиска при пустом запросе. В этом случае Tom Select либо показывает все элементы, либо применяет ограничение через maxOptions и sortField. Это поведение может использоваться для реализации списка «популярных» или «рекомендуемых» значений без дополнительной логики.


Внутренний механизм индексирования оптимизирован под повторяющиеся запросы. При изменении строки поиска не происходит полный пересчёт структуры данных, а используется инкрементальная фильтрация уже построенного индекса. Это снижает стоимость повторных операций и делает ввод в поле поиска плавным даже при больших наборах данных.


Комбинация searchField, searchConjunction, score, load и sortField формирует полный контур управления поиском. Изменение любого из этих параметров влияет не только на выдачу, но и на производительность, сетевую нагрузку и пользовательское восприятие точности результатов.