用語ブースティングを使用してドキュメントのランク付けを改善する
最も関連性の高い結果が最初に表示される場合、検索は最適に機能しています。 検索エンジンはすべて、最も関連性の高い結果を検索クエリに返そうと試みます。 Azure AI 検索には、フルテキスト検索用に Apache Lucene の拡張バージョンが実装されています。
ここでは、より複雑な Lucene クエリを記述する方法について説明します。 次に、検索クエリ内で特定の用語をブーストすることで、結果の関連性を向上させます。
インデックスを検索する
Azure AI 検索では、インデックスに対するクエリを、REST エンドポイントを使用して行うことも、Azure portal 内で検索エクスプローラー ツールを使用して行うこともできます。 クエリ処理のステージを簡単にまとめたい場合は、「Azure AI 検索ソリューションの作成」の "インデックスの検索" に関するユニットを参照してください。
このユニットでは、クエリの解析に重点を置きます。
検索エクスプローラーを使い、シンプルなクエリの種類と完全なクエリの種類を使用する場合の違いと、これが検索結果に与える影響を確認します。
Note
クエリを自分で実行する場合は、Azure サブスクリプションが必要です。 Azure AI 検索サービスを作成し、ホテルのサンプル データをインデックスにインポートします。
シンプルなクエリを作成する
ホテルのサンプル データには、50 のホテルが含まれていて、説明、部屋の詳細、およびその場所が示されています。 あなたはホテル予約ビジネスを運営していて、ユーザーがホテルを予約できるアプリを用意しているとします。 ユーザーは検索を行うことができます。最も関連性の高いホテルが最初に表示される必要があります。
顧客が高級ホテルを見つけようとしているというユース ケースがあります。 まず、次のシンプルなクエリからの検索結果を確認します。
search=luxury&$select=HotelId, HotelName, Category, Tags, Description&$count=true
クエリ解析では、インデックス内のドキュメントのすべてのフィールドで用語 luxury
を検索します。
クエリ文字列では、select
オプションを追加することで、ドキュメントから返されるフィールドも制限します。
&$select=HotelId, HotelName, Category, Tags, Description
クエリの最後のパラメーターでは、結果の総数をカウントするようにインデックスに求めます。
$count=true
字句解析は必要ないので、ドキュメントの取得からは 14 個のドキュメントが返されます。 最初の 3 つは次のとおりです。
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 14,
"value": [
{
"@search.score": 2.633778,
"HotelId": "13",
"HotelName": "Historic Lion Resort",
"Description": "Unmatched Luxury. Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
"Category": "Budget",
"Tags": [
"view",
"free wifi",
"free wifi"
]
},
{
"@search.score": 2.1104424,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
{
"@search.score": 1.966516,
"HotelId": "40",
"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.",
"Category": "Luxury",
"Tags": [
"continental breakfast",
"view",
"view"
]
},
...
]
}
顧客は、先頭に表示されたホテルで、高級と想定されているホテルが "低予算" カテゴリーに属し、エアコンが設置されていないことに驚くかもしれません。 顧客が検索で複数の単語を入力した場合、アプリではすべての用語を結果に含める必要があると想定するため、クエリの用語の間に + が追加されます。 API に送信されるクエリは次のとおりです。
search=luxury + air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true
検索サービスからは 5 つのドキュメントが返されるようになりましたが、それでも上位の結果は予算カテゴリにあります。
Lucene クエリ パーサーを有効にする
検索エクスプローラーに Lucene クエリ パーサーを使用するように指示するには、クエリ文字列に &queryType=full
を追加します。
search=luxury AND air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
Lucene 構文を使用すると、より正確なクエリを記述できます。 使用可能な機能の概要を次に示します。
- ブール演算子:
AND
、OR
、NOT
(たとえば、luxury AND 'air con'
)。 - フィールド検索:
fieldName:search term
(たとえば、Description:luxury AND Tags:air con
)。 - あいまい検索:
~
(たとえば、Description:luxury~
からは、luxury のスペルミスのバージョンを含む結果が返されます)。 - 用語近接検索:
"term1 term2"~n
(たとえば、"indoor swimming pool"~3
からは、それぞれ 3 つの単語以内に indoor swimming pool という単語を含むドキュメントが返されます)。 - 正規表現検索:
/regular expression/
では/
間に正規表現が使用されます (たとえば、/[mh]otel/
からは hotel と motel を含むドキュメントが返されます)。 - ワイルドカード検索:
*
、?
。ここで、*
は多くの文字と一致し、?
は単一の文字と一致します (たとえば、'air con'*
を使用すると、air con と air conditioning が検索されます)。 - 優先順位のグループ化:
(term AND (term OR term))
(たとえば(Description:luxury OR Category:luxury) AND Tags:air?con*
)。 - 用語ブースティング:
^
(たとえば、Description:luxury OR Category:luxury^3
を使用すると、カテゴリが高級であるホテルには、記述内の高級よりも高いスコアが与えられます)。
これらの機能の詳細については、「Azure AI 検索での Lucence クエリ構文」を参照してください。
検索語句をブーストする
上記を使用すると、結果を改善することができます。 パーサーでは、カテゴリ "高級" に属するホテルにより高い優先順位を付ける必要があります。 また、[タグ] フィールドで、より正確に air conditioning を探すこともできます。
(Description:luxury OR Category:luxury^3) AND Tags:'air con'*
他のクエリ文字列パラメーターを追加することで、次のクエリ文字列を取得できます。
search=(Description:luxury OR Category:luxury^3) AND Tags:'air con'*&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
これで上位 3 つのホテルは次のようになります。
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 5,
"value": [
{
"@search.score": 5.3537707,
"HotelId": "8",
"HotelName": "Sapphire Resort",
"Description": "Downtown, close to everything, steps to the park, shopping, and restaurants.",
"Category": "Luxury",
"Tags": [
"free wifi",
"continental breakfast",
"air conditioning"
]
},
{
"@search.score": 5.3522806,
"HotelId": "49",
"HotelName": "Old Carrabelle Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
"Category": "Luxury",
"Tags": [
"air conditioning",
"laundry service",
"24-hour front desk service"
]
},
{
"@search.score": 4.1448884,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
...
]
}
Sapphire Resorts の検索スコアは 2.3321536 から 5.3537707 に増え、顧客に最初に表示されるホテルになりました。 Oceanside Resort は 3 番目になりました。