≫ Полнотекстовое соответствие
Строка запроса может включать конкретные операторы, которые определяют условия того, как должны сопоставляться слова из строки запроса.
Неявный логический оператор AND всегда присутствует, поэтому "hello world" подразумевает, что оба слова "hello" и "world" должны быть найдены в сопоставляемом документе.
hello world
Примечание: явного оператора AND нет.
Логический оператор OR | имеет более высокий приоритет, чем AND, поэтому looking for cat | dog | mouse означает looking for (cat | dog | mouse), а не (looking for cat) | dog | mouse.
hello | world
Примечание: оператора OR не существует. Пожалуйста, используйте | вместо него.
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(/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$" (в кавычках, чтобы объединить оператор фразы с модификаторами начала/конца) будет совпадать исключительно с документами, содержащими хотя бы одно поле с этими двумя конкретными ключевыми словами.
boosted^1.234 boostedfieldend$^1.234
Модификатор усиления повышает оценку слова по IDF на указанный коэффициент в ранжировании, которое учитывает IDF. Он не влияет на процесс совпадения.
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-битной маски для отслеживания вхождений терминов внутри совпадения. Логика сопоставления (поиск документов) остается корректной, но оценки ранжирования могут быть затронуты для очень длинных запросов.
Church NOTNEAR/3 street
Оператор NOTNEAR служит отрицательным утверждением и функционирует как логическая инверсия оператора NEAR. Он находит совпадение в документе, когда левый аргумент присутствует, при условии, что правый аргумент либо отсутствует в документе, либо находится дальше указанного расстояния от левого аргумента.
Синтаксис: NOTNEAR/N, регистрозависимый, пробелы между ключевым словом NOTNEAR, знаком слэша и значением расстояния не допускаются.
Ключевые особенности:
- Симметричность: Как и
NEAR, операторNOTNEARприменяется независимо от порядка терминов в тексте. Он исключит совпадение, если правый аргумент будет найден в пределах указанного расстояния до или после левого аргумента. - Порог расстояния: Расстояние
Nпредставляет собой ближний диапазон (включительно). Если слова разделеныNсловами или меньше, совпадение отбрасывается. Правый аргумент должен находиться на расстоянииN + 1или более слов. - Аргументы: Оба аргумента этого оператора могут быть терминами, фразами или группами операторов.
all SENTENCE words SENTENCE "in one sentence"
"Bill Gates" PARAGRAPH "Steve Jobs"
Операторы SENTENCE и PARAGRAPH находят совпадение в документе, когда оба их аргумента находятся в пределах одного предложения или одного абзаца текста, соответственно. Этими аргументами могут быть ключевые слова, фразы или экземпляры того же оператора.
Порядок аргументов внутри предложения или абзаца не имеет значения. Эти операторы работают только с таблицами, построенными с включенной функцией index_sp (индексация предложений и абзацев), и в противном случае сводятся к простой операции AND. Информацию о том, что считается предложением и абзацем, смотрите в документации директивы index_sp.
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:(h2)
only in a (single) title
Оператор ограничения ZONESPAN похож на оператор ZONE, но требует, чтобы совпадение происходило в пределах одного непрерывного сегмента. В приведенном ранее примере ZONESPAN:th hello world не нашел бы совпадения в документе, так как "hello" и "world" не появляются в одном сегменте.