Docs Menu
Docs Home
/
Atlas
/

クエリとインデックス

検索クエリと検索インデックスの関係によって、Atlas Search を使用してMongoDBコレクション内のデータをどの程度効率的かつ効果的に見つけることができるかが決まります。

Atlas 検索クエリは、データベース内のドキュメントを検索するための基準を指定します。Atlas Search クエリは 集計パイプラインの形式をとり、これは $search または $searchMeta パイプライン ステージで始まります。パイプライン ステージ内で演算子コレクター検索オプションを使用して、全文検索、関連性ベースのランキング、ファセット検索、フィルタリング、ソートなどの複雑な検索機能を実装できます。

Atlas Search クエリを実行する前に、検索したいフィールドに Atlas Search インデックスを作成する必要があります。検索インデックスは、クエリの検索条件を満たすドキュメントを迅速に検索するために最適化されたデータ構造です。検索インデックスを定義する際には、インデックスを作成するフィールドと、それらのフィールドをどのようにトークン化するかを指定します。

効果的な検索クエリの実現には、検索インデックスの適切な定義が必須です。検索しようとするフィールドにはインデックスを付ける必要があり、インデックス設定によって検索がソート、ファセット、オートコンプリート、その他の検索機能をサポートするかどうかが決まります。クエリとインデックスの両方の設計を反復して、検索の精度とパフォーマンスのバランスを取ることができます。

このページでは、Atlas Search の検索体験を計画し、検索要件に合わせて Atlas Search のインデックスとクエリを定義する方法を説明します。

Atlas Search の実装を計画する際には、まず、提供したい検索エクスペリエンスを定義します。

  • アプリケーションで実行する必要がある検索の種類を明確に特定します。記事タイトルの全文検索とオートコンプリートが必要なブログウェブサイトの検索機能、または、ファセット検索と製品カテゴリによるフィルターが必要なeコマースサイトの検索機能を構築していますか?

  • ユーザーがアプリケーションと対話する方法を決定します。迅速な応答時間や正確なオートコンプリートの提案など、ユーザー エクスペリエンスを向上させる機能を優先します。

次に、ユーザーのニーズに基づいて Atlas Search の検索インデックスとクエリの構造を決定するために、以下の質問を検討します。

Atlas Search を使用してデータを検索する前に、Atlas Search クエリ中に使用する 1 つ以上の Atlas Search インデックスを作成する必要があります。このセクションでは、Atlas Search インデックスの JSON 構成構文にクエリ設定を適用する方法を説明します。

JSON 構文をこのセクションのインデックス定義で使用するには、プレースホルダーを有効な値に置き換え、完全なインデックス定義に必要なオプションが含まれていることを確認します。

Atlas クラスターに Atlas Searchインデックスを追加する方法については、Atlas Search クイック スタート を参照してください。

1

コレクションでクエリしたいフィールドがわかっている場合は、静的マッピングを有効にし、Atlas Search インデックス定義でフィールドを指定します。そうでなければ、動的マッピングを有効にして、サポートされている型のすべてのフィールドに自動的にインデックス作成できます。

詳細については、「静的マッピングと動的マッピング」を参照してください。

注意

コレクションに 16MB 以上のドキュメントが含まれている場合、Atlas Search はデータのインデックス作成に失敗します。この問題は、大きなドキュメントの更新操作によって変更ストリームイベントが 16MB の BSON 制限を超えた場合にも発生する可能性があります。これを回避するために、次のベストプラクティスを検討してください。

  • サブドキュメントや配列のサイズを最小限に抑えるように、ドキュメントを構造化してください。

  • 大規模なフィールド、サブドキュメント、または配列を更新または置換する操作は避けてください。

詳細については、「Change Streams 運用に関する推奨事項」および「大きなドキュメントのサイズを縮小する」を参照してください。

1{
2 "mappings": {
3 "dynamic": true,
4 "fields": { // Optional, use this to configure individual fields
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
1{
2 "mappings": {
3 "dynamic": false, // Optional, if omitted defaults to "false"
4 "fields": {
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
2

特殊言語や解析要件がある場合は、インデックス定義に次のオプションを適用できます。

analyzersearchAnalyzer、または fields.<field-name>.analyzer フィールドでインデックスを作成する string フィールドに適用する組み込みアナライザを指定します。

1{
2 "analyzer": "<index-analyzer-name>", // top-level index analyzer, used if no analyzer is set in the field mappings
3 "searchAnalyzer": "<search-analyzer-name>", // query text analyzer, typically the same as the index analyzer
4 "mappings": {
5 "dynamic": <boolean>,
6 "fields":{
7 "<field-name>": [
8 {
9 "type": "string",
10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer
11 }
12 ]
13 }
14 }
15}

フィールドで Atlasanalyzers Searchインデックスのカスタムアナライザを定義します。

1{
2 "analyzers": [
3 {
4 "name": "<custom-analyzer-name>",
5 "tokenizer": {
6 "type": "<tokenizer-type>"
7 }
8 },
9 ...
10 ]
11}

synonyms フィールドで同じまたは類似の意味を持つ用語のシノニムを定義します。

1{
2 "synonyms": [
3 {
4 "name": "<synonym-mapping-name>",
5 "source": {
6 "collection": "<source-collection-name>"
7 },
8 "analyzer": "<synonym-mapping-analyzer>"
9 }
10 ]
11}
3

大規模なデータセットでクエリのパフォーマンスを最適化したい場合は、インデックス定義に次のオプションを追加して、Atlas Search クエリが処理する必要があるデータ量を制限することができます。

numPartitions オプションを使用して、インデックスのパーティションを構成します。インデックスをパーティション分割すると、Atlas Search はインデックスオブジェクトをサブインデックス間で最適に自動分散します。

1{
2 "numPartitions": <integer>,
3}

Atlas Search が保存する必要があるソースドキュメント内のフィールドを指定するには、storedSource オプションを使用します。

1{
2 "storedSource": true | false | {
3 "include" | "exclude": [
4 "<field-name>",
5 ...
6 ]
7 }
8}

コレクション内の検索したいすべてのフィールドに対して Atlas Search インデックスを作成した後、Atlas Search クエリを実行できます。このセクションでは、アプリケーションの検索エクスペリエンスの目標を Atlas Search クエリの JSON 構文に適用する方法を説明します。

Atlas Search クエリ集計パイプラインでこのセクションの JSON 構文を使用するには、プレースホルダーを有効な値に置き換え、完全なクエリパイプラインに必要な $search フィールドまたは $searchMeta フィールドが含まれていることを確認します。

検索クエリの実行方法については、Atlas クイック スタート を参照してください。

1

Atlas Search クエリ集計パイプラインの最初のステージは、ドキュメントを検索するか、メタデータを検索するかに応じて、$search ステージまたは $searchMeta ステージである必要があります。

集計パイプライン ステージ
目的

全文検索の検索結果を返します。

検索結果に関するメタデータを返します。

2

検索条件を定義するには、演算子またはコレクター$search または$searchMeta パイプライン ステージに 1 つ以上適用する必要があります。

Atlas Search 演算子を使用すると、コンテンツ、形式、またはデータ型に応じて、Atlas クラスターから関連データを検索して取得できます。各フィールド型で検索をサポートする演算子については、演算子リファレンスセクションの表を参照してください。演算子のクエリパスパラメーターに 1 つ以上のインデックス付き検索フィールドを指定する必要があります。

1{
2 $search: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
_id: <result-document-id>,
...
},
{
_id: <result-document-id>,
...
},
...
]
1{
2 $searchMeta: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
count: {
total: <results-count>
}
}
]

Tip

compound 演算子を使用して、複数の演算子を1つの操作にまとめることができます。compound 演算子の filter 句を使用して、指定された句に一致するクエリ出力をフィルタリングすることもできます。

3

If you want to retrieve metadata from your Atlas Search query, you can apply one of the following configurations to choose between the count or facet Collector type of metadata results document:

検索結果の合計または下限値を返すには、集計ステージで カウント オプションを設定します。

$searchMeta ステージは countメタデータの結果を返しますが、$search ステージはメタデータの結果を $$SEARCH_META集計変数 に保存し、検索結果のみを返します。$$SEARCH_META 変数から countメタデータの結果を検索する方法の例については、結果のカウント を参照してください。

1{
2 "$search" | "$searchMeta": {
3 "<operator-name>": {
4 <operator-specifications>
5 },
6 "count": {
7 "type": "lowerBound" | "total",
8 "threshold": <number-of-documents> // Optional
9 }
10 }
11}

To run a facet query, which groups results by values or ranges and returns the count for each of these groups, use the facet Collector collector in your aggregation stage.

$searchMeta ステージはfacet メタデータ結果を返し、$search ステージはこのメタデータ結果を $$SEARCH_META 集計変数に保存し、検索結果のみを返します。$$SEARCH_META 変数から facet メタデータの結果を検索する方法の例については、「ファセット結果」を参照してください。

1{
2 "$search" | "$searchMeta": {
3 "facet": {
4 "facets": {
5 <facet-definitions>
6 }
7 }
8 }
9}
4

次のオプションを使用して、$search ステージの結果に関する追加情報を検索できます。

オプション
ユースケース

検索タームを元のコンテキストでクエリ結果のフィールドとして表示します。

Atlas Search が返す各ドキュメントのスコアの詳細な内訳を取得します。

クエリの検索用語に関する分析情報を追跡し、提供します。

Atlas Search がクエリの条件を満たすために実行した Lucene クエリと、クエリを実行するさまざまな段階で費やした時間に関する分析を取得します。

5

次のオプションを使用して、$search の検索結果に特別な順序付け機能を実装できます。

オプション
ユースケース

Atlas Search が関連する結果を返すように、結果内のドキュメントの関連性スコアを変更します。

結果を数値、文字列、日付の各フィールド、またはスコアで並べ替えます。

順序付けられた結果を停止または開始するための参照点を設定します。

6

次の $search オプションを使用してクエリのパフォーマンスを最適化します。

オプション
ユースケース

Atlas 検索クエリをより効率的に実行するには、コレクションの Atlas Search インデックス定義で指定された mongot に保存されているフィールドのみを取得します。

専用の検索ノードでセグメント全体の検索を並列化します。

Atlas Search インデックスと Atlas Search クエリをビルドおよび実行する方法については、「Atlas Search クイックスタート」をご覧ください。

このチュートリアルで言及されている Atlas Search クエリ構成オプションの詳細については、次の参照ページを参照してください。

このチュートリアルで言及されている Atlas Search のインデックス設定オプションの詳細については、以下の参照ページをご覧ください。

戻る

Atlas Searchでのファセットの使用方法

項目一覧