Как ответить
Главное отличие — в структуре хранения и алгоритме поиска. B-Tree индекс хранит данные в сбалансированном дереве, где каждый узел — отсортированный набор ключей, и поиск идёт по полному совпадению, префиксу или диапазону. Полнотекстовый индекс строит инвертированный список (inverted index): для каждого слова (токена) хранится список документов и позиций вхождений.
Вот основные практические различия:
- B-Tree работает с точными значениями, частичными совпадениями по левому краю (like 'abc%') и диапазонами. Полнотекстовый — для поиска по словам, фразам, стеммингу (приведение к основе слова), поиска с учётом морфологии и релевантности.
- Стемминг и нормализация. В MySQL с MyISAM/InnoDB (FULLTEXT) по умолчанию работает стеммер для английского (можно отключить). В PostgreSQL (tsvector/tsquery) нужно конфигурировать словарь и язык.
- Стоп-слова. Полнотекстовый индекс может игнорировать короткие или частые слова (артикли, предлоги), что в B-Tree вы делали бы через много OR/AND условий, которые плохо оптимизируются.
- Релевантность. В полнотекстовом индексе можно ранжировать результаты по TF-IDF или BM25. B-Tree выдаёт только набор строк, удовлетворяющих условию.
- Размер и производительность. B-Tree индекс в разы компактнее, вставка/обновление быстрее. Полнотекстовый индекс растёт быстро: для каждого слова хранятся списки. На больших текстах (поле varchar(1000) в 10 млн строк) он может весить как сама таблица.
Пример, где они друг без друга не справляются. Допустим, ищем «быстрые решения для миграции на PostgreSQL»:
-- B-Tree сделает only 'быстрые решения для миграции%' — не подходит, нет точного совпадения.
-- Полнотекстовый (PostgreSQL):
SELECT *
FROM docs
WHERE to_tsvector('russian', content) @@ to_tsquery('russian', 'быстр & решени & миграц');
-- Или с левым совпадением по заголовку, если заголовок уникален:
SELECT *
FROM docs
WHERE title LIKE 'быстрые решения%'
AND to_tsvector('russian', content) @@ to_tsquery('russian', 'миграц');
-- B-Tree на title, полнотекстовый на content — комбинированное использование.
Таким образом, выбор индекса зависит от задачи: B-Tree хорош для точного поиска и сортировки, полнотекстовый — для поиска по тексту с учётом морфологии и релевантности.