"完全な" Lucene 検索構文の例 (高度なクエリ)
Azure AI Search のクエリを作成するときに、デフォルトの 単純なクエリ パーサー を、より強力な Lucene クエリ パーサー に置き換えて、特殊で高度なクエリ式を作成できます。
Lucene パーサーは、フィールド スコープ クエリ、あいまい検索、インフィックスおよびサフィックスのワイルドカード検索、近接検索、用語ブースト、正規表現検索など、より複雑なクエリ形式に対応しています。 機能が強力になれば処理要件が増えるため、実行時間がやや長くなることを見込んでください。 この記事では、完全な構文に基づいてクエリ操作をデモンストレーションする例について詳しく説明します。
Note
語幹検索や見出し語認定を想定していると意外なことですが、完全な Lucene クエリ構文で有効になる特殊化されたクエリ構造の多くはテキスト解析されません。 語彙の分析は、完全な用語でのみ実行されます (用語クエリまたは語句クエリ)。 不完全な語句 (プレフィックス クエリ、ワイルドカードのクエリ、正規表現のクエリ、あいまいクエリ) でのクエリの種類は、解析ステージをバイパスして、クエリ ツリーに直接追加されます。 部分的なクエリ用語に対して適用される変換は、大文字から小文字への変換だけです。
ホテルのサンプル インデックス
以下のクエリは、このクイックスタートの手順に従って作成できる hotels-sample-index に基づいています。
クエリの例は、REST API および POST 要求を使用して表されています。 これらは REST クライアントに貼り付けて実行できます。 または、Azure portal で検索エクスプローラーの JSON ビューを使用してください。 JSON ビューでは、この記事でここに示すクエリの例に貼り付けることができます。
要求ヘッダーには次の値が必要です。
キー | 値 |
---|---|
Content-Type | application/json |
api-key | <your-search-service-api-key> 、クエリまたは管理者キーのいずれか |
次の例のように、URI パラメーターには、検索サービスのエンドポイントと、インデックス名、docs コレクション、search コマンド、および 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 または空の検索に相当する未指定のクエリです。 これは特に便利なわけではありませんが、最も簡単な検索方法であり、インデックス内の取得可能なすべてのフィールドに値がすべて入った状態で表示されます。full に設定された
queryType
は、完全な Lucene クエリ パーサーを呼び出します。これは、この構文に必須です。フィールドのコンマ区切りリストに設定された
select
は、検索結果のコンテキストで有用なフィールドのみが含まれるように検索結果を構成するために使用されます。count
は、検索条件に一致するドキュメントの数を返します。 空の検索文字列では、この数はインデックス内のすべてのドキュメントです (hotels-sample-index の場合は 50)。
例 1: フィールド検索
フィールド検索では、個別の埋め込まれた検索式が、特定のフィールドに限定されます。 この例では、用語 hotel を含むホテル名を検索しますが、motel は検索しません。 AND
を使用して複数のフィールドを指定できます。
このクエリ構文を使用する場合、クエリを実行するフィールドが検索式自体に含まれるときは searchFields
パラメーターを省略できます。 fieldName:searchExpression
をフィールド検索に含める場合、searchFields
は 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
}
このクエリの応答は、次の例のようになります。Boutique でフィルター処理され、名前に hotel を含むホテルが返されますが、名前に motel が含まれる結果は除外されます。
{
"@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"
両方の文字列を 1 つのエンティティとして評価したい場合は、語句を引用符で囲んでください。この例では、Address/StateProvince
フィールドで 2 つの異なる場所を検索しています。 クライアントによっては、引用符のエスケープ (\
) が必要になる場合があります。
fieldName:searchExpression
に指定されるフィールドは、検索可能なフィールドでなければなりません。 フィールド定義の属性が決まるしくみの詳細については、Create Index (REST API) に関するページを参照してください。
例 2: あいまい検索
あいまい検索は、スペルミスの単語を含め、類似した用語に一致します。 あいまい検索を実行するには、1 つの言葉の終わりにチルダ記号 ~
を付けます。任意で編集距離を指定するパラメーターとして 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~
のように、複数部分から成る語句の各用語に対してあいまい一致を指定できます。 このクエリ式では、laundry service で 15 件の一致が見つかります。
Note
あいまいクエリは分析されません。 不完全な語句 (プレフィックス クエリ、ワイルドカードのクエリ、正規表現のクエリ、あいまいクエリ) でのクエリの種類は、解析ステージをバイパスして、クエリ ツリーに直接追加されます。 部分的なクエリ用語に対して適用される変換は、大文字から小文字への変換だけです。
例 3: 近接検索
近接検索では、ドキュメント内で近くにある語句を検索します。 語句の終わりにチルダ記号 ~
を挿入し、近接境界となる語数を続けます。
このクエリは、ドキュメント内で互いの間が 5 語以内にある hotel と airport という用語を検索します。 語句を保持するために引用符をエスケープ (\"
) しています。
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) でも構いません。 用語ブーストはスコアリング プロファイルとは違います。スコアリング プロファイルは、特定の用語ではなく、特定のフィールドをブーストします。
この "ブースト前" クエリでは "beach access" を検索しており、一方または両方の用語に一致する 6 つのドキュメントがあることがわかります。
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
}
実際、access で一致するドキュメントは 2 つだけです。 ドキュメントに beach という用語はありませんが、最初のインスタンスは 2 番目の位置にあります。
{
"@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"
]
}
]
}
この "ブースト後" のクエリでは、検索を繰り返しますが、今回は、用語 beach が用語 access よりも優先されて結果がブーストされます。 人が判読できるバージョンのクエリは 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
}
beach という用語をブーストした後、Campus Commander Hotel での一致は 5 位に下がります。
{
"@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"
}
]
}
Note
正規表現クエリは分析されません。 部分的なクエリ用語に対して適用される変換は、大文字から小文字への変換だけです。
例 6: ワイルドカード検索
複数 (*
) または単数 (?
) の文字のワイルドカード検索で、一般に認識されている構文を使用できます。 Lucene クエリ パーサーでは、これらの記号は、語句ではなく、1 つの用語で使用できます。
このクエリでは、プレフィックス 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"
}
]
}
Note
ワイルドカード クエリは分析されません。 部分的なクエリ用語に対して適用される変換は、大文字から小文字への変換だけです。
関連するコンテンツ
コードでクエリを指定してみてください。 次のリンクでは、Azure SDK を使用して検索クエリを設定する方法について説明しています。
その他の構文リファレンス、クエリ アーキテクチャ、および例については、次の記事を参照してください。