≫ Полнотекстовое соответствие

Полнотекстовые операторы

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

Булевы операторы

Оператор AND

Неявный логический оператор AND всегда присутствует, поэтому "hello world" подразумевает, что оба слова "hello" и "world" должны быть найдены в сопоставляемом документе.

hello  world

Примечание: явного оператора AND нет.

Оператор OR

Логический оператор OR | имеет более высокий приоритет, чем AND, поэтому looking for cat | dog | mouse означает looking for (cat | dog | mouse), а не (looking for cat) | dog | mouse.

hello | world

Примечание: оператора OR не существует. Пожалуйста, используйте | вместо него.

Оператор MAYBE

hello MAYBE world

Оператор MAYBE работает аналогично оператору |, но не возвращает документы, которые совпадают только с правым выражением дерева.

Оператор отрицания

hello -world
hello !world

Оператор отрицания задаёт правило, что слово не должно присутствовать.

Запросы, содержащие только отрицания, по умолчанию не поддерживаются. Чтобы включить поддержку, используйте опцию сервера not_terms_only_allowed.

Оператор поиска по полю

@title hello @body world

Оператор ограничения поля ограничивает последующие поиски указанным полем. По умолчанию запрос вызовет ошибку, если заданное имя поля отсутствует в искомой таблице. Тем не менее, это поведение можно подавить, указав опцию @@relaxed в начале запроса:

@@relaxed @nosuchfield my query

Это может быть полезно при поиске по гетерогенным таблицам с разными схемами.

Ограничения позиции поля дополнительно ограничивают поиск первыми N позициями в данном поле (или полях). Например, @body [50] hello не совпадает с документами, где ключевое слово hello появляется на позиции 51 или далее в теле текста.

@body[50] hello

Оператор поиска по нескольким полям:

@(title,body) hello world

Оператор игнорирования поля поиска (игнорирует любые совпадения 'hello world' из поля 'title'):

@!title hello world

Оператор игнорирования поиска по нескольким полям (если существуют поля 'title', 'subject' и 'body', то @!(title) эквивалентен @(subject,body)):

@!(title,body) hello world

Оператор поиска по всем полям:

@* hello

Оператор поиска по фразе

"hello world"

Оператор фразы требует, чтобы слова шли подряд друг за другом.

Оператор поиска по фразе может включать модификатор match any term. Внутри оператора фразы термины имеют позиционное значение. При использовании модификатора 'match any term' позиции последующих терминов в запросе с фразой будут смещены. В результате модификатор 'match any' не влияет на производительность поиска.

Примечание: при использовании этого оператора с запросами, содержащими более 31 ключевого слова, статистика ранжирования (такая как tf, idf, bm25) для слов в позициях 31 и выше может учитываться с понижением точности. Это связано с внутренним использованием 32-битной маски для отслеживания вхождений терминов в совпадении. Логика сопоставления (нахождение документов) остаётся корректной, но рейтинг может быть искажен для очень длинных запросов.

"exact * phrase * * for terms"

Вы также можете использовать оператор OR внутри кавычек. Оператор OR (|) должен быть заключён в скобки () при использовании внутри фраз. Каждый вариант проверяется на одной позиции, и фраза совпадает, если любой из вариантов подходит для этой позиции.

Верные примеры (со скобками):

"( a | b ) c"
"( ( a b c ) | d ) e"
"man ( happy | sad ) but all ( ( as good ) | ( as fast ) )"

Неверные примеры (без скобок — такие не работают):

"a | b c"
"happy | sad"

Оператор поиска по близости

"hello world"~10

Расстояние близости измеряется в словах, учитывая количество слов, и применяется ко всем словам внутри кавычек. Например, запрос "cat dog mouse"~5 означает, что должен быть отрезок меньше 8 слов, содержащий все 3 слова. Поэтому документ с текстом CAT aaa bbb ccc DOG eee fff MOUSE не соответствует запросу, так как отрезок равен ровно 8 словам.

Примечание: при использовании этого оператора с запросами, содержащими более 31 ключевого слова, статистика ранжирования (такая как tf, idf, bm25) для слов в позициях 31 и выше может учитываться с понижением точности. Это связано с внутренним использованием 32-битной маски для отслеживания вхождений терминов в совпадении. Логика сопоставления (нахождение документов) остаётся корректной, но рейтинг может быть искажен для очень длинных запросов.

Вы также можете использовать оператор OR внутри поиска по близости. Оператор OR (|) должен быть заключён в скобки () при использовании внутри поисков по близости. Каждый вариант проверяется отдельно.

Верный пример (со скобками):

"( two | four ) fish chips"~5

Неверный пример (без скобок — не работает):

"two | four fish chips"~5

Оператор кворумного совпадения

"the world is a wonderful place"/3

Оператор кворумного совпадения вводит тип нечеткого поиска. Он совпадает только с теми документами, которые соответствуют заданному порогу по количеству указанных слов. В примере выше ("the world is a wonderful place"/3) совпадут все документы, содержащие не менее 3 из 6 указанных слов. Оператор ограничен 255 ключевыми словами. Вместо абсолютного числа можно указать значение от 0.0 до 1.0 (представляющее 0% и 100%), и Manticore будет совпадать только с документами, содержащими не менее указанного процента слов. Тот же пример выше можно записать как "the world is a wonderful place"/0.5, и он будет совпадать с документами, содержащими не менее 50% из 6 слов.

Оператор кворума поддерживает оператор OR (|). Оператор OR (|) должен быть заключён в скобки () при использовании внутри кворумного совпадения. Для совпадения учитывается только одно слово из каждой группы OR.

Верные примеры (со скобками):

"( ( a b c ) | d ) e f g"/0.5
"happy ( sad | angry ) man"/2

Неверный пример (без скобок — не работает):

"a b c | d e f g"/0.5

Оператор строгого порядка

aaa << bbb << ccc

Оператор строгого порядка (также известный как оператор "before") совпадает с документом только если ключевые слова аргумента появляются в документе именно в том порядке, который указан в запросе. Например, запрос black << cat совпадёт с документом "black and white cat", но не с документом "that cat was black". Оператор порядка имеет самый низкий приоритет. Его можно применять как к отдельным ключевым словам, так и к более сложным выражениям. Например, это корректный запрос:

(bag of words) << "exact phrase" << red|green|blue

Модификатор точной формы

raining =cats and =dogs
="exact phrase"

Модификатор ключевого слова точной формы совпадает с документом только если ключевое слово встречается в точно указанной форме. По умолчанию документ считается совпадающим, если совпадает основа/лемма ключевого слова. Например, запрос "runs" совпадает с документом, содержащим "runs", и с документом, содержащим "running", поскольку обе формы сводятся к основе "run". Однако запрос =runs совпадает только с первым документом. Модификатор точной формы требует включения опции index_exact_words.

Другой сценарий использования — предотвращение расширения ключевого слова до формы *keyword*. Например, при index_exact_words=1 + expand_keywords=1/star, запрос bcd найдет документ, содержащий abcde, а =bcd — нет.

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

Операторы подстановки

nation* *nation* *national

Требует установки min_infix_len для префикса (расширение в конце) и/или суффикса (расширение в начале). Если требуется только префиксное расширение, можно использовать min_prefix_len.

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

Оператор подстановки может автоматически применяться, если используется настройка таблицы expand_keywords.

Кроме того, поддерживаются следующие встроенные операторы подстановки:

  • ? может соответствовать любому одному символу: t?st совпадает с test, но не с teast
  • % может соответствовать нулю или одному символу: tes% совпадает с tes или test, но не с testing

Встроенные операторы требуют dict=keywords (включено по умолчанию) и включения префиксного/вставочного режимов.

Оператор REGEX

REGEX(/t.?e/)

Требует установки min_infix_len или min_prefix_len и опций dict=keywords (по умолчанию).

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

Шаблоны должны соответствовать синтаксису RE2. Разделитель выражения REGEX — первый символ после открывающей скобки. Иными словами, весь текст между открывающей скобкой с разделителем и разделителем с закрывающей скобкой считается выражением RE2. Обратите внимание, что термины, хранящиеся в словаре, подвергаются преобразованию charset_table, то есть, например, REGEX может не распознать заглавные буквы, если все символы приведены к нижнему регистру в соответствии с charset_table (что происходит по умолчанию). Чтобы успешно сопоставить термин с помощью выражения REGEX, шаблон должен соответствовать всему токену целиком. Для частичного совпадения поставьте .* в начале и/или конце шаблона.

REGEX(/.{3}t/)
REGEX(/t.*\d*/)

Модификаторы начала и конца поля

^hello world$

Модификаторы ключевого слова начала и конца поля обеспечивают совпадение ключевого слова только если оно появляется в самом начале или в самом конце полнотекстового поля соответственно. Например, запрос "^hello world$" (в кавычках, чтобы объединить оператор фразы с модификаторами начала/конца) будет совпадать исключительно с документами, содержащими хотя бы одно поле с этими двумя конкретными ключевыми словами.

Модификатор усиления IDF

boosted^1.234 boostedfieldend$^1.234

Модификатор усиления повышает оценку слова по IDF на указанный коэффициент в ранжировании, которое учитывает IDF. Он не влияет на процесс совпадения.

Оператор NEAR

hello NEAR/3 world NEAR/4 "my test"

Оператор NEAR является более универсальной версией оператора близости. Его синтаксис — NEAR/N, он чувствителен к регистру и не допускает пробелов между ключевым словом NEAR, слэшем и числом дистанции.

В то время как исходный оператор близости работает только с наборами ключевых слов, NEAR более универсален и может принимать произвольные подвыражения в качестве двух аргументов. Он совпадает с документом, когда оба подвыражения находятся на расстоянии не более N слов друг от друга, независимо от порядка. NEAR — левосторонне ассоциативный оператор с таким же (самым низким) приоритетом, как и BEFORE.

Важно отметить, что выражение one NEAR/7 two NEAR/7 three не полностью эквивалентно "one two three"~7. Главное отличие в том, что оператор близости допускает до 6 слов между всеми тремя совпадающими словами, а версия с NEAR менее строгая: она разрешает до 6 слов между one и two, а затем еще до 6 слов между найденной двухсловной группой и three.

Примечание: При использовании этого оператора с запросами, содержащими более 31 ключевого слова, статистика ранжирования (такая как tf, idf, bm25) для ключевых слов на позиции 31 и выше может быть недооценена. Это связано с использованием 32-битной маски для отслеживания вхождений терминов внутри совпадения. Логика сопоставления (поиск документов) остается корректной, но оценки ранжирования могут быть затронуты для очень длинных запросов.

Оператор NOTNEAR

Church NOTNEAR/3 street

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

Синтаксис: NOTNEAR/N, регистрозависимый, пробелы между ключевым словом NOTNEAR, знаком слэша и значением расстояния не допускаются.

Ключевые особенности:

  • Симметричность: Как и NEAR, оператор NOTNEAR применяется независимо от порядка терминов в тексте. Он исключит совпадение, если правый аргумент будет найден в пределах указанного расстояния до или после левого аргумента.
  • Порог расстояния: Расстояние N представляет собой ближний диапазон (включительно). Если слова разделены N словами или меньше, совпадение отбрасывается. Правый аргумент должен находиться на расстоянии N + 1 или более слов.
  • Аргументы: Оба аргумента этого оператора могут быть терминами, фразами или группами операторов.

Операторы SENTENCE и PARAGRAPH

all SENTENCE words SENTENCE "in one sentence"
"Bill Gates" PARAGRAPH "Steve Jobs"

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

Порядок аргументов внутри предложения или абзаца не имеет значения. Эти операторы работают только с таблицами, построенными с включенной функцией index_sp (индексация предложений и абзацев), и в противном случае сводятся к простой операции AND. Информацию о том, что считается предложением и абзацем, смотрите в документации директивы index_sp.

Оператор ограничения ZONE

ZONE:(h3,h4)
only in these titles

Оператор ZONE limit очень похож на оператор ограничения поля, но ограничивает совпадение указанной внутриполевой зоной или списком зон. Важно отметить, что последующие подвыражения не обязаны совпадать в пределах одного непрерывного сегмента данной зоны и могут совпадать в нескольких сегментах. Например, запрос (ZONE:th hello world) найдет совпадение в следующем примере документа:

<th>Table 1. Local awareness of Hello Kitty brand.</th>
.. some table data goes here ..
<th>Table 2. World-wide brand awareness.</th>

Оператор ZONE действует на запрос до следующего оператора ограничения поля или ZONE, или до закрывающей скобки. Он работает исключительно с таблицами, построенными с поддержкой зон (см. index_zones), и в противном случае игнорируется.

Оператор ограничения ZONESPAN

ZONESPAN:(h2)
only in a (single) title

Оператор ограничения ZONESPAN похож на оператор ZONE, но требует, чтобы совпадение происходило в пределах одного непрерывного сегмента. В приведенном ранее примере ZONESPAN:th hello world не нашел бы совпадения в документе, так как "hello" и "world" не появляются в одном сегменте.

Last modified: December 09, 2025