Поделиться через


Синтаксис запросов Lucene в службе "Поиск ИИ Azure"

При создании запросов в службе поиска ИИ Azure можно выбрать полный синтаксис Синтаксического анализа запросов Lucene для специализированных форм запросов: подстановочный знак, нечеткий поиск, поиск близкого взаимодействия, регулярные выражения. Большая часть синтаксиса Синтаксического анализа запросов Lucene реализована без изменений в поиске ИИ Azure, за исключением поисков по диапазону, которые создаются с помощью $filter конструкций.

Чтобы использовать полный синтаксис Lucene, задайте тип запроса full и передайте выражение запроса, предназначенное для подстановочных знаков, нечеткого поиска или одной из других форм запросов, поддерживаемых полным синтаксисом. В REST выражения запросов предоставляются в параметре search запроса Поиска документов (REST API).

Пример (полный синтаксис)

Следующий пример представляет собой поисковый запрос, созданный с использованием полного синтаксиса. В этом конкретном примере демонстрируется поиск в поле и повышение приоритета термина. Он ищет отели, где поле категории содержит термин budget. Все документы, содержащие фразу "recently renovated" , ранжируются выше в результате значения повышения термина (3).

POST /indexes/hotels-sample/docs/search?api-version=2025-09-01
{
  "queryType": "full",
  "search": "category:budget AND \"recently renovated\"^3",
  "searchMode": "all"
}

Несмотря на то что параметр searchMode не относится к какому-либо типу запроса, в данном примере он является актуальным. Всякий раз, когда операторы используются в запросе, необходимо настроить searchMode=all, чтобы гарантировать, что все критерии соответствуют.

Для дополнительных примеров см. примеры синтаксиса запросов Lucene. Дополнительные сведения о запросе и параметрах запроса, включая searchMode, см. в разделе Поиск документов (REST API).

Основы синтаксиса

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

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

Размещение определяет, как будет интерпретироваться символ: как оператор или просто как другой знак в строке.

Например, в полном синтаксисе Lucene тильда (~) используется как для нечеткого поиска, так и для поиска по близости. При размещении после кавычки ~ вызывает поиск по близости. При размещении в конце термина ~ вызывает нечеткий поиск.

В термине, например business~analyst, символ не интерпретируется как оператор. В этом случае, если запрос является термином или фразовым запросом, полнотекстовый поиск с лексическим анализом удаляет ~ и разбивает термин business~analyst на два: business OR analyst.

Приведенный выше пример — тильда (~), но тот же принцип применяется к каждому оператору.

Экранирование специальных знаков

Чтобы использовать любой из операторов поиска как часть искомого текста, необходимо экранировать его, добавив перед символом одну обратную косую черту (\). Например, для поиска с подстановочными знаками в https://, где :// является частью строки запроса, необходимо указать search=https\:\/\/*. Аналогично, экранированный шаблон номера телефона может выглядеть следующим образом: \+1 \(800\) 642\-7676.

Специальные символы, которые требуют экранирования, включают следующее:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Note

Несмотря на то что экранирование предотвращает разрыв токенов, лексический анализ во время индексирования может их разделить. Например, стандартный анализатор Lucene будет разбивать слова на дефисы, пробелы и другие символы. Если в строке запроса необходимо использовать специальные символы, может потребоваться анализатор, сохраняющий их в индексе. Можно, например, использовать анализаторы естественного языка Майкрософт, которые сохраняют слова с дефисом, или пользовательский анализатор для более сложных шаблонов. Дополнительные сведения см. в частичных терминах, шаблонах и специальных знаках.

Кодирование небезопасных и зарезервированных знаков в URL-адресах

Убедитесь, что в URL-адресе закодированы все небезопасные и зарезервированные знаки. Например, это небезопасный символ, # так как это идентификатор фрагмента или привязки в URL-адресе. Знак должен быть закодирован как %23, если он используется в URL-адресе. & и = являются примерами зарезервированных символов в качестве параметров разделителя и указания значений в поиске ИИ Azure. Дополнительные сведения см. в разделе RFC1738: Унифицированные указатели ресурсов (URL).

Небезопасными знаками являются: " ` < > # % { } | \ ^ ~ [ ]. Зарезервированными знаками являются: ; / ? : @ = + &.

Логические операторы

Чтобы повысить точность совпадения, можно внедрить в строку запроса логические операторы. В дополнение к символьным операторам полный синтаксис поддерживает текстовые операторы. Всегда указывайте текстовые логические операторы (AND, OR, NOT) прописными буквами.

Текстовый оператор Character Example Usage
AND + wifi AND luxury Задает термины, которые должны содержаться в соответствии. В примере обработчик запросов ищет документы, содержащие оба wifi и luxury. Знак плюса (+) также можно использовать непосредственно перед термином, чтобы сделать его обязательным. Например, +wifi +luxury указывает, что оба термина должны появляться где-то в поле одного документа.
OR (нет) 1 wifi OR luxury Поиск совпадения при обнаружении хотя бы одного из терминов. В примере поисковая система возвращает соответствие документам, содержащим либо wifi, либо luxury, либо оба. Так как OR является оператором соединения по умолчанию, вы также можете его оставить, то есть wifi luxury аналогично wifi OR luxury.
NOT !, - wifi –luxury Возвращает результат для документов, которые исключают термин. Например, wifi –luxury выполняет поиск документов, имеющих wifi термин, но не luxury.

1 Символ | не поддерживается для операций OR.

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

Important

Оператор NOT (NOT, !или -) работает по-разному в полном синтаксисе, чем в простом синтаксисе.

  • В простом синтаксисе запросы с отрицанием всегда добавляют подстановочные знаки автоматически. Например, запрос -luxury автоматически развертывается в -luxury *.
  • В полном синтаксисе запросы с отрицанием нельзя объединить с подстановочными символами. Например, запросы -luxury * не допускаются.
  • В полном синтаксисе запросы с одним отрицанием не допускаются. Например, запрос -luxury не разрешен.
  • В полном синтаксисе отрицание будет вести себя так, как если бы оно всегда добавлялось с операцией И в запрос, вне зависимости от режима поиска.
    • Например, полный синтаксис запроса wifi -luxury в полном синтаксисе получает только документы, содержащие термин wifi, а затем применяет отрицание -luxury к этим документам.
  • Если вы хотите использовать отрицания для поиска по всем документам в индексе, рекомендуется использовать простой синтаксис с режимом any поиска.
  • Если вы хотите использовать отрицания для поиска по подмножествам документов в индексе, рекомендуется использовать полный синтаксис или простой синтаксис с режимом "все".
Тип запроса Режим поиска Пример запроса Behavior
Simple any wifi -luxury Возвращает все документы в индексе. Документы с термином "вайфай" или документы, в которых отсутствует термин "роскошь", ранжируются выше, чем другие документы. Запрос развернут до wifi OR -luxury OR *.
Simple all wifi -luxury Возвращает только документы в индексе, содержащие термин "wifi" и не содержат термин "роскошь". Запрос развернут в wifi AND -luxury AND *.
Full any wifi -luxury Возвращает только документы в индексе, содержащие термин "wifi", а затем документы, содержащие термин "роскошь", удаляются из результатов.
Full all wifi -luxury Возвращает только документы в индексе, содержащие термин "wifi", а затем документы, содержащие термин "роскошь", удаляются из результатов.

Поиск по полю

Можно определить операцию поиска по полям с синтаксисом fieldName:searchExpression, где выражение поиска представляет собой одно слово или фразу, или более сложное выражение в круглых скобках (при необходимости с логическими операторами). Вот несколько примеров.

  • genre:jazz NOT history

  • artists:("Miles Davis" "John Coltrane")

Добавьте несколько строк в кавычках, если необходимо, чтобы обе строки считались одной сущностью, в приведенном случае поиска двух разных исполнителей в поле artists.

Поле, указанное в fieldName:searchExpression, должно быть полем searchable. Дополнительные сведения об использовании атрибутов индекса в определениях полей см. в статье Create Index (Azure Search Service REST API) (Создание индексов (REST API службы "Поиск Azure")).

Note

При использовании выражений для поиска по полям не нужно использовать параметр searchFields, так как каждое выражение для поиска по полям имеет явно заданное имя поля. Тем не менее можно по-прежнему использовать параметр searchFields, если требуется выполнить запрос, в котором некоторые части ограничены определенным полем, а остальные можно применить к нескольким полям. Например, запрос search=genre:jazz NOT history&searchFields=description будет сопоставлять jazz только с полем genre, в то время как NOT history — с полем description. Имя поля, указанное в fieldName:searchExpression, всегда имеет приоритет над параметром searchFields, поэтому в данном примере не нужно включать genre в параметр searchFields.

Нечеткий поиск

При поиске нечетких соответствий обнаруживаются совпадения в терминах, имеющих похожую конструкцию, при этом термин расширяется не более чем до 50 терминов, отвечающих критериям расстояния в два или менее. Дополнительные сведения см. в статье Поиск нечетких соответствий.

Чтобы выполнить нечеткий поиск, используйте символ тильды ~ в конце одного слова с необязательным параметром, число от 0 до 2 (по умолчанию), указывающее расстояние редактирования. Например, blue~ или blue~1 возвращать blue, bluesи glue.

Нечеткий поиск может применяться только к терминам, а не к фразам, заключенным в кавычки, но можно добавить тильду к каждому термину по отдельности в многокомпонентном имени или фразе. Например, Unviersty~ of~ Wshington~ будет соответствовать University of Washington.

Поиск по близости

Операция поиска с учетом расположения позволяет найти слова, расположенные рядом в документе. Вставьте символ тильды ~ в конце фразы, за которым следует число слов, создающих границу близости. Например, "hotel airport"~5 находит термины hotel и airport в пределах пяти слов друг от друга в документе.

Усиление значимости терминов

Повышение терминов относится к ранжированию документа выше, если он содержит увеличенный термин, относительно документов, которые не содержат термин. Это отличается от оценочных профилей тем, что они усиливают определенные поля, а не конкретные термины.

В следующем примере показаны эти различия. Предположим, что есть профиль ранжирования, который повышает соответствие совпадений в определенном поле, например, genre в примере musicstoreindex. Повышение значимости слов может использоваться для дальнейшего повышения приоритета определенных поисковых терминов относительно других. Например, rock^2 electronic даёт приоритет документам, содержащим поисковые запросы в поле жанра, выше, чем другие поля, доступные для поиска в индексе. Кроме того, документы, содержащие поисковый термин рок, ранжируются выше, чем другой поисковый термин электронный в результате значения повышения термина (2).

Для увеличения значимости термина используйте символ каретки ^ с коэффициентом увеличения (число) в конце термина, который вы ищете. Вы также можете улучшить выражения. Чем выше коэффициент повышения, тем более релевантным является термин относительно других терминов поиска. По умолчанию коэффициент усиления равен 1. Тем не менее, коэффициент усиления должен быть положительным числом, он может быть меньше 1 (например, 0,20).

Поиск регулярных выражений

Операция поиска по регулярным выражениям позволяет найти совпадение на основе шаблонов, допустимых в Apache Lucene, как указано в документации класса RegExp.

В службе "Поиск ИИ Azure" регулярное выражение:

  • Заключены между косой чертой вперед /
  • Только нижний регистр

Например, чтобы найти документы, содержащие motel или hotel, укажите /[mh]otel/. Поиск с регулярными выражениями сопоставляется с отдельными словами.

Некоторые средства и языки накладывают дополнительные требования к escape-символам за пределами правил , введенных поиском ИИ Azure. Для JSON строки, включающие прямой слэш, экранируются с помощью обратной косой черты: microsoft.com/azure/ становится search=/.*microsoft.com\/azure\/.*/, где search=/.* <string-placeholder>.*/ определяет регулярное выражение, а microsoft.com\/azure\/ это строка с экранированным прямым слэшем.

Два распространенных символа в регулярных выражениях: . и *. . соответствует любому одному символу, а * повторяет предыдущий символ ноль или более раз. Например, /be./ совпадает с терминами bee и bet, в то время как /be*/ соответствует be, bee и beee, но не bet. Вместе .*, они позволяют сопоставить любую последовательность символов, так что /be.*/ будет соответствовать любому термину, начинающемуся с be, например, better.

Если в регулярном выражении возникают синтаксические ошибки, просмотрите правила escape-обхода для специальных символов. Вы также можете попробовать другой клиент, чтобы убедиться, что проблема связана с инструментом.

Поиск подстановочных знаков

Вы можете использовать общепризнанный синтаксис для поиска с использованием подстановочных знаков для нескольких символов (*) или одного символа (?). Полный синтаксис Lucene поддерживает сопоставление префиксов и инфиксов. Используйте синтаксис регулярных выражений для сопоставления суффикса.

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

Тип аффикса Описание и примеры
prefix Фрагмент термина предшествует * или ?. Например, выражение запроса search=alpha* возвращает alphanumeric или alphabetical. Сопоставление префикса поддерживается как в простом, так и в полном синтаксисе.
suffix Фрагмент термина следует после * или ?, с прямой косой чертой для разграничения конструкции. Например, search=/.*numeric/ возвращает alphanumeric.
infix Фрагменты терминов заключены в * или ?. Например, search=non*al возвращает non-numerical и nonsensical.

В одном выражении можно комбинировать различные операторы. Например, 980?2* соответствует 98072-1222 и 98052-1234, где ? соответствует одному (обязательному) символу, а * соответствует символам произвольной длины, которые идут после.

Сопоставление по суффиксам требует разделителей наклонной черты для регулярного выражения /. Как правило, нельзя использовать * символ или ? символ в качестве первого символа термина без символа /. Также важно отметить, что * ведет себя по-другому при использовании вне регулярных выражений. За пределами косой черты /, служащей разделителем в регулярных выражениях, символ * является подстановочным знаком и соответствует любой серии символов, так же как .* в regex. Например, search=/non.*al/ генерирует тот же набор результатов, что и search=non*al.

Note

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

Влияние анализатора на запросы с подстановочными знаками

Во время синтаксического анализа запросы, сформулированные как префикс, суффикс, подстановочный знак или регулярные выражения, передаются в дерево запросов "как есть", минуя лексический анализ. Совпадения будут обнаружены, только если индекс содержит строки в формате, указанном в запросе. В большинстве случаев требуется анализатор во время индексирования, который сохраняет целостность строк, чтобы частичное сопоставление терминов и шаблонов завершилось успешно. Дополнительные сведения см. в разделе "Частичный поиск терминов" в запросах поиска ИИ Azure.

Рассмотрим ситуацию, когда может потребоваться, чтобы поисковый запрос terminal* возвращал результаты, содержащие такие термины, как terminate, terminationи terminates.

При использовании анализатора en.lucene (английский Lucene) применялось бы агрессивное стеммирование каждого термина. Например, terminate, termination, terminates все будут токенизированы в один маркер termi в вашем индексе. С другой стороны, термины в запросах с использованием подстановочных знаков или нечеткого поиска не анализируются вообще, поэтому не было бы результатов, которые будут соответствовать запросу terminat* .

С другой стороны, анализаторы Microsoft (в нашем примере это анализатор en.microsoft) более продвинуты и используют лемматизацию вместо стемминга. Это означает, что все созданные маркеры должны быть реально существующими английскими словами. Например, terminate, terminates и termination, в основном, остаются целыми в индексе и будут предпочтительным выбором для сценариев, которые сильно зависят от подстановочных знаков и нечеткого поиска.

Оценка подстановочных знаков и регулярных выражений

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

Специальные символы

В некоторых случаях может потребоваться искать специальный символ, например, эмодзи «❤» или знак «€». В таких случаях убедитесь, что используемый анализатор не фильтрует эти символы. Стандартный анализатор проходит множество специальных символов, исключая их из индекса.

Анализаторы, которые маркеризируют специальные символы, включают анализатор пробелов, который учитывает все последовательности символов, разделенные пробелами в виде маркеров (поэтому строка будет считаться маркером). Кроме того, анализатор языка, например анализатор Microsoft для английского языка (en.microsoft), принимает строку "€" в качестве токена. Можно проверить анализатор, чтобы узнать, какие токены он создает для данного запроса.

При использовании символов Юникода убедитесь, что символы правильно экранируются в URL-адресе запроса (например, для следует использовать escape-последовательность %E2%9D%A4+). Некоторые клиенты REST выполняют этот перевод автоматически.

Приоритет (группирование)

Вы можете использовать круглые скобки, чтобы создать вложенные запросы, включая операторы в заключенной в скобки инструкции. Например, motel+(wifi|luxury) ищет документы, содержащие термин motel и wifi, или motel и luxury (или все три одновременно).

Группирование полей аналогично, но группирование ограничивается одним полем. Например, hotelAmenities:(gym+(wifi|pool)) выполняет поиск в поле hotelAmenities, gym и wifi, или gym и pool.

Предельные размеры запроса

Поиск ИИ Azure накладывает ограничения на размер и композицию запросов, так как несвязанные запросы могут дестабилизировать службу поиска. Существуют ограничения на размер запроса и композицию (количество предложений). Ограничения также существуют для длины поиска по префиксу и для сложности поиска по регулярным выражениям и поиска с использованием подстановочных знаков. Если приложение создает поисковые запросы программными средствами, рекомендуется создать его таким образом, чтобы он не создавал запросы необвязанного размера.

Дополнительные сведения об ограничениях запросов см. в разделе об ограничениях запросов API.

См. также