Полнотекстовый поиск
Функции FulltextMatch и FulltextScore предназначены для выполнения полнотекстового поиска в YDB через полнотекстовый индекс.
Примечание
Эти функции используют полнотекстовый индекс только при выполнении запроса через VIEW IndexName. См. VIEW (Полнотекстовый индекс) и Полнотекстовые индексы.
FulltextMatch
FulltextMatch(text, query) фильтрует строки по совпадению текста с полнотекстовым запросом.
SELECT id, body
FROM articles VIEW ft_idx
WHERE FulltextMatch(body, "машинное обучение");
Только первые два аргумента могут быть позиционными. Дополнительные параметры нужно передавать как именованные аргументы.
Поддерживаемые именованные аргументы:
Mode(String): вид запроса:Keywords(по умолчанию) — текст запроса разбивается на отдельные термы; логика их объединения определяетсяDefaultOperatorQuery— расширенный синтаксис с логическими операторами: обязательные термы через+, исключённые через-, точные фразы в двойных кавычкахWildcard— поиск с подстановочными символами:%заменяет любую подстроку,_— один символ (аналогичноLIKE); требует N-граммного индекса
DefaultOperator(String): оператор объединения термов в режимеKeywords:And(по умолчанию) — все термы запроса должны присутствовать в текстеOr— термы делятся на обязательные (с префиксом+, должны присутствовать в каждом результате) и необязательные (без префикса, учитываются вMinimumShouldMatch). Без префикса+все термы считаются необязательными, и достаточно совпадения хотя бы одного
MinimumShouldMatch(String): минимальное число необязательных термов, которые должны совпасть приDefaultOperator = "Or"— задаётся как абсолютное число (например,"3") или процент от числа необязательных термов (например,"50%"). Обязательные (+) термы в счёт не входят
Значения аргументов Mode и DefaultOperator регистронезависимы.
Пример для Wildcard
Если индекс создан с фильтрацией N-грамм, можно использовать шаблоны с % и _ (по аналогии с LIKE).
SELECT id, title
FROM articles VIEW ft_idx
WHERE FulltextMatch(body, "маш% обу%ние", "Wildcard" AS Mode)
LIMIT 20;
Пример для Keywords
Запрос из 8 слов, где требуется совпадение не менее половины слов:
SELECT id
FROM articles VIEW ft_idx
WHERE FulltextMatch(
body,
"машинное обучение нейронные сети глубокое обучение большие данные рекомендации поиск",
"Keywords" AS Mode,
"Or" AS DefaultOperator,
"50%" AS MinimumShouldMatch
);
В этом примере Mode установлен в Keywords (запрос трактуется как набор термов), DefaultOperator установлен в Or (разрешается совпадение по любому подмножеству термов), а MinimumShouldMatch установлен в 50% (требуется совпадение минимум 4 термов из 8). Это помогает отсеять документы, где встретилось лишь одно-два слова из длинного запроса.
Пример с обязательным термом (+)
Добавьте + перед термом в режиме Keywords с DefaultOperator = "Or", чтобы сделать его обязательным для каждого результата. Этот синтаксис следует обязательным термам в Lucene.
SELECT id
FROM articles VIEW ft_idx
WHERE FulltextMatch(
body,
"+машинное обучение нейронные сети",
"Or" AS DefaultOperator,
"1" AS MinimumShouldMatch
);
Запрос вернёт документы, содержащие «машинное» (обязательный) и хотя бы один из «обучение», «нейронные», «сети» (необязательные). MinimumShouldMatch учитывает только необязательные термы. Если все термы начинаются с +, запрос работает как строгий AND.
FulltextScore
FulltextScore(text, query) возвращает оценку релевантности на основе алгоритма BM25 и может использоваться для ранжирования результатов.
Требует индекс типа fulltext_relevance.
SELECT id, FulltextScore(body, "машинное обучение") AS relevance
FROM articles VIEW ft_idx
WHERE FulltextScore(body, "машинное обучение") > 0
ORDER BY relevance DESC
LIMIT 10;
Только первые два аргумента могут быть позиционными. Дополнительные параметры нужно передавать как именованные аргументы.
Поддерживаемые именованные аргументы:
DefaultOperator(String): оператор объединения термов —And(по умолчанию, все термы должны присутствовать) илиOr(термы делятся на обязательные с префиксом+и необязательные без префикса; каждый обязательный должен присутствовать, а из необязательных должны совпасть не менееMinimumShouldMatch)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, "1" AS MinimumShouldMatch, 0.75 AS K1, 1.2 AS B) AS relevance
FROM articles VIEW ft_idx
WHERE FulltextScore(body, "машинное обучение", "Or" AS DefaultOperator, "1" AS MinimumShouldMatch, 0.75 AS K1, 1.2 AS B) > 0
ORDER BY relevance DESC;
Примечание
MinimumShouldMatch поддерживается только когда DefaultOperator установлен в Or. Когда DefaultOperator установлен в And, используйте FulltextScore без MinimumShouldMatch.