Примеры полного синтаксиса поиска Lucene (расширенные запросы)
При создании запросов для поиска ИИ Azure можно заменить средство синтаксического анализа простых запросов по умолчанию более мощным средством синтаксического анализа запросов Lucene, чтобы сформулировать специализированные и расширенные выражения запросов.
Средство синтаксического анализа запросов Lucene поддерживает сложные форматы запросов, а именно: запросы, относящиеся к полям, поиск нечетких соответствий, поиск с использованием инфиксов и суффиксов, поиск с учетом расположения, повышение приоритета терминов и поиск по регулярным выражениям. Дополнительная мощность поставляется с большими требованиями к обработке, поэтому вы должны ожидать немного больше времени выполнения. В этой статье описаны примеры, демонстрирующие операции запроса на основе полного синтаксиса.
Примечание.
Многие специализированные конструкции запросов, обеспечиваемые благодаря полному синтаксису запросов Lucene, не поддерживают анализ текста, что может оказаться неожиданным, если вы хотите использовать выделение корней слов или лемматизацию. Лексический анализ выполняется только для полными терминами (запрос термина или запрос фразы). Типы запросов с неполными терминами (запрос с префиксом, запрос с подстановочными знаками, запрос с регулярными выражениями, нечеткий запрос) добавляются непосредственно к дереву запроса в обход этапа анализа. Единственное преобразование для частичных терминов запроса — преобразование в нижний регистр.
Образец индекса гостиниц
Следующие запросы основываются на образце индекса гостиниц, который можно создать, следуя инструкциям в этом кратком руководстве.
Примеры запросов обрабатываются с помощью запросов REST API и POST. Их можно вставить и запустить в клиенте REST. Или используйте представление JSON обозревателя поиска в портал Azure. В представлении JSON можно вставить примеры запросов, показанные здесь в этой статье.
Заголовки запросов должны иметь следующие значения:
Ключ | Значение |
---|---|
Тип контента | application/json |
api-key | <your-search-service-api-key> , либо запрос, либо ключ администратора |
Параметры URI должны включать конечную точку службы поиска с именем индекса, коллекциями документов, командой поиска и версией API, как показано в следующем примере:
https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
Текст запроса должен быть сформирован как допустимый JSON:
{
"search": "*",
"queryType": "full",
"select": "HotelId, HotelName, Category, Tags, Description",
"count": true
}
search
Задано значение * — это неопределенный запрос, эквивалентный значению NULL или пустому поиску. Это не особенно полезно, но это самый простой поиск, который можно сделать, и он отображает все извлекаемые поля в индексе со всеми значениями.queryType
для полного вызова полного средства синтаксического анализа запросов Lucene требуется для этого синтаксиса.select
Для композиции результатов поиска используется список полей с разделителями-запятыми, включая только те поля, которые полезны в контексте результатов поиска.count
возвращает количество документов, соответствующих критериям поиска. В пустой строке поиска число всех документов в индексе (50 в индексе hotels-sample-index).
Пример 1. Поиск по полям
Поля областей поиска отдельных внедренных выражений поиска в определенное поле. Этот пример ищет имена отелей с термином отель в них, но не мотель. Можно указать несколько полей с помощью AND
.
При использовании этого синтаксиса запроса можно опустить searchFields
параметр, если поля, которые нужно запросить, находятся в самом выражении поиска. Если вы включаете searchFields
в поле поиск, fieldName:searchExpression
всегда имеет приоритет над searchFields
.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "HotelName:(hotel NOT motel) AND Category:'Boutique'",
"queryType": "full",
"select": "HotelName, Category",
"count": true
}
Ответ на этот запрос должен выглядеть примерно так, как показано в следующем примере, отфильтрованном на бутике, возвращая отели, включающие отель в имя, за исключением результатов, включающих мотель в имя.
{
"@odata.count": 5,
"value": [
{
"@search.score": 2.2289815,
"HotelName": "Stay-Kay City Hotel",
"Category": "Boutique"
},
{
"@search.score": 1.3862944,
"HotelName": "City Skyline Antiquity Hotel",
"Category": "Boutique"
},
{
"@search.score": 1.355046,
"HotelName": "Old Century Hotel",
"Category": "Boutique"
},
{
"@search.score": 1.355046,
"HotelName": "Sublime Palace Hotel",
"Category": "Boutique"
},
{
"@search.score": 1.355046,
"HotelName": "Red Tide Hotel",
"Category": "Boutique"
}
]
}
Выражение поиска может представлять собой один термин или фразу или более сложное выражение в круглых скобках, при необходимости с логическими операторами. Вот несколько примеров.
HotelName:(hotel NOT motel)
Address/StateProvince:("WA" OR "CA")
Tags:("free wifi" NOT "free parking") AND "coffee in lobby"
Не забудьте поместить фразу в кавычки, если вы хотите, чтобы обе строки были оценены как одна сущность, так как в этом случае выполняется поиск двух разных расположений Address/StateProvince
в поле. В зависимости от клиента может потребоваться экранирование (\
) кавычек.
Поле, указанное в fieldName:searchExpression
, должно быть доступным для поиска. Сведения о том, как атрибуты определений полей, см. в статье "Создание индекса ( REST API)".
Пример 2. Поиск нечетких соответствий
Нечеткий поиск работает с похожими терминами, включая слова с ошибками. Чтобы выполнить поиск нечетких соответствий, необходимо добавить символ тильды ~
в конце слова. Дополнительно можно поставить цифру от 0 до 2, указывающую расстояние редактирования. Например, blue~
или blue~1
вернет результаты с blue, blues и glue.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "Tags:conserge~",
"queryType": "full",
"select": "HotelName, Category, Tags",
"searchFields": "HotelName, Category, Tags",
"count": true
}
Ответ для этого запроса разрешается на concierge в соответствующих документах, обрезанный для краткости:
{
"@odata.count": 9,
"value": [
{
"@search.score": 1.4947624,
"HotelName": "Twin Vortex Hotel",
"Category": "Luxury",
"Tags": [
"bar",
"restaurant",
"concierge"
]
},
{
"@search.score": 1.1685618,
"HotelName": "Stay-Kay City Hotel",
"Category": "Boutique",
"Tags": [
"view",
"air conditioning",
"concierge"
]
},
{
"@search.score": 1.1465473,
"HotelName": "Old Century Hotel",
"Category": "Boutique",
"Tags": [
"pool",
"free wifi",
"concierge"
]
},
. . .
]
}
Фразы не поддерживаются напрямую, но можно указать нечеткое соответствие для каждого термина многокомпонентной фразы, например search=Tags:landy~ AND sevic~
. Это выражение запроса находит 15 совпадений в службе прачечной.
Примечание.
Запросы с нечетким соответствием не анализируются. Типы запросов с неполными терминами (запрос с префиксом, запрос с подстановочными знаками, запрос с регулярными выражениями, нечеткий запрос) добавляются непосредственно к дереву запроса в обход этапа анализа. Единственное преобразование для частичных терминов запроса — преобразование в нижний регистр.
Пример 3. Поиск с учетом расположения
Поиск с учетом расположения находит термины, которые расположены в документе рядом друг с другом. Вставьте символ тильды ~
в конце фразы, за которым следует число слов, создающих границу близости.
Этот запрос ищет термины отеля и аэропорта в пяти словах друг друга в документе. Кавычки экранируются (\"
) для сохранения фразы:
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "Description: \"hotel airport\"~5",
"queryType": "full",
"select": "HotelName, Description",
"searchFields": "HotelName, Description",
"count": true
}
Ответ для этого запроса должен выглядеть примерно так:
{
"@odata.count": 1,
"value": [
{
"@search.score": 0.69167054,
"HotelName": "Trails End Motel",
"Description": "Only 8 miles from Downtown. On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
}
]
}
Пример 4. Повышение приоритета терминов
Повышение терминов относится к ранжированию документа выше, если он содержит увеличенный термин, относительно документов, которые не содержат термин. Чтобы повысить термин, используйте подсказку, ^
символ с коэффициентом повышения (число) в конце термина, который выполняется поиск. Коэффициент увеличения по умолчанию равен 1, и хотя он должен быть положительным, он может быть меньше 1 (например, 0,2). Повышение приоритета терминов отличается от профилей повышения, так как они повышают приоритет определенных полей, а не определенных терминов.
В этом случае перед запросом найдите доступ к пляжу и обратите внимание, что есть шесть документов, которые соответствуют одному или обоим условиям.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "beach access",
"queryType": "full",
"select": "HotelName, Description, Tags",
"searchFields": "HotelName, Description, Tags",
"count": true
}
На самом деле, только два документа соответствуют доступу. Первый экземпляр находится во втором положении, даже если документ отсутствует термин пляж.
{
"@odata.count": 6,
"value": [
{
"@search.score": 1.068669,
"HotelName": "Johnson's Family Resort",
"Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge **beach** with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
"Tags": [
"24-hour front desk service",
"pool",
"coffee in lobby"
]
},
{
"@search.score": 1.0162708,
"HotelName": "Campus Commander Hotel",
"Description": "Easy **access** to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
"Tags": [
"free parking",
"coffee in lobby",
"24-hour front desk service"
]
},
{
"@search.score": 0.9050383,
"HotelName": "Lakeside B & B",
"Description": "Nature is Home on the **beach**. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"Tags": [
"laundry service",
"concierge",
"free parking"
]
},
{
"@search.score": 0.8955848,
"HotelName": "Windy Ocean Motel",
"Description": "Oceanfront hotel overlooking the **beach** features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
"Tags": [
"pool",
"air conditioning",
"bar"
]
},
{
"@search.score": 0.83636594,
"HotelName": "Happy Lake Resort & Restaurant",
"Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy **beaches** of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
"Tags": [
"pool",
"bar",
"restaurant"
]
},
{
"@search.score": 0.7808502,
"HotelName": "Swirling Currents Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking **access** to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
"Tags": [
"air conditioning",
"laundry service",
"24-hour front desk service"
]
}
]
}
В запросе повторите поиск, на этот раз повышая результаты с помощью пляжа терминов в течение доступа к термину. search=Description:beach^2 access
— доступная для чтения версия запроса. В зависимости от вашего клиента, вам может понадобиться выразить ^2
в виде %5E2
.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "Description:beach^2 access",
"queryType": "full",
"select": "HotelName, Description, Tags",
"searchFields": "HotelName, Description, Tags",
"count": true
}
После повышения термина пляж, матч на кампусе Командор Отель движется вниз до пятого места.
{
"@odata.count": 6,
"value": [
{
"@search.score": 2.137338,
"HotelName": "Johnson's Family Resort",
"Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge beach with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
"Tags": [
"24-hour front desk service",
"pool",
"coffee in lobby"
]
},
{
"@search.score": 1.8100766,
"HotelName": "Lakeside B & B",
"Description": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"Tags": [
"laundry service",
"concierge",
"free parking"
]
},
{
"@search.score": 1.7911696,
"HotelName": "Windy Ocean Motel",
"Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
"Tags": [
"pool",
"air conditioning",
"bar"
]
},
{
"@search.score": 1.6727319,
"HotelName": "Happy Lake Resort & Restaurant",
"Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy beaches of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
"Tags": [
"pool",
"bar",
"restaurant"
]
},
{
"@search.score": 1.0162708,
"HotelName": "Campus Commander Hotel",
"Description": "Easy access to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
"Tags": [
"free parking",
"coffee in lobby",
"24-hour front desk service"
]
},
{
"@search.score": 0.7808502,
"HotelName": "Swirling Currents Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
"Tags": [
"air conditioning",
"laundry service",
"24-hour front desk service"
]
}
]
}
Пример 5. Регулярное выражение
Поиск регулярных выражений находит совпадение на основе содержимого между косой чертой /
, как описано в классе RegExp.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "HotelName:/(Mo|Ho)tel/",
"queryType": "full",
"select": "HotelName",
"count": true
}
Ответ для этого запроса должен выглядеть примерно так, как показано в следующем примере (обрезано для краткости):
{
"@odata.count": 25,
"value": [
{
"@search.score": 1,
"HotelName": "Country Residence Hotel"
},
{
"@search.score": 1,
"HotelName": "Downtown Mix Hotel"
},
{
"@search.score": 1,
"HotelName": "Gastronomic Landscape Hotel"
},
. . .
{
"@search.score": 1,
"HotelName": "Trails End Motel"
},
{
"@search.score": 1,
"HotelName": "Nordick's Valley Motel"
},
{
"@search.score": 1,
"HotelName": "King's Cellar Hotel"
}
]
}
Примечание.
Запросы с регулярными выражениями не анализируются. Единственное преобразование для частичных терминов запроса — преобразование в нижний регистр.
Пример 6. Поиск с использованием подстановочных знаков
Вы можете использовать общепризнанный синтаксис для поиска с использованием нескольких подстановочных знаков (*
) или одного (?
). Средство синтаксического анализа запросов Lucene поддерживает использование этих символов с одним термином, а не фразой.
В этом запросе найдите имена отелей, содержащие префикс sc. Нельзя использовать *
символ или ?
символ в качестве первого символа поиска.
POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
"search": "HotelName:sc*",
"queryType": "full",
"select": "HotelName",
"count": true
}
Ответ для этого запроса должен выглядеть примерно так:
{
"@odata.count": 1,
"value": [
{
"@search.score": 1,
"HotelName": "Waterfront Scottish Inn"
}
]
}
Примечание.
Запросы с подстановочными знаками не анализируются. Единственное преобразование для частичных терминов запроса — преобразование в нижний регистр.
Связанный контент
Попробуйте указать запросы в коде. В следующей ссылке описывается настройка поисковых запросов с помощью пакетов SDK Azure.
Дополнительные ссылки на синтаксис, архитектуру запросов и примеры см. в следующих статьях: