Встроенный поисковый механизм Tom Select представляет собой комбинацию индексирования данных, текстовой нормализации и скоринговой модели, позволяющей ранжировать варианты без необходимости подключения внешних библиотек полнотекстового поиска. Он рассчитан на работу как с небольшими списками, так и с динамически загружаемыми наборами данных, сохраняя предсказуемое поведение при масштабировании.
Поисковый процесс внутри Tom Select строится вокруг последовательности операций:
Каждый элемент списка опций рассматривается как объект с набором
полей, указанных в searchField. Поиск выполняется не по
всему объекту целиком, а по заранее определённым ключам.
new TomSelect("#select", {
valueField: "id",
labelField: "title",
searchField: ["title", "description"]
});
Параметр searchField определяет, какие свойства объекта
участвуют в поиске. Tom Select не строит полноценный инвертированный
индекс, но выполняет предобработку данных для ускорения сравнения.
Особенности:
При наличии нескольких полей совпадение в первом поле имеет больший вес, чем во втором, даже при одинаковом тексте.
Перед сравнением строки проходят нормализацию:
ignoreDiacritics)Это обеспечивает устойчивость к различным формам ввода:
Запрос пользователя разбивается на токены по пробелам и знакам пунктуации. Каждый токен рассматривается независимо и сравнивается с индексируемыми строками.
Пример:
"new york city"
→ ["new", "york", "city"]
Поведение зависит от настройки searchConjunction:
and — требуется совпадение всех токеновor — достаточно совпадения одного токенаПо умолчанию используется режим and, что повышает
точность поиска.
Каждое совпадение получает числовой вес, который влияет на сортировку результатов.
Основные факторы:
searchField)Упрощённо скоринг можно представить так:
score = fieldWeight × matchQuality × tokenCoverage
Полное совпадение строки всегда получает максимальный приоритет над частичным.
После вычисления веса все элементы сортируются по убыванию
релевантности. Поведение сортировки контролируется параметром
sortField.
Пример настройки:
new TomSelect("#select", {
searchField: ["title"],
sortField: [
{ field: "title", direction: "asc" }
]
});
Если sortField не задан, используется внутренний
алгоритм ранжирования, основанный на скоринге поиска.
После сортировки применяется фильтрация:
В некоторых конфигурациях используется мягкий порог, при котором слабые совпадения допускаются только при отсутствии более сильных результатов.
Tom Select поддерживает частичные совпадения подстрок. Например:
app может совпасть с Applemic может совпасть с MicrosoftПри этом частичные совпадения имеют меньший вес, чем точные или префиксные.
Особое значение имеют:
Поведение поиска может быть полностью переопределено через
score и filter.
new TomSelect("#select", {
score: function(search) {
return function(item) {
if (item.disabled) return 0;
return item.title.includes(search) ? 1 : 0;
};
}
});
В этом случае стандартный алгоритм игнорируется, и используется пользовательская логика оценки.
При использовании load поиск может выполняться как
локально, так и на сервере.
new TomSelect("#select", {
load: function(query, callback) {
fetch(`/api/search?q=${encodeURIComponent(query)}`)
.then(res => res.json())
.then(data => callback(data));
}
});
В таком режиме встроенный поисковый движок может использоваться:
При работе с тысячами элементов ключевую роль играет стоимость операции сравнения строк. Встроенный движок оптимизирован следующим образом:
Несмотря на отсутствие полноценного индекса, структура позволяет сохранять приемлемую производительность при среднем объёме данных.
Tom Select может переиспользовать результаты предыдущих вычислений при повторяющихся запросах. Это особенно заметно при вводе текста с клавиатуры, когда последовательность запросов имеет общий префикс.
Пример поведения:
mmamanРезультаты предыдущих шагов частично переиспользуются, снижая нагрузку на пересчёт скоринга.
На поведение поиска влияют следующие параметры:
searchField — область поискаsearchConjunction — логика объединения токеновignoreDiacritics — нормализация символовsortField — сортировка результатовmaxOptions — ограничение числа результатовscore — кастомная функция оценкиКомбинация этих параметров фактически формирует уникальный профиль поискового поведения для каждого экземпляра компонента.
Если несколько элементов имеют одинаковый скор, применяется дополнительная стабилизирующая сортировка:
sortField при равенстве скоровЭто предотвращает «прыгающий» порядок результатов при повторных вычислениях.
Поисковый движок не зависит от языка, но его эффективность определяется качеством нормализации:
При этом морфологический анализ отсутствует, поэтому формы слов рассматриваются как разные строки без лемматизации.