VIEW (Полнотекстовый индекс)
Для выполнения запроса SELECT с использованием полнотекстового индекса в строковой таблице используйте выражение VIEW:
SELECT ...
FROM TableName VIEW IndexName
WHERE FulltextMatch(TextColumn, "query")
ORDER BY ...
Примечание
Полнотекстовый индекс не будет автоматически выбран оптимизатором, поэтому его нужно указывать явно с помощью VIEW IndexName.
Функции полнотекстового поиска (FulltextMatch, FulltextScore) требуют VIEW. Если VIEW не используется, запрос завершится с ошибкой.
В одном чтении через VIEW поддерживается только один полнотекстовый предикат. FulltextMatch / FulltextScore нельзя использовать под OR или NOT.
Для доступа к индексу по релевантности требуется ограничение FulltextScore(...) > 0 в WHERE.
Описание функций см. в разделе Полнотекстовый поиск, включая
FulltextMatch и
FulltextScore.
FulltextMatch
FulltextMatch(text, query) фильтрует строки по совпадению текста с полнотекстовым запросом:
SELECT id, title
FROM articles VIEW ft_idx
WHERE FulltextMatch(body, "машинное обучение")
LIMIT 20;
Только первые два аргумента могут быть позиционными. Дополнительные параметры нужно передавать как именованные аргументы:
Mode(String): вид запроса:Keywords(по умолчанию) — текст запроса разбивается на отдельные термы; логика их объединения определяетсяDefaultOperatorQuery— расширенный синтаксис с логическими операторами: обязательные термы через+, исключённые через-, точные фразы в двойных кавычкахWildcard— поиск с подстановочными символами:%заменяет любую подстроку,_— один символ (аналогичноLIKE); требует N-граммного индекса
DefaultOperator(String): оператор объединения термов в режимеKeywords:And(по умолчанию) — все термы запроса должны присутствовать в текстеOr— достаточно совпадения хотя бы одного терма; для уточнения минимума используйтеMinimumShouldMatch
MinimumShouldMatch(String): минимальное число совпавших термов приDefaultOperator = "Or"— задаётся как абсолютное число (например,"3") или процент от числа термов запроса (например,"50%")
Режим Wildcard и шаблоны % / _ (требуются N-граммы)
Если индекс создан с фильтрацией N-грамм, можно использовать шаблоны с % и _ (по аналогии с LIKE).
Чтобы явно указать такой режим, передайте именованный аргумент "Wildcard" AS Mode:
SELECT id, title
FROM articles VIEW ft_idx
WHERE FulltextMatch(body, "маш% обу%ние", "Wildcard" AS Mode)
LIMIT 20;
LIKE / ILIKE (используют полнотекстовый индекс)
Для полнотекстовых индексов с N-граммами поддерживается LIKE/ILIKE по текстовой колонке. Такие предикаты используют ту же логику, что и FulltextMatch(..., "Wildcard" AS Mode):
SELECT id, title
FROM articles VIEW ft_idx
WHERE body ILIKE "%обуч%ние%"
LIMIT 20;
FulltextScore
FulltextScore(text, query) возвращает оценку релевантности (BM25) и может использоваться для ранжирования.
Ранжирование требует индекса типа fulltext_relevance.
SELECT id, title, FulltextScore(body, "машинное обучение") AS relevance
FROM articles VIEW ft_idx
WHERE FulltextScore(body, "машинное обучение") > 0
ORDER BY relevance DESC
LIMIT 10;
Дополнительные параметры
Дополнительные параметры нужно передавать как именованные аргументы:
DefaultOperator(String): оператор объединения термов —And(по умолчанию, все термы должны присутствовать) илиOr(достаточно одного совпавшего терма)MinimumShouldMatch(String): приDefaultOperator = "Or"— минимальное число совпавших термов; задаётся как абсолютное число (например,"2") или процент (например,"50%")K1(Double): параметр насыщения частоты терма в BM25 — определяет, насколько сильно влияет повторное появление терма на итоговую оценку; типичный диапазон: 1.2–2.0B(Double): параметр нормализации длины документа в BM25 —0.0отключает нормализацию,1.0полностью нормализует по длине документа; типичное значение: 0.75
Пример:
SELECT id, FulltextScore(body, "машинное обучение", "Or" AS DefaultOperator, "50%" AS MinimumShouldMatch) AS relevance
FROM articles VIEW ft_idx
WHERE FulltextScore(body, "машинное обучение", "Or" AS DefaultOperator, "50%" AS MinimumShouldMatch) > 0
ORDER BY relevance DESC;
Примечание
Только первые два аргумента FulltextMatch / FulltextScore могут быть позиционными. Для дополнительных параметров используйте именованные аргументы.
Выражение FulltextScore(...) повторяется в SELECT и WHERE целиком — YQL, как и стандартный SQL, вычисляет WHERE раньше SELECT, поэтому псевдонимы из SELECT недоступны в WHERE. Оба вхождения должны быть идентичны.