このクイック スタートでは、 .NET 用 Azure AI Search クライアント ライブラリ を使用して、 フルテキスト検索 (キーワード検索とも呼ばれます) の検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
.NET 8 以降。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-dotnet-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-dotnet-samples/quickstart-keyword-search/AzureSearchQuickstart code .Program.csで、serviceEndpointのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。AzureSearchQuickstart.csprojから依存関係をインストールします。dotnet restore復元が完了したら、出力にエラーが表示されていないことを確認します。
Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az login
コードの実行
アプリケーションをビルドして実行します。
dotnet run
アウトプット
出力は次のようになります。
Deleting index...
Creating index...
Uploading documents...
Waiting for indexing...
Starting queries...
Query #1: Search on empty term '*' to return all documents, showing a subset of fields...
HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8
HotelId: 2
Name: Old Century Hotel
Rating: 3.6
HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6
HotelId: 1
Name: Stay-Kay City Hotel
Rating: 3.6
Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...
HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8
HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6
Query #3: Limit search to specific fields (pool in Tags field)...
HotelId: 2
Name: Old Century Hotel
Tags: [ pool, free wifi, concierge ]
Query #4: Facet on 'Category'...
HotelId: 3
Name: Gastronomic Landscape Hotel
Category: Suite
HotelId: 2
Name: Old Century Hotel
Category: Boutique
HotelId: 4
Name: Sublime Palace Hotel
Category: Boutique
HotelId: 1
Name: Stay-Kay City Hotel
Category: Boutique
Query #5: Look up a specific document...
3
Query #6: Call Autocomplete on HotelName...
san
sarasota
Complete. Press any key to end this program...
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索クライアントを作成する
Program.csでは、次の 2 つのクライアントを作成します。
- SearchIndexClient は、インデックスを作成します。
- SearchClient は、既存のインデックスを読み込んでクエリを実行します。
どちらのクライアントでも、認証にサービス エンドポイントと資格情報が必要です。 このクイック スタートでは、Microsoft Entra ID を使用したキーレス認証 に DefaultAzureCredential を使用します。
検索インデックスを作成する
このクイック スタートでは、ホテル データを読み込んでクエリを実行するホテル インデックスを作成します。 この手順では、インデックス内のフィールドを定義します。 それぞれのフィールドの定義には、名前とデータ型、属性が存在し、それらによってフィールドの使い方が決まります。
この例では、わかりやすく読みやすくするために 、SearchIndexClient クラスの同期メソッドを使用します。 ただし、運用シナリオでは、非同期メソッドを使用して、アプリのスケーラビリティと応答性を維持します。 たとえば、CreateIndex の代わりに CreateIndexAsyncを使用します。
構造を定義する
Hotel.csとAddress.csの 2 つのヘルパー クラスを作成して、ホテル ドキュメントとそのアドレスの構造を定義します。
Hotel クラスには、ホテルの ID、名前、説明、カテゴリ、タグ、駐車場、改装日、評価、住所のフィールドが含まれます。
Address クラスには、番地、市区町村、都道府県、郵便番号、国/地域のフィールドが含まれます。
Azure.Search.Documents クライアント ライブラリでは、SearchableField と SimpleField を使用してフィールドの定義を効率化できます。 どちらも SearchField を生成するヘルパー クラスであり、コードを簡略化できる可能性があります。
SimpleFieldは任意のデータ型にすることができ、常に検索不可 (フルテキスト検索クエリでは無視されます)、取得可能です (非表示ではありません)。 その他の属性は、既定ではオフですが、有効にすることができます。SimpleFieldは、フィルター、ファセット、スコアリング プロファイルでのみ使用されるフィールドやドキュメント ID での使用が考えられます。 その場合は、ドキュメント ID のIsKey = trueなど、シナリオに必要な属性を適用します。SearchableFieldは文字列である必要があります。常に検索可能で、取得可能となります。 その他の属性は、既定ではオフですが、有効にすることができます。 検索可能なタイプのフィールドであるため、同意語がサポートされるほか、アナライザーのプロパティがすべてサポートされます。
基本 SearchField API を使用する場合も、そのいずれかのヘルパー モデルを使用する場合も、フィルター、ファセット、並べ替えの属性は明示的に有効にする必要があります。 たとえば、IsFilterable、IsSortable、IsFacetable は、前のサンプルで示したように明示的に属性を指定する必要があります。
検索インデックスを作成する
Program.csでは、SearchIndex オブジェクトを作成し、CreateOrUpdateIndex メソッドを呼び出して、検索サービスのインデックスを表します。 インデックスには、指定されたフィールドでオートコンプリートを有効にするための SearchSuggester も含まれています。
// Create hotels-quickstart index
private static void CreateIndex(string indexName, SearchIndexClient searchIndexClient)
{
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
var definition = new SearchIndex(indexName, searchFields);
var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
definition.Suggesters.Add(suggester);
searchIndexClient.CreateOrUpdateIndex(definition);
}
インデックスにドキュメントをアップロードする
Azure AI 検索は、サービスに格納されたコンテンツを対象に検索を実行します。 この手順では、成したホテル インデックスに準拠した JSON ドキュメントを読み込みます。
Azure AI 検索における検索ドキュメントは、インデックス作成への入力とクエリからの出力を兼ねたデータ構造です。 外部データ ソースから取得したドキュメント入力には、データベース内の行、Azure Blob Storage 内の BLOB、ディスク上の JSON ドキュメントなどがあります。 この例では、ショートカットを作成し、4 つのホテルの JSON ドキュメントを直接埋め込みます。
ドキュメントをアップロードするときは、IndexDocumentsBatch オブジェクトを使用する必要があります。
IndexDocumentsBatch オブジェクトには Actions のコレクションが含まれています。各 Actions には、ドキュメント 1 つと、実行するアクション (upload、merge、delete、mergeOrUpload) を Azure AI 検索に指示するプロパティが 1 つ含まれています。
Program.csでは、ドキュメントとインデックスアクションの配列を作成し、配列をIndexDocumentsBatchに渡します。 次に示すドキュメントは、Hotel クラスで定義されている hotels-quickstart インデックスに準拠しています。
// Upload documents in a single Upload request.
private static void UploadDocuments(SearchClient searchClient)
{
IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "1",
HotelName = "Stay-Kay City Hotel",
Description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
Category = "Boutique",
Tags = new[] { "view", "air conditioning", "concierge" },
ParkingIncluded = false,
LastRenovationDate = new DateTimeOffset(2022, 1, 18, 0, 0, 0, TimeSpan.Zero),
Rating = 3.6,
Address = new Address()
{
StreetAddress = "677 5th Ave",
City = "New York",
StateProvince = "NY",
PostalCode = "10022",
Country = "USA"
}
}),
// REDACTED FOR BREVITY
}
UploadDocuments メソッドは、IndexDocumentsBatch を作成し、SearchClient で IndexDocuments を呼び出してドキュメントをアップロードします。 このクイック スタートでは、同じ資格情報を再利用する SearchClient を使用して、SearchIndexClientからを取得します。
SearchClient ingesterClient = searchIndexClient.GetSearchClient(indexName);
// Load documents
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(ingesterClient);
このコンソール アプリはすべてのコマンドを順番に実行するため、インデックス作成とクエリの間に 2 秒の待機時間が追加されます。
// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
Console.WriteLine("Waiting for indexing...\n");
System.Threading.Thread.Sleep(2000);
2 秒の遅延は、クエリが実行される前にすべてのドキュメントにインデックスを作成できるように、非同期のインデックス作成を補正します。 通常、遅延のコーディングは、デモ、テスト、およびサンプル アプリケーションでのみ必要です。
インデックスのクエリを実行する
最初のドキュメントのインデックスが作成されるとすぐにクエリの結果を取得できますが、インデックスの実際のテストではすべてのドキュメントのインデックスが作成されるまで待つ必要があります。
このセクションでは、クエリ ロジックと結果の 2 つの機能を追加します。 クエリには、Search メソッドを使用します。 このメソッドは、検索テキスト (クエリ文字列) と他のオプションを受け取ります。
その結果は、SearchResults クラスによって表されます。
Program.cs 内の WriteDocuments メソッドは、検索結果をコンソールに出力します。
// Write search results to console
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
foreach (SearchResult<Hotel> result in searchResults.GetResults())
{
Console.WriteLine(result.Document);
}
Console.WriteLine();
}
private static void WriteDocuments(AutocompleteResults autoResults)
{
foreach (AutocompleteItem result in autoResults.Results)
{
Console.WriteLine(result.Text);
}
Console.WriteLine();
}
クエリの例 1
RunQueries メソッドは、クエリを実行して結果を返します。 結果は、Hotel オブジェクトです。 このサンプルは、メソッド シグネチャと最初のクエリを示しています。 このクエリは、ドキュメントから選択されたフィールドを使用して結果を作成できる Select パラメーターを示しています。
// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
SearchOptions options;
SearchResults<Hotel> response;
// Query 1
Console.WriteLine("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
options = new SearchOptions()
{
IncludeTotalCount = true,
Filter = "",
OrderBy = { "" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Rating");
response = searchClient.Search<Hotel>("*", options);
WriteDocuments(response);
// REDACTED FOR BREVITY
}
クエリの例 2
2 番目のクエリで用語を検索し、 Rating が 4 より大きいドキュメントを選択するフィルターを追加し、降順で Rating 並べ替えます。 フィルターは、インデックス内の IsFilterable フィールドに対して評価されるブール式です。 フィルター クエリでは、値は包含されるか除外されるかのどちらかです。 そのため、フィルター クエリに関連付けられている関連性スコアはありません。
// Query 2
Console.WriteLine("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
options = new SearchOptions()
{
Filter = "Rating gt 4",
OrderBy = { "Rating desc" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Rating");
response = searchClient.Search<Hotel>("hotels", options);
WriteDocuments(response);
クエリの例 3
3 番目のクエリは、フルテキスト検索操作のスコープを特定のフィールドに設定するために使用される searchFieldsを示しています。
// Query 3
Console.WriteLine("Query #3: Limit search to specific fields (pool in Tags field)...\n");
options = new SearchOptions()
{
SearchFields = { "Tags" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Tags");
response = searchClient.Search<Hotel>("pool", options);
WriteDocuments(response);
クエリの例 4
4 番目のクエリは、ファセット ナビゲーション構造を構築するために使用できる facets を示しています。
// Query 4
Console.WriteLine("Query #4: Facet on 'Category'...\n");
options = new SearchOptions()
{
Filter = ""
};
options.Facets.Add("Category");
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Category");
response = searchClient.Search<Hotel>("*", options);
WriteDocuments(response);
クエリの例 5
5 番目のクエリでは、特定のドキュメントを返します。 ドキュメント参照は、結果セット内の OnClick イベントに対する一般的な応答です。
// Query 5
Console.WriteLine("Query #5: Look up a specific document...\n");
Response<Hotel> lookupResponse;
lookupResponse = searchClient.GetDocument<Hotel>("3");
Console.WriteLine(lookupResponse.Value.HotelId);
クエリの例 6
最後のクエリはオートコンプリートの構文を示しています。 sa の部分的なユーザー入力がシミュレートされ、インデックスで定義した suggester に関連付けられている sourceFields で 2 つの一致が発生する可能性があります。
// Query 6
Console.WriteLine("Query #6: Call Autocomplete on HotelName...\n");
var autoresponse = searchClient.Autocomplete("sa", "sg");
WriteDocuments(autoresponse);
クエリの概要
上記のクエリは、クエリで語句を照合する複数の方法 (フルテキスト検索、フィルター、オートコンプリート) を示しています。
SearchClient.Search メソッドは、フルテキスト検索とフィルターを実行します。
searchText クラスの Filter プロパティでフィルター式を渡しながら、文字列に検索クエリを渡すことができます。 検索せずにフィルター処理を実行するには、"*" メソッドの searchText パラメーターに を渡します。 フィルター処理を行わずに検索するには、Filter プロパティを未設定のままにするか、SearchOptions インスタンスを 1 つも渡さないようにします。
このクイック スタートでは、 Java 用 Azure AI Search クライアント ライブラリ を使用して、フルテキスト検索 (キーワード検索とも呼ばれます) の 検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-java-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-java-samples/quickstart-keyword-search code .src/main/java/azure/search/sample/App.javaで、searchServiceEndpointのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。依存関係をインストールします。
mvn clean dependency:copy-dependenciesビルドが完了したら、出力にエラーが表示されていないことを確認します。
Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az login
コードの実行
アプリケーションをコンパイルして実行します。
javac -d target/classes -cp "target/dependency/*" src/main/java/azure/search/sample/*.java
java -cp "target/classes;target/dependency/*" azure.search.sample.App
アウトプット
出力は次のようになります。
Waiting for indexing...
Starting queries...
Query #1: Search on empty term '*' to return all documents, showing a subset of fields...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Address":{"City":"Atlanta"}}
{"HotelId":"2","HotelName":"Old Century Hotel","Address":{"City":"Sarasota"}}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Address":{"City":"San Antonio"}}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Address":{"City":"New York"}}
Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #3: Limit search to specific fields (pool in Tags field)...
{"HotelId":"2","HotelName":"Old Century Hotel","Tags":["pool","free wifi","concierge"]}
Query #4: Facet on 'Category'...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Category":"Suite"}
{"HotelId":"2","HotelName":"Old Century Hotel","Category":"Boutique"}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Category":"Boutique"}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Category":"Boutique"}
Query #5: Look up a specific document...
3
Query #6: Call Autocomplete on HotelName that starts with 's'...
stay
sublime
Complete.
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索クライアントを作成する
App.javaでは、次の 2 つのクライアントを作成します。
- SearchIndexClient は、インデックスを作成します。
- SearchClient は、既存のインデックスを読み込んでクエリを実行します。
どちらのクライアントでも、認証にサービス エンドポイントと資格情報が必要です。 このクイック スタートでは、Microsoft Entra ID を使用したキーレス認証 に DefaultAzureCredential を使用します。
検索インデックスを作成する
このクイック スタートでは、ホテル データを読み込んでクエリを実行するホテル インデックスを作成します。 この手順では、インデックス内のフィールドを定義します。 それぞれのフィールドの定義には、名前とデータ型、属性が存在し、それらによってフィールドの使い方が決まります。
この例では、わかりやすく読みやすくするために 、SearchIndexClient クラスの同期メソッドを使用します。 ただし、運用環境のシナリオでは、 SearchIndexAsyncClient クラスを使用して、アプリのスケーラビリティと応答性を維持します。
構造を定義する
Hotel.javaとAddress.javaの 2 つのヘルパー クラスを作成して、ホテル ドキュメントとそのアドレスの構造を定義します。
Hotel クラスには、ホテルの ID、名前、説明、カテゴリ、タグ、駐車場、改装日、評価、住所のフィールドが含まれます。
Address クラスには、番地、市区町村、都道府県、郵便番号、国/地域のフィールドが含まれます。
azure-search-documents クライアント ライブラリでは、 SearchableField と SimpleField を使用してフィールド定義を効率化できます。 どちらも、フィールドまたはメソッドに適用して SearchField を生成できる注釈です。
-
SimpleFieldは任意のデータ型にすることができ、常に検索不可 (フルテキスト検索クエリでは無視されます)、取得可能です (非表示ではありません)。 その他の属性は、既定ではオフですが、有効にすることができます。SimpleFieldは、フィルター、ファセット、スコアリング プロファイルでのみ使用されるフィールドやドキュメント ID での使用が考えられます。 その場合は、ドキュメント ID のisKey = trueなど、シナリオに必要な属性を適用します。 -
SearchableFieldは文字列である必要があります。常に検索可能で、取得可能となります。 その他の属性は、既定ではオフですが、有効にすることができます。 検索可能なタイプのフィールドであるため、同意語がサポートされるほか、アナライザーのプロパティがすべてサポートされます。
基本 SearchField API を使用する場合も、そのいずれかのヘルパー モデルを使用する場合も、フィルター、ファセット、並べ替えの属性は明示的に有効にする必要があります。 たとえば、前のサンプルに示すように、 isFilterable、 isSortable、 isFacetable を明示的に属性化する必要があります。
検索インデックスを作成する
App.javaでは、SearchIndex オブジェクトを作成し、createOrUpdateIndex メソッドを呼び出して検索サービスのインデックスを表します。 インデックスには、指定されたフィールドでオートコンプリートを有効にするための SearchSuggester も含まれています。
// Create Search Index for Hotel model
searchIndexClient.createOrUpdateIndex(
new SearchIndex(indexName, SearchIndexClient.buildSearchFields(Hotel.class, null))
.setSuggesters(new SearchSuggester("sg", Arrays.asList("HotelName"))));
インデックスにドキュメントをアップロードする
Azure AI 検索は、サービスに格納されたコンテンツを対象に検索を実行します。 この手順では、成したホテル インデックスに準拠した JSON ドキュメントを読み込みます。
Azure AI 検索における検索ドキュメントは、インデックス作成への入力とクエリからの出力を兼ねたデータ構造です。 外部データ ソースから取得したドキュメント入力には、データベース内の行、Azure Blob Storage 内の BLOB、ディスク上の JSON ドキュメントなどがあります。 この例では、ショートカットを作成し、4 つのホテルの JSON ドキュメントを直接埋め込みます。
ドキュメントをアップロードするときは、IndexDocumentsBatch オブジェクトを使用する必要があります。
IndexDocumentsBatch オブジェクトには IndexActions のコレクションが含まれており、それぞれにドキュメントと、実行するアクション (アップロード、マージ、削除、mergeOrUpload) を Azure AI Search に伝えるプロパティが含まれています。
App.javaでは、ドキュメントとインデックスアクションの配列を作成し、配列をIndexDocumentsBatchに渡します。 次に示すドキュメントは、Hotel クラスで定義されている hotels-quickstart インデックスに準拠しています。
private static void uploadDocuments(SearchClient searchClient)
{
var hotelList = new ArrayList<Hotel>();
var hotel = new Hotel();
hotel.hotelId = "1";
hotel.hotelName = "Stay-Kay City Hotel";
hotel.description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
hotel.category = "Boutique";
hotel.tags = new String[] { "view", "air conditioning", "concierge" };
hotel.parkingIncluded = false;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(2022, 1, 18), LocalTime.of(0, 0)), ZoneOffset.UTC);
hotel.rating = 3.6;
hotel.address = new Address();
hotel.address.streetAddress = "677 5th Ave";
hotel.address.city = "New York";
hotel.address.stateProvince = "NY";
hotel.address.postalCode = "10022";
hotel.address.country = "USA";
hotelList.add(hotel);
// REDACTED FOR BREVITY
var batch = new IndexDocumentsBatch<Hotel>();
batch.addMergeOrUploadActions(hotelList);
try
{
searchClient.indexDocuments(batch);
}
catch (Exception e)
{
e.printStackTrace();
// If for some reason any documents are dropped during indexing, you can compensate by delaying and
// retrying. This simple demo just logs failure and continues
System.err.println("Failed to index some of the documents");
}
}
uploadDocuments メソッドは、IndexDocumentsBatch を作成し、SearchClient で indexDocuments を呼び出してドキュメントをアップロードします。 このクイック スタートでは、エンドポイントと資格情報を個別に構成する必要がある SearchClient を使用して、を個別に作成します。
uploadDocuments(searchClient);
このコンソール アプリはすべてのコマンドを順番に実行するため、インデックス作成とクエリの間に 2 秒の待機時間が追加されます。
// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
System.out.println("Waiting for indexing...\n");
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
}
2 秒の遅延は、クエリが実行される前にすべてのドキュメントにインデックスを作成できるように、非同期のインデックス作成を補正します。 通常、遅延のコーディングは、デモ、テスト、およびサンプル アプリケーションでのみ必要です。
インデックスのクエリを実行する
最初のドキュメントのインデックスが作成されるとすぐにクエリの結果を取得できますが、インデックスの実際のテストではすべてのドキュメントのインデックスが作成されるまで待つ必要があります。
このセクションでは、クエリ ロジックと結果の 2 つの機能を追加します。 クエリの場合は、 検索 方法を使用します。 このメソッドは、検索テキスト (クエリ文字列) と他のオプションを受け取ります。
SearchPagedIterable クラスは結果を表します。
App.java 内の WriteDocuments メソッドは、検索結果をコンソールに出力します。
// Write search results to console
private static void WriteSearchResults(SearchPagedIterable searchResults)
{
searchResults.iterator().forEachRemaining(result ->
{
Hotel hotel = result.getDocument(Hotel.class);
System.out.println(hotel);
});
System.out.println();
}
// Write autocomplete results to console
private static void WriteAutocompleteResults(AutocompletePagedIterable autocompleteResults)
{
autocompleteResults.iterator().forEachRemaining(result ->
{
String text = result.getText();
System.out.println(text);
});
System.out.println();
}
クエリの例 1
RunQueries メソッドは、クエリを実行して結果を返します。 結果は、Hotel オブジェクトです。 このサンプルは、メソッド シグネチャと最初のクエリを示しています。 このクエリは、ドキュメントから選択されたフィールドを使用して結果を作成できる Select パラメーターを示しています。
// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
// Query 1
System.out.println("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
SearchOptions options = new SearchOptions();
options.setIncludeTotalCount(true);
options.setFilter("");
options.setOrderBy("");
options.setSelect("HotelId", "HotelName", "Address/City");
WriteSearchResults(searchClient.search("*", options, Context.NONE));
}
クエリの例 2
2 番目のクエリで用語を検索し、 Rating が 4 より大きいドキュメントを選択するフィルターを追加し、降順で Rating 並べ替えます。 フィルターは、インデックス内の isFilterable フィールドに対して評価されるブール式です。 フィルター クエリでは、値は包含されるか除外されるかのどちらかです。 そのため、フィルター クエリに関連付けられている関連性スコアはありません。
// Query 2
System.out.println("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
options = new SearchOptions();
options.setFilter("Rating gt 4");
options.setOrderBy("Rating desc");
options.setSelect("HotelId", "HotelName", "Rating");
WriteSearchResults(searchClient.search("hotels", options, Context.NONE));
クエリの例 3
3 番目のクエリは、フルテキスト検索操作のスコープを特定のフィールドに設定するために使用される searchFieldsを示しています。
// Query 3
System.out.println("Query #3: Limit search to specific fields (pool in Tags field)...\n");
options = new SearchOptions();
options.setSearchFields("Tags");
options.setSelect("HotelId", "HotelName", "Tags");
WriteSearchResults(searchClient.search("pool", options, Context.NONE));
クエリの例 4
4 番目のクエリは、ファセット ナビゲーション構造を構築するために使用できる facets を示しています。
// Query 4
System.out.println("Query #4: Facet on 'Category'...\n");
options = new SearchOptions();
options.setFilter("");
options.setFacets("Category");
options.setSelect("HotelId", "HotelName", "Category");
WriteSearchResults(searchClient.search("*", options, Context.NONE));
クエリの例 5
5 番目のクエリでは、特定のドキュメントを返します。 ドキュメント参照は、結果セット内の OnClick イベントに対する一般的な応答です。
// Query 5
System.out.println("Query #5: Look up a specific document...\n");
Hotel lookupResponse = searchClient.getDocument("3", Hotel.class);
System.out.println(lookupResponse.hotelId);
System.out.println();
クエリの例 6
最後のクエリは、オートコンプリートの構文を示しています。これは、インデックスで定義した suggester に関連付けられている の 2 つの一致候補に解決される、sourceFields という部分的なユーザーによる入力をシミュレートしています。
// Query 6
System.out.println("Query #6: Call Autocomplete on HotelName that starts with 's'...\n");
WriteAutocompleteResults(searchClient.autocomplete("s", "sg"));
クエリの概要
上記のクエリは、クエリで語句を照合する複数の方法 (フルテキスト検索、フィルター、オートコンプリート) を示しています。
SearchClient.search メソッドは、フルテキスト検索とフィルターを実行します。
searchText クラスのフィルター プロパティでフィルター式を渡しながら、文字列に検索クエリを渡すことができます。 検索せずにフィルター処理するには、"*"メソッドのsearchTextパラメーターのを渡すだけです。 フィルター処理を行わずに検索するには、filter プロパティを未設定のままにするか、SearchOptions インスタンスを 1 つも渡さないようにします。
このクイック スタートでは、 JavaScript 用の Azure AI Search クライアント ライブラリ を使用して、フルテキスト検索 (キーワード検索とも呼ばれます) の 検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
Node.js 20 LTS 以降。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-javascript-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-javascript-samples/quickstart-keyword-search code .sample.envで、SEARCH_API_ENDPOINTのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。sample.envの名前を.envに変更します。mv sample.env .env依存関係をインストールします。
npm installインストールが完了すると、プロジェクト ディレクトリに
node_modulesフォルダーが表示されます。Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az login
コードの実行
アプリケーションを実行します。
node index.js
アウトプット
出力は次のようになります。
Running Azure AI Search Javascript quickstart...
Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart-js has been created.
Uploading documents...
Index operations succeeded: true
Querying the index...
Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4
Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索クライアントを作成する
index.jsでは、次の 2 つのクライアントを作成します。
- SearchIndexClient は、インデックスを作成します。
- SearchClient は、既存のインデックスを読み込んでクエリを実行します。
どちらのクライアントでも、認証にサービス エンドポイントと資格情報が必要です。 このクイック スタートでは、Microsoft Entra ID を使用したキーレス認証 に DefaultAzureCredential を使用します。
const credential = new DefaultAzureCredential();
const indexClient = new SearchIndexClient(endpoint, credential);
検索インデックスを作成する
このクイック スタートでは、ホテル データを読み込んでクエリを実行するホテル インデックスを作成します。 この手順では、JSON ファイルからインデックス定義をインポートし、検索サービスにインデックスを作成します。
hotels_quickstart_index.json ファイルは、フィールドとその属性を含むインデックス スキーマを定義します。 各フィールドは name によって識別され、type が指定されています。 また各フィールドは、Azure AI 検索がそのフィールドに対して検索、フィルター、並べ替え、およびファセットを実行できるかどうかを指定する、一連のインデックス属性も備えています。 ほとんどのフィールドは単純なデータ型ですが、 Addressなど、インデックスに豊富なデータ構造を作成できる複合型があります。
サポートされているデータ型とインデックスの属性について詳しくは、インデックスの作成 (REST) に関するページを参照してください。
次のコードは、main 関数がインデックス定義にアクセスできるように、hotels_quickstart_index.jsonの先頭にindex.jsをインポートします。
const indexDefinition = require('./hotels_quickstart_index.json');
このクイック スタートでは、インデックスが既に存在する場合は削除します。これは、テスト/デモ コードの一般的な方法です。 次の関数は、インデックスの削除を試みます。
async function deleteIndexIfExists(indexClient, indexName) {
try {
await indexClient.deleteIndex(indexName);
console.log('Deleting index...');
} catch {
console.log('Index does not exist yet.');
}
}
次のコードは、インデックス定義からインデックス名を抽出し、indexName関数にindexClientと共にdeleteIndexIfExists()を渡します。
const indexName = indexDefinition["name"];
console.log('Checking if index exists...');
await deleteIndexIfExists(indexClient, indexName);
その後、 createIndex() メソッドを使用してインデックスを作成します。
console.log('Creating index...');
let index = await indexClient.createIndex(indexDefinition);
console.log(`Index named ${index.name} has been created.`);
インデックスにドキュメントをアップロードする
Azure AI 検索では、ドキュメントは、インデックス作成の入力とクエリからの出力の両方であるデータ構造です。 このようなデータをインデックスにプッシュするか、インデクサーを使用することができます。 このクイック スタートでは、プログラムによってドキュメントをインデックスにプッシュします。
ドキュメントの入力には、このクイック スタートのように、データベース内の行、Azure Blob Storage 内の BLOB、ディスク上の JSON ドキュメントなどがあります。
indexDefinitionと同様に、メイン関数でデータにアクセスできるように、hotels.jsonの上部にindex.jsをインポートします。
const hotelData = require('./hotels.json');
検索インデックスにデータのインデックスを作成するには、 SearchClient を作成します。
SearchIndexClientはインデックスを作成して管理しますが、SearchClientはドキュメントをアップロードし、インデックスに対してクエリを実行します。
このクイック スタートでは、同じ資格情報を再利用する SearchClient を使用して、SearchIndexClientからを取得します。
const searchClient = indexClient.getSearchClient(indexName);
次のコードでは、 mergeOrUploadDocuments() メソッドを使用してドキュメントを検索インデックスにアップロードします。このメソッドは、ドキュメントをアップロードするか、同じキーを持つドキュメントが既に存在する場合は既存のドキュメントとマージします。
console.log('Uploading documents...');
let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);
console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)}`);
インデックスのクエリを実行する
インデックスを作成し、ドキュメントをアップロードしたところで、クエリをインデックスに送信する準備が整いました。 このセクションでは、5 つの異なるクエリを検索インデックスに送信して、使用できるさまざまなクエリ機能を示します。
クエリは、main 関数で次のように呼び出される sendQueries() 関数で記述されます。
await sendQueries(searchClient);
search()のsearchClientメソッドはクエリを送信します。 1 つ目のパラメーターは検索テキストで、2 つ目のパラメーターは検索オプションを指定します。
クエリの例 1
最初のクエリでは * を検索します。これはすべてを検索することと同じで、インデックス内のフィールドのうち 3 つが選択されます。 不要なデータをプルするとクエリでの待ち時間が長くなる可能性があるため、必要なフィールドのみ select することをお勧めします。
このクエリではまた、searchOptions の includeTotalCount が true に設定されています。これにより、一致した結果の数が検出されて返されます。
async function sendQueries(searchClient) {
console.log('Query #1 - search everything:');
let searchOptions = {
includeTotalCount: true,
select: ["HotelId", "HotelName", "Rating"]
};
let searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
console.log(`Result count: ${searchResults.count}`);
// remaining queries go here
}
以下で説明する残りのクエリも sendQueries() 関数に追加する必要があります。 ここでは読みやすいようにそれらを区切ってあります。
クエリの例 2
次のクエリでは、 "wifi" 検索用語を指定し、状態が 'FL' と等しい結果のみを返すフィルターを含めます。 さらに結果はホテルの Rating の順に並べられます。 フィルターは、インデックス内のフィルター可能なフィールドに対して評価されるブール式です。 フィルター クエリでは、値は包含されるか除外されるかのどちらかです。 そのため、フィルター クエリに関連付けられている関連性スコアはありません。
console.log('Query #2 - Search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
filter: odata`Address/StateProvince eq ${state}`,
orderBy: ["Rating desc"],
select: ["HotelId", "HotelName", "Rating"]
};
searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 3
3 番目のクエリでは、 searchFields パラメーターを使用して、検索可能な 1 つのフィールドに検索を制限します。 この方法は、特定のフィールドとの一致にのみ関心があることがわかっている場合にクエリを効率化できる優れたオプションです。
console.log('Query #3 - Limit searchFields:');
searchOptions = {
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("sublime cliff", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 4
クエリによく含められるもう 1 つのオプションは、facets です。 ファセットを使用すると、UI 上でフィルターを構築できます。そうすることで、ユーザーがどの値をフィルターで絞り込めるかを簡単に把握できるようになります。 このクエリでは、検索を HotelName フィールドに制限します。
console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
facets: ["Category"],
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 5
最後のクエリでは、getDocument() の searchClient メソッドを使用します。 これにより、そのキーでドキュメントを効率的に取得できます。
console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument(key='3')
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`)
クエリの概要
前のクエリでは、フルテキスト検索、フィルター、ドキュメント検索など、クエリ内の用語を一致する複数の方法が示されています。
searchClient.search メソッドは、フルテキスト検索とフィルターを実行します。
searchText クラスの filter プロパティでフィルター式を渡しながら、SearchOptions文字列に検索クエリを渡すことができます。 検索せずにフィルター処理するには、"*" メソッドのsearchText パラメーターのsearchを渡すだけです。 フィルター処理を行わずに検索するには、filter プロパティを未設定のままにするか、SearchOptions インスタンスを 1 つも渡さないようにします。
このクイック スタートでは、PowerShell と Azure AI Search REST API を 使用して、 フルテキスト検索 (キーワード検索とも呼ばれます) の検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
PowerShell 7 以降。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-powershell-samplesクイック スタート フォルダーに移動します。
cd azure-search-powershell-samples/QuickstartMicrosoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az loginazure-search-quickstart.ps1で、$baseUrlのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。
コードの実行
同じターミナルで、次の PowerShell スクリプトを実行して、このクイック スタートを実行します。
.\azure-search-quickstart.ps1
アウトプット
このスクリプトは、既存のインデックスを削除し、新しいインデックスを作成し、ドキュメントをアップロードして、複数のフルテキスト検索クエリを実行します。 出力には、各操作の完全な HTTP 要求と応答が表示されます。 次の例は、"restaurant wifi" を検索するときの応答を示しています。
{
"value": [
{
"@search.score": 0.6931472,
"HotelName": "Old Century Hotel",
"Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Tags": ["pool", "free wifi", "concierge"]
},
{
"@search.score": 0.5575875,
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
"Tags": ["restaurant", "bar", "continental breakfast"]
}
]
}
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索インデックスを作成する
Azure AI Search にコンテンツを追加する前に、コンテンツの格納方法と構造化方法を定義するインデックスを作成する必要があります。 インデックスは概念的にはリレーショナル データベースのテーブルに似ていますが、フルテキスト検索などの検索操作用に特別に設計されています。
このクイック スタートでは、最初に同じ名前の既存のインデックスを削除します。これは、繰り返し実行されるテスト/デモ コードの一般的な方法です。
Send-Request DELETE "$baseUrl/indexes/hotels-quickstart?api-version=2025-09-01" $headers
このクイック スタートでは、 Indexes - Create (REST API) を呼び出して、 hotels-quickstart という名前の検索インデックスとその物理データ構造を検索サービスに構築します。
$body = @"
{
"name": "hotels-quickstart",
"fields": [
{"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
{"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
{"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
...
]
}
"@
Send-RequestWithBody POST "$baseUrl/indexes?api-version=2025-09-01" $headers $body
インデックス スキーマ内では、 fields コレクションによってホテル ドキュメントの構造が定義されます。 各フィールドには、インデックス作成とクエリ中の動作を決定する name、データ type、および属性があります。
HotelId フィールドはキーとしてマークされ、Azure AI Search ではインデックス内の各ドキュメントを一意に識別する必要があります。
インデックス スキーマに関する重要なポイント:
文字列フィールド (
Edm.String) を使用して、数値データのフルテキスト検索を可能にします。 など、サポートされているその他のEdm.Int32は、フィルター可能、並べ替え可能、ファセット可能、および取得可能ですが、検索できません。ほとんどのフィールドは単純なデータ型ですが、
Addressフィールドなど、入れ子になったデータを表す複合型を定義できます。フィールド属性は、許可されるアクションを決定します。 REST API は、既定で多くのアクションを使用できます。 たとえば、すべての文字列は検索可能で取得可能です。 REST API では、動作を無効にする必要がある場合にのみ属性を使用できます。
インデックスにドキュメントをアップロードする
新しく作成されたインデックスは空です。 インデックスを設定して検索できるようにするには、インデックス スキーマに準拠する JSON ドキュメントをアップロードする必要があります。
Azure AI Search では、ドキュメントはインデックス作成の入力とクエリの出力の両方として機能します。 わかりやすくするために、このクイック スタートでは、サンプルのホテル ドキュメントをインライン JSON として提供します。 ただし、運用環境のシナリオでは、多くの場合、コンテンツは接続されたデータ ソースからプルされ、 インデクサーを使用して JSON に変換されます。
このクイック スタートでは 、Documents - Index (REST API) を呼び出して、インデックスに 4 つのサンプル ホテル ドキュメントを追加します。 前の要求と比較して、URI は、 docs コレクションと index 操作を含むように拡張されます。
$body = @"
{
"value": [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is...",
...
},
...
]
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/index?api-version=2025-09-01" $headers $body
value配列内の各ドキュメントはホテルを表し、インデックス スキーマに一致するフィールドが含まれています。
@search.action パラメーターは、各ドキュメントに対して実行する操作を指定します。 この例では、 uploadを使用します。ドキュメントが存在しない場合はドキュメントを追加し、存在する場合はドキュメントを更新します。
インデックスのクエリを実行する
ドキュメントがインデックスに読み込まれたので、フルテキスト検索を使用して、フィールド内の特定の用語または語句を検索できます。
このクイック スタートでは 、Documents - Search Post (REST API) を呼び出して、検索条件に一致するホテル ドキュメントを検索します。 URI は、 /docs/search 操作を対象とします。
フルテキスト検索要求には、クエリ テキストを含む search パラメーターが含まれます。これには、用語、フレーズ、または演算子を含めることができます。 クエリは、各ドキュメント内のすべての検索可能なフィールドを検索します。 次の例は、一般的なクエリ パターンを示しています。
クエリの例 1
次のクエリでは、検索可能なすべてのフィールドで "restaurant wifi" という用語を検索します。 既定では、Azure AI Search は検索語句のいずれかに一致するドキュメントを返します。
$body = @"
{
"search": "restaurant wifi",
"select": "HotelName, Description, Tags"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
select パラメーターは、応答で返されるフィールドをHotelName、Description、およびTagsに制限します。
クエリの例 2
次のクエリでは、 filter 式を使用して、評価が 4 より大きいホテルのみを返します。
$body = @"
{
"search": "*",
"filter": "Rating gt 4",
"select": "HotelName,Rating"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
search パラメーターは * に設定され、すべてのドキュメントに一致します。
filter パラメーターは、ブール条件を適用して結果を絞り込みます。
クエリの例 3
次のクエリでは、"boutique" を検索し、 top を使用して最初の 2 つの結果のみを返します。
$body = @"
{
"search": "boutique",
"select": "HotelName,Category",
"top": 2
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
クエリの例 4
次のクエリでは、"pool" を検索し、 orderby を使用して、 Rating 降順で結果を並べ替えます。
$body = @"
{
"search": "pool",
"select": "HotelName,Description,Tags,Rating",
"orderby": "Rating desc"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
このクイック スタートでは、 Python 用 Azure AI Search クライアント ライブラリ を使用して、フルテキスト検索 (キーワード検索とも呼ばれます) の 検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
Python 3.8 以降。
Python および Jupyter 拡張機能を含む Visual Studio Code。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-python-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-python-samples/Quickstart-Keyword-Search code .azure-search-quickstart.ipynbを開きます。Ctrl + Shift + P キーを押し、[Notebook: Select Notebook Kernel]\(ノートブック カーネルの選択\) を選択し、画面の指示に従って仮想環境を作成します。
完了すると、プロジェクト ディレクトリに
.venvフォルダーが表示されます。最初のコード セルを実行して、必要なパッケージをインストールします。
2 番目のコード セルで、
search_endpointのプレースホルダー値を Get エンドポイントで取得した URL に置き換え、セルを実行します。Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az login
コードの実行
残りのコード セルを順番に実行して、インデックスの作成、ドキュメントのアップロード、インデックスのクエリを実行します。
アウトプット
各コード セルは、その出力をノートブックに出力します。 次の例は、最初のクエリの出力であり、インデックス内のすべてのドキュメントを返す空の検索です。
Total Documents Matching Query: 4
1.0
Gastronomic Landscape Hotel
['restaurant', 'bar', 'continental breakfast']
Description: The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.
1.0
Old Century Hotel
['pool', 'free wifi', 'concierge']
Description: The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
1.0
Sublime Palace Hotel
['concierge', 'view', 'air conditioning']
Description: Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience.
1.0
Stay-Kay City Hotel
['view', 'air conditioning', 'concierge']
Description: This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
クライアントを作成する
ノートブックは、次の 2 つのクライアントを作成します。
- SearchIndexClient は 、インデックスを作成および管理します。
- SearchClient は ドキュメントを読み込み、クエリを実行します。
どちらのクライアントにも、サービス エンドポイントと資格情報が必要です。 このクイック スタートでは、Microsoft Entra ID を使用したキーレス認証 に DefaultAzureCredential を使用します。
検索インデックスを作成する
このクイック スタートでは、ホテル データを読み込んでクエリを実行するホテル インデックスを作成します。 この手順では、インデックス内のフィールドを定義します。 それぞれのフィールドの定義には、名前とデータ型、属性が存在し、それらによってフィールドの使い方が決まります。
ノートブックでは、SimpleFieldのSearchableField、ComplexField、およびを使用してスキーマを定義します。
サポートされているデータ型とインデックスの属性について詳しくは、インデックスの作成 (REST) に関するページを参照してください。
# Create a search schema
index_client = SearchIndexClient(
endpoint=search_endpoint, credential=credential)
fields = [
SimpleField(name="HotelId", type=SearchFieldDataType.String, key=True),
SearchableField(name="HotelName", type=SearchFieldDataType.String, sortable=True),
SearchableField(name="Description", type=SearchFieldDataType.String, analyzer_name="en.lucene"),
SearchableField(name="Category", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="Tags", collection=True, type=SearchFieldDataType.String, facetable=True, filterable=True),
SimpleField(name="ParkingIncluded", type=SearchFieldDataType.Boolean, facetable=True, filterable=True, sortable=True),
SimpleField(name="LastRenovationDate", type=SearchFieldDataType.DateTimeOffset, facetable=True, filterable=True, sortable=True),
SimpleField(name="Rating", type=SearchFieldDataType.Double, facetable=True, filterable=True, sortable=True),
ComplexField(name="Address", fields=[
SearchableField(name="StreetAddress", type=SearchFieldDataType.String),
SearchableField(name="City", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="StateProvince", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="PostalCode", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="Country", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
])
]
scoring_profiles = []
suggester = [{'name': 'sg', 'source_fields': ['Tags', 'Address/City', 'Address/Country']}]
# Create the search index=
index = SearchIndex(name=index_name, fields=fields, suggesters=suggester, scoring_profiles=scoring_profiles)
result = index_client.create_or_update_index(index)
print(f' {result.name} created')
インデックスにドキュメントをアップロードする
Azure AI 検索は、サービスに格納されたコンテンツを対象に検索を実行します。 この手順では、成したホテル インデックスに準拠した JSON ドキュメントを読み込みます。
Azure AI 検索では、ドキュメントは、インデックス作成の入力とクエリからの出力の両方であるデータ構造です。 ノートブックは、ホテル データを含むディクショナリの一覧としてドキュメント ペイロードを定義します。
# Create a documents payload
documents = [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Category": "Boutique",
"Tags": [ "view", "air conditioning", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "2020-01-18T00:00:00Z",
"Rating": 3.60,
"Address": {
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "2",
"HotelName": "Old Century Hotel",
"Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Category": "Boutique",
"Tags": [ "pool", "free wifi", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "2019-02-18T00:00:00Z",
"Rating": 3.60,
"Address": {
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Category": "Suite",
"Tags": [ "restaurant", "bar", "continental breakfast" ],
"ParkingIncluded": "true",
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.80,
"Address": {
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "4",
"HotelName": "Sublime Palace Hotel",
"Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience.",
"Category": "Boutique",
"Tags": [ "concierge", "view", "air conditioning" ],
"ParkingIncluded": "true",
"LastRenovationDate": "2020-02-06T00:00:00Z",
"Rating": 4.60,
"Address": {
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216",
"Country": "USA"
}
}
]
upload_documents メソッドは、ドキュメントをインデックスに追加し、ドキュメントが存在しない場合は作成し、存在しない場合は更新します。
search_client = SearchClient(endpoint=search_endpoint,
index_name=index_name,
credential=credential)
try:
result = search_client.upload_documents(documents=documents)
print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
print (ex.message)
インデックスのクエリを実行する
最初のドキュメントのインデックスが作成されるとすぐにクエリの結果を取得できますが、インデックスの実際のテストではすべてのドキュメントのインデックスが作成されるまで待つ必要があります。
クエリを実行するには、search の メソッドを使用します。
ノートブックのサンプル クエリは、一般的なパターンを示しています。
空の検索: 空の検索 (
search_text="*") を実行し、任意のドキュメントのランクなしのリスト (検索スコア = 1.0) を返します。 条件がないため、すべてのドキュメントが結果に含まれます。用語検索: 検索式 (
search_text="wifi") に用語全体を追加します。 このクエリでは、結果にselectパラメーター内のフィールドのみが含まれていることを指定します。 返されるフィールドを制限すると、ネットワーク経由で返されるデータの量が最小限に抑えられ、検索の待ち時間が短縮されます。フィルター検索: 評価が 4 より大きいホテルのみを降順に並べ替え、返すフィルター式を追加します。
フィールド検索: クエリ実行のスコープを特定のフィールドに
search_fields追加します。ファセット検索: 検索結果で見つかったヒットに基づいてファセットを生成します。 一致が 0 件になることはありません。 検索結果に "wifi" という用語が含まれていない場合、ファセット ナビゲーション構造に "wifi" は表示されません。
ドキュメント検索: キーに基づいてドキュメントを返します。 この操作は、ユーザーが検索結果のアイテムを選択したときにドリルスルーを提供する場合に便利です。
オートコンプリート: ユーザーが検索ボックスに入力すると、一致する候補を表示します。 オートコンプリートでは、suggester 要求に一致する可能性があるものを含むフィールドを把握するために、suggester (
sg) が使用されします。 このクイック スタートでは、これらのフィールドはTags、Address/City、およびAddress/Countryです。 オートコンプリートをシミュレートするには、文字 "sa" を部分的な文字列として渡します。autocompleteのSearchClientメソッドは、潜在的な用語の一致を返します。
インデックスを削除する
このインデックスが完成した場合は、 Clean up コード セルを実行して削除できます。 不要なインデックスを削除すると、スペースが解放され、より多くのクイックスタートやチュートリアルを実行できるようになります。
try:
result = index_client.delete_index(index_name)
print ('Index', index_name, 'Deleted')
except Exception as ex:
print (ex)
このクイック スタートでは、 Azure AI Search REST API を 使用して、 フルテキスト検索 (キーワード検索とも呼ばれます) の検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-rest-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-rest-samples/Quickstart-keyword-search code .az-search-quickstart.restで、@baseUrlのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az loginMicrosoft Entra ID によるキーレス認証の場合は、アクセス トークンを生成します。
az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv@tokenのプレースホルダーの値を、前の手順のアクセス トークンに置き換えます。
コードの実行
[
### List existing indexes by nameで、[要求の 送信 ] を選択して接続を確認します。隣接するウィンドウに応答が表示されます。 既存のインデックスがある場合は、そのインデックスが一覧表示されます。 それ以外の場合は、リストは空です。 HTTP コードが
200 OK場合は、続行する準備が整います。残りの要求を順番に送信して、インデックスの作成、ドキュメントのアップロード、インデックスのクエリを実行します。
アウトプット
各要求は、操作に基づいて異なる JSON を返します。 主な出力は ### Run a query からであり、次のようになります。
{
"value": [
{
"@search.score": 0.5575875,
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
"Tags": [
"restaurant",
"bar",
"continental breakfast"
]
}
]
}
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索インデックスを作成する
Azure AI Search にコンテンツを追加する前に、コンテンツの格納方法と構造化方法を定義するインデックスを作成する必要があります。 インデックスは概念的にはリレーショナル データベースのテーブルに似ていますが、フルテキスト検索などの検索操作用に特別に設計されています。
このクイック スタートでは 、Indexes - Create (REST API) を呼び出して、 hotels-quickstart という名前の検索インデックスとその物理データ構造を検索サービスに構築します。
インデックス スキーマ内では、 fields コレクションによってホテル ドキュメントの構造が定義されます。 各フィールドには、インデックス作成とクエリ中の動作を決定する name、データ type、および属性があります。
HotelId フィールドはキーとしてマークされ、Azure AI Search ではインデックス内の各ドキュメントを一意に識別する必要があります。
### Create a new index
POST {{baseUrl}}/indexes?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"name": "hotels-quickstart",
"fields": [
{"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
{"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
{"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
{"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true},
{"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true},
{"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true},
{"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
{"name": "Address", "type": "Edm.ComplexType",
"fields": [
{"name": "StreetAddress", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true},
{"name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "PostalCode", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "Country", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true}
]
}
]
}
インデックス スキーマに関する重要なポイント:
文字列フィールド (
Edm.String) を使用して、数値データのフルテキスト検索を可能にします。 など、サポートされているその他のEdm.Int32は、フィルター可能、並べ替え可能、ファセット可能、および取得可能ですが、検索できません。ほとんどのフィールドは単純なデータ型ですが、
Addressフィールドなど、入れ子になったデータを表す複合型を定義できます。フィールド属性は、許可されるアクションを決定します。 REST API は、既定で多くのアクションを使用できます。 たとえば、すべての文字列は検索可能で取得可能です。 REST API では、動作を無効にする必要がある場合にのみ属性を使用できます。
インデックスにドキュメントをアップロードする
新しく作成されたインデックスは空です。 インデックスを設定して検索できるようにするには、インデックス スキーマに準拠する JSON ドキュメントをアップロードする必要があります。
Azure AI Search では、ドキュメントはインデックス作成の入力とクエリの出力の両方として機能します。 わかりやすくするために、このクイック スタートでは、サンプルのホテル ドキュメントをインライン JSON として提供します。 ただし、運用環境のシナリオでは、多くの場合、コンテンツは接続されたデータ ソースからプルされ、 インデクサーを使用して JSON に変換されます。
このクイック スタートでは 、Documents - Index (REST API) を呼び出して、インデックスに 4 つのサンプル ホテル ドキュメントを追加します。 前の要求と比較して、URI は、 docs コレクションと index 操作を含むように拡張されます。
value配列内の各ドキュメントはホテルを表し、インデックス スキーマに一致するフィールドが含まれています。
@search.action パラメーターは、各ドキュメントに対して実行する操作を指定します。 この例では、 uploadを使用します。ドキュメントが存在しない場合はドキュメントを追加し、存在する場合はドキュメントを更新します。
### Upload documents
POST {{baseUrl}}/indexes/hotels-quickstart/docs/index?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"value": [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Category": "Boutique",
"Tags": [ "view", "air conditioning", "concierge" ],
"ParkingIncluded": false,
"LastRenovationDate": "2022-01-18T00:00:00Z",
"Rating": 3.60,
"Address":
{
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "2",
"HotelName": "Old Century Hotel",
"Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Category": "Boutique",
"Tags": [ "pool", "free wifi", "concierge" ],
"ParkingIncluded": false,
"LastRenovationDate": "2019-02-18T00:00:00Z",
"Rating": 3.60,
"Address":
{
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Category": "Suite",
"Tags": [ "restaurant", "bar", "continental breakfast" ],
"ParkingIncluded": true,
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.80,
"Address":
{
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "4",
"HotelName": "Sublime Palace Hotel",
"Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience.",
"Tags": [ "concierge", "view", "air conditioning" ],
"ParkingIncluded": true,
"LastRenovationDate": "2020-02-06T00:00:00Z",
"Rating": 4.60,
"Address":
{
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216",
"Country": "USA"
}
}
]
}
インデックスのクエリを実行する
ドキュメントがインデックスに読み込まれたので、フルテキスト検索を使用して、フィールド内の特定の用語または語句を検索できます。
このクイック スタートでは 、Documents - Search Post (REST API) を呼び出して、検索条件に一致するホテル ドキュメントを検索します。 URI は、 /docs/search 操作を対象とするようになりました。
フルテキスト検索要求には、クエリ テキストを含む search パラメーターが常に含まれます。 クエリ テキストには、1 つ以上の用語、語句、または演算子を含めることができます。
searchに加えて、他のパラメーターを指定して、検索動作と結果を絞り込むことができます。
クエリでは、各ホテル ドキュメントの Description フィールドと Tags フィールドで"attached restaurant" という用語が検索されます。
select パラメーターは、応答で返されるフィールドを、HotelId、HotelName、Tags、およびDescriptionに制限します。
count パラメーターは、一致するドキュメントの合計数を要求します。
### Run a query
POST {{baseUrl}}/indexes/hotels-quickstart/docs/search?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"search": "attached restaurant",
"select": "HotelId, HotelName, Tags, Description",
"searchFields": "Description, Tags",
"count": true
}
このクイック スタートでは、 JavaScript 用 Azure AI Search クライアント ライブラリ (TypeScript と互換性があります) を使用して、 フルテキスト検索 (キーワード検索とも呼ばれます) の検索インデックスを作成、読み込み、クエリを実行します。
フルテキスト検索では、インデックス作成とクエリに Apache Lucene を使用し、結果をスコア付けするための BM25 ランク付けアルゴリズムを使用します。 このクイック スタートでは、 azure-search-sample-data GitHub リポジトリの架空のホテル データを使用してインデックスを設定します。
ヒント
すぐに始めたいですか? GitHub でソース コードをダウンロードします。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
Azure AI Search サービス。 このクイック スタートでは無料サービスを使用できます。
コンパイル済みコードを実行するには、20 LTS 以降をNode.js します。
TypeScript で TypeScript を JavaScript にコンパイルします。
Git を使ってサンプルリポジトリを複製します。
Microsoft Entra ID を使用したキーレス認証用 の Azure CLI 。
アクセスを構成する
開始する前に、Azure AI Search のコンテンツと操作にアクセスするためのアクセス許可があることを確認してください。 このクイック スタートでは、認証に Microsoft Entra ID を使用し、承認にはロールベースのアクセスを使用します。 ロールを割り当てるには、 所有者 または ユーザー アクセス管理者 である必要があります。 ロールの使用が困難な場合は、代わりにキー ベースの認証を使用してください。
推奨されるロールベースのアクセスを構成するには:
検索サービスのロールベースのアクセスを有効にします。
-
Search Service サービス貢献者
検索インデックス データ共同作成者
検索インデックス データ閲覧者
エンドポイントを取得する
各 Azure AI Search サービスには エンドポイントがあります。エンドポイントは、サービスを識別してネットワーク アクセスを提供する一意の URL です。 後のセクションでは、このエンドポイントを指定して、プログラムで検索サービスに接続します。
エンドポイントを取得するには:
Azure portal にサインインし、検索サービスを選択します。
左側のウィンドウで、[ 概要] を選択します。
https://my-service.search.windows.netのような形式のエンドポイントをメモしておいてください。
環境をセットアップする
Git を使用してサンプル リポジトリを複製します。
git clone https://github.com/Azure-Samples/azure-search-javascript-samplesクイック スタート フォルダーに移動し、Visual Studio Code で開きます。
cd azure-search-javascript-samples/quickstart-keyword-search code .sample.envで、SEARCH_API_ENDPOINTのプレースホルダー値を Get エンドポイントで取得した URL に置き換えます。sample.envの名前を.envに変更します。mv sample.env .env依存関係をインストールします。
npm install npm install typescript @types/node --save-dev npm pkg set type=moduleインストールが完了すると、プロジェクト ディレクトリに
node_modulesフォルダーが表示されます。Microsoft Entra ID によるキーレス認証の場合は、Azure アカウントにサインインします。 複数のサブスクリプションがある場合は、Azure AI Search サービスを含むサブスクリプションを選択します。
az login
コードの実行
サンプル コードでは、既定で JavaScript が使用されます。 TypeScript を使用してコードを実行するには:
tsconfig.jsonという名前のファイルを作成し、次のコードを貼り付けます。{ "compilerOptions": { "module": "NodeNext", "target": "ES2022", "moduleResolution": "NodeNext", "skipLibCheck": true, "strict": true, "resolveJsonModule": true }, "include": ["*.ts"], "exclude": ["node_modules"] }index.jsファイルの名前をindex.tsに変更し、内容を次のコードに置き換えます。 このコードは、TypeScript コンパイルに必要な CommonJS 構文を ES モジュールのインポートに変換します。// Import from the @azure/search-documents library import { SearchIndexClient, SearchClient, SearchFieldDataType, odata, SearchIndex } from "@azure/search-documents"; // Import from the Azure Identity library import { DefaultAzureCredential } from "@azure/identity"; // Importing the hotels sample data import hotelData from './hotels.json' with { type: "json" }; // Load the .env file if it exists import "dotenv/config"; // Defining the index definition const indexDefinition: SearchIndex = { "name": "hotels-quickstart", "fields": [ { "name": "HotelId", "type": "Edm.String" as SearchFieldDataType, "key": true, "filterable": true }, { "name": "HotelName", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": false, "sortable": true, "facetable": false }, { "name": "Description", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzerName": "en.lucene" }, { "name": "Category", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true }, { "name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true }, { "name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true }, { "name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true }, { "name": "Address", "type": "Edm.ComplexType", "fields": [ { "name": "StreetAddress", "type": "Edm.String" as SearchFieldDataType, "filterable": false, "sortable": false, "facetable": false, "searchable": true }, { "name": "City", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "StateProvince", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "PostalCode", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "Country", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true } ] } ], "suggesters": [ { "name": "sg", "searchMode": "analyzingInfixMatching", "sourceFields": [ "HotelName" ] } ] }; async function main() { // Your search service endpoint (from .env file) const searchServiceEndpoint = process.env.SEARCH_API_ENDPOINT || ""; // Use the recommended keyless credential instead of the AzureKeyCredential credential. const credential = new DefaultAzureCredential(); //const credential = new AzureKeyCredential(Your search service admin key); // Create a SearchIndexClient to send create/delete index commands const searchIndexClient: SearchIndexClient = new SearchIndexClient( searchServiceEndpoint, credential ); // Creating a search client to upload documents and issue queries const indexName: string = "hotels-quickstart"; const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName); console.log('Checking if index exists...'); await deleteIndexIfExists(searchIndexClient, indexName); console.log('Creating index...'); let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition); console.log(`Index named ${index.name} has been created.`); console.log('Uploading documents...'); let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']); console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)} `); // waiting one second for indexing to complete (for demo purposes only) await sleep(1000); console.log('Querying the index...'); console.log(); await sendQueries(searchClient); } async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) { try { await searchIndexClient.deleteIndex(indexName); console.log('Deleting index...'); } catch { console.log('Index does not exist yet.'); } } async function sendQueries(searchClient: SearchClient<any>) { // Query 1 console.log('Query #1 - search everything:'); let searchOptions: any = { includeTotalCount: true, select: ["HotelId", "HotelName", "Rating"] }; let searchResults = await searchClient.search("*", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(`Result count: ${searchResults.count}`); console.log(); // Query 2 console.log('Query #2 - search with filter, orderBy, and select:'); let state = 'FL'; searchOptions = { filter: odata`Address/StateProvince eq ${state}`, orderBy: ["Rating desc"], select: ["HotelId", "HotelName", "Rating"] }; searchResults = await searchClient.search("wifi", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 3 console.log('Query #3 - limit searchFields:'); searchOptions = { select: ["HotelId", "HotelName", "Rating"], searchFields: ["HotelName"] }; searchResults = await searchClient.search("sublime palace", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 4 console.log('Query #4 - limit searchFields and use facets:'); searchOptions = { facets: ["Category"], select: ["HotelId", "HotelName", "Rating"], searchFields: ["HotelName"] }; searchResults = await searchClient.search("*", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 5 console.log('Query #5 - Lookup document:'); let documentResult = await searchClient.getDocument('3'); console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`); console.log(); } function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } main().catch((err) => { console.error("The sample encountered an error:", err); });TypeScript から JavaScript にトランスパイルする
npx tscアプリケーションを実行します。
node index.js
アウトプット
出力は次のようになります。
Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart has been created.
Uploading documents...
Index operations succeeded: true
Querying the index...
Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4
Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel
コードを理解する
注
このセクションのコード スニペットは、読みやすくするために変更されている可能性があります。 完全な作業例については、ソース コードを参照してください。
コードを実行したので、主な手順を分解しましょう。
検索クライアントを作成する
index.tsでは、次の 2 つのクライアントを作成します。
- SearchIndexClient は、インデックスを作成します。
- SearchClient は、既存のインデックスを読み込んでクエリを実行します。
どちらのクライアントでも、認証にサービス エンドポイントと資格情報が必要です。 このクイック スタートでは、Microsoft Entra ID を使用したキーレス認証 に DefaultAzureCredential を使用します。
const credential = new DefaultAzureCredential();
const searchIndexClient: SearchIndexClient = new SearchIndexClient(
searchServiceEndpoint,
credential
);
検索インデックスを作成する
このクイック スタートでは、ホテル データを読み込んでクエリを実行するホテル インデックスを作成します。 この手順では、インデックス内のフィールドを定義します。
indexDefinition オブジェクトは、次の手順で読み込むドキュメントに対する Azure AI Search の動作を定義します。 各フィールドは name によって識別され、type が指定されています。 また各フィールドは、Azure AI 検索がそのフィールドに対して検索、フィルター、並べ替え、およびファセットを実行できるかどうかを指定する、一連のインデックス属性も備えています。 ほとんどのフィールドは単純なデータ型ですが、 Addressなど、インデックスに豊富なデータ構造を作成できる複合型があります。
サポートされているデータ型とインデックスの属性について詳しくは、インデックスの作成 (REST) に関するページを参照してください。
const indexDefinition: SearchIndex = {
"name": "hotels-quickstart",
"fields": [
{
"name": "HotelId",
"type": "Edm.String" as SearchFieldDataType,
"key": true,
"filterable": true
},
{
"name": "HotelName",
"type": "Edm.String" as SearchFieldDataType,
"searchable": true,
"filterable": false,
"sortable": true,
"facetable": false
},
// REDACTED FOR BREVITY
],
"suggesters": [
{
"name": "sg",
"searchMode": "analyzingInfixMatching",
"sourceFields": ["HotelName"]
}
]
};
このクイック スタートでは、インデックスが既に存在する場合は削除します。これは、テスト/デモ コードの一般的な方法です。
async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) {
try {
await searchIndexClient.deleteIndex(indexName);
console.log('Deleting index...');
} catch {
console.log('Index does not exist yet.');
}
}
その後、 createIndex() メソッドを使用してインデックスが作成されます。
let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition);
インデックスにドキュメントをアップロードする
Azure AI 検索では、ドキュメントは、インデックス作成の入力とクエリからの出力の両方であるデータ構造です。 このようなデータをインデックスにプッシュするか、インデクサーを使用することができます。 このクイック スタートでは、プログラムによってドキュメントをインデックスにプッシュします。
ドキュメントの入力には、このクイック スタートのように、データベース内の行、Azure Blob Storage 内の BLOB、ディスク上の JSON ドキュメントなどがあります。 ホテルデータはファイルの先頭にインポートされます。
import hotelData from './hotels.json' with { type: "json" };
検索インデックスにデータのインデックスを作成するには、 SearchClient を作成します。
SearchIndexClientはインデックスを作成して管理しますが、SearchClientはドキュメントをアップロードし、インデックスに対してクエリを実行します。
このクイック スタートでは、同じ資格情報を再利用する SearchClient を使用して、SearchIndexClientからを取得します。
const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName);
mergeOrUploadDocuments() メソッドは、同じキーを持つドキュメントが既に存在する場合に、ドキュメントをアップロードするか、既存のドキュメントにマージします。
let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);
インデックスのクエリを実行する
インデックスを作成し、ドキュメントをアップロードしたところで、クエリをインデックスに送信する準備が整いました。 このセクションでは、5 つの異なるクエリを検索インデックスに送信して、使用できるさまざまなクエリ機能を示します。
クエリは、main 関数で呼び出される sendQueries() 関数で記述されます。
await sendQueries(searchClient);
クエリは search() の searchClient メソッドを使用して送信されます。 1 つ目のパラメーターは検索テキストで、2 つ目のパラメーターは検索オプションを指定します。
クエリの例 1
最初のクエリでは、 *を検索します。これはすべてを検索することと同じで、インデックス内の 3 つのフィールドを選択します。 不要なデータをプルするとクエリでの待ち時間が長くなる可能性があるため、必要なフィールドのみ select することをお勧めします。
このクエリではまた、searchOptions の includeTotalCount が true に設定されています。これにより、一致した結果の数が検出されて返されます。
console.log('Query #1 - search everything:');
let searchOptions: any = {
includeTotalCount: true,
select: ["HotelId", "HotelName", "Rating"]
};
let searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
console.log(`Result count: ${searchResults.count}`);
クエリの例 2
次のクエリでは、状態が"wifi"と等しい結果のみを返すように、検索用語'FL'がフィルターで指定されます。 さらに結果はホテルの Rating の順に並べられます。
console.log('Query #2 - search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
filter: odata`Address/StateProvince eq ${state}`,
orderBy: ["Rating desc"],
select: ["HotelId", "HotelName", "Rating"]
};
searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 3
検索は、 searchFields パラメーターを使用して 1 つの検索可能なフィールドに制限されます。 この方法は、特定のフィールドとの一致にのみ関心があることがわかっている場合にクエリを効率化できる優れたオプションです。
console.log('Query #3 - limit searchFields:');
searchOptions = {
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("sublime palace", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 4
クエリによく含められるもう 1 つのオプションは、facets です。 ファセットを使用すると、UI の結果からユーザーが自身で絞り込みを行うことができます。 ファセットの結果は、結果ウィンドウのチェック ボックスに切り替えることができます。
console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
facets: ["Category"],
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
クエリの例 5
最後のクエリでは、getDocument() の searchClient メソッドを使用します。 これにより、そのキーでドキュメントを効率的に取得できます。
console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument('3');
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`);
クエリの概要
前のクエリでは、フルテキスト検索、フィルター、ドキュメント検索など、クエリ内の用語を一致する複数の方法が示されています。
searchClient.search メソッドは、フルテキスト検索とフィルターを実行します。
searchText クラスの filter プロパティでフィルター式を渡しながら、SearchOptions文字列に検索クエリを渡すことができます。 検索せずにフィルター処理するには、"*" メソッドのsearchText パラメーターのsearchを渡すだけです。 フィルター処理を行わずに検索するには、filter プロパティを未設定のままにするか、SearchOptions インスタンスを 1 つも渡さないようにします。
リソースをクリーンアップする
自分のサブスクリプションで作業する場合は、不要になったリソースを削除してプロジェクトを完了することをお勧めします。 リソースを動作させたままだと、お金がかかることがあります。
Azure portal で、左側のウィンドウから [すべてのリソース ] または [リソース グループ ] を選択して、リソースを検索して管理します。 リソースを個別に削除することも、リソース グループを削除してすべてのリソースを一度に削除することもできます。
無料の検索サービスを使用している場合は、3 つのインデックス、インデクサー、データ ソースに制限されていることを覚えておいてください。 ポータルで 個々のアイテムを削除 して、制限を超えないようにすることができます。