Параметры поиска

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

Включение и отключение поискового механизма

searchEnabled определяет наличие поисковой строки и самой логики поиска внутри компонента.

searchEnabled: true

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

При true активируется фильтрация элементов, основанная на строке поиска и алгоритме сопоставления.


Ограничение области поиска

searchChoices управляет тем, какие элементы участвуют в поиске.

searchChoices: true
  • true — поиск выполняется по списку доступных вариантов (choices)
  • false — поиск отключается даже при включённом searchEnabled
  • в некоторых конфигурациях может использоваться для разделения логики пользовательских элементов и предзаполненных значений

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


Минимальный порог активации поиска

searchFloor задаёт минимальное количество символов, после которого начинается фильтрация списка.

searchFloor: 2

Поведение:

  • при вводе меньшего количества символов поиск не выполняется
  • список остаётся в исходном состоянии
  • предотвращается избыточная нагрузка при частичном вводе

Типичный диапазон значений — от 0 до 3. Нулевое значение означает мгновенный запуск поиска с первого символа.


Ограничение количества результатов

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

searchResultLimit: 10

Алгоритм поиска может находить большое количество совпадений, особенно при использовании нечеткого сопоставления. Ограничение результата выполняет две функции:

  • снижает визуальную перегрузку интерфейса
  • ускоряет отрисовку списка
  • повышает релевантность за счёт показа только верхних совпадений

Если значение не задано, отображаются все найденные элементы.


Поля, участвующие в поиске

searchFields определяет структуру данных, по которым выполняется сравнение.

searchFields: ['label', 'value']

Choices.js хранит каждый элемент как объект, содержащий как минимум:

  • label — отображаемый текст
  • value — значение элемента
  • customProperties — пользовательские метаданные

Настройка searchFields позволяет указать, какие из этих полей учитываются при поиске.

Примеры поведения:

  • поиск только по label подходит для UI-ориентированных списков
  • добавление value полезно при кодированных справочниках
  • включение customProperties позволяет искать по дополнительным атрибутам (например, категории, идентификаторы, теги)

Алгоритм поиска и Fuse.js

Внутренний механизм поиска Choices.js основан на нечетком сравнении строк и концепции взвешенного совпадения. В современных версиях используется интеграция с библиотекой Fuse.js, которая отвечает за:

  • оценку релевантности совпадений
  • поддержку частичных и нестрогих совпадений
  • учет порядка символов
  • обработку опечаток

fuseOptions

fuseOptions передаёт конфигурацию непосредственно в Fuse.js.

fuseOptions: {
  threshold: 0.3,
  distance: 100,
  ignoreLocation: true
}

Основные параметры:

  • threshold — уровень строгости совпадения

    • 0.0 — только точные совпадения
    • 1.0 — максимально свободное сопоставление
  • distance — максимальная дистанция между совпадаемыми символами

  • ignoreLocation — игнорирование позиции совпадения в строке

Дополнительно могут использоваться:

  • minMatchCharLength — минимальная длина совпадения
  • keys — ключи объектов для поиска (частично пересекается с searchFields)

Поведение сортировки результатов поиска

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

  • значения shouldSort
  • веса полей в Fuse.js
  • порядка исходных данных

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


Диакритика и нормализация строк

Поисковый механизм выполняет нормализацию строк перед сравнением:

  • приведение к нижнему регистру
  • удаление диакритических знаков (в зависимости от конфигурации Fuse.js)
  • нормализация пробелов

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


Поведение при пустом поиске

При отсутствии введённого значения поле поиска не фильтрует список. Все доступные элементы остаются видимыми, если не включены дополнительные ограничения.

При очистке строки поиска происходит:

  • сброс фильтрации
  • восстановление исходного набора элементов
  • повторная сортировка (если включена)

Производительность поискового механизма

На производительность влияют несколько факторов:

  • размер массива элементов
  • количество полей в searchFields
  • сложность fuseOptions
  • значение searchResultLimit
  • частота обновления ввода

При больших наборах данных (1000+ элементов) критически важны:

  • ограничение результатов
  • увеличение searchFloor
  • упрощение конфигурации Fuse.js

Комбинированная логика поиска

Поисковый процесс в Choices.js можно рассматривать как последовательность этапов:

  1. Проверка включения поиска (searchEnabled)
  2. Проверка минимального порога (searchFloor)
  3. Выбор источника данных (searchChoices)
  4. Определение полей (searchFields)
  5. Применение алгоритма Fuse.js (fuseOptions)
  6. Сортировка результатов
  7. Ограничение количества (searchResultLimit)
  8. Отрисовка списка

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


Кастомизация логики поиска

Choices.js допускает расширение стандартного поведения через переопределение поисковых параметров и внедрение пользовательской конфигурации Fuse.js.

На практике это используется для:

  • реализации поиска по сложным объектам
  • добавления приоритетов для отдельных полей
  • внедрения доменной логики релевантности
  • адаптации поиска под многоязычные данные

Такая гибкость делает поисковый модуль не просто фильтром, а полноценным ранжирующим механизмом внутри UI-компонента.