結果で検索タームを強調表示
Atlas Search highlight
オプションは、検索タームを元のコンテキストで表示するフィールドを結果セットに追加します。 これをすべての $search演算子と組み合わせて使用すると、返されたドキュメントに現れる検索タームと、それに対応するテキスト コンテンツ(存在する場合)を表示できます。 highlight
の結果は$meta
フィールドの一部として返されます。
構文
highlight
の構文は次のとおりです。
{ $search: { "index": "<index name>", // optional, defaults to "default" "<operator>": { // such as "text", "compound", or "phrase" <operator-specification> }, "highlight": { "path": "<field-to-search>", "maxCharsToExamine": "<number-of-chars-to-examine>", // optional, defaults to 500,000 "maxNumPassages": "<number-of-passages>" // optional, defaults to 5 } } }, { $project: { "highlights": { "$meta": "searchHighlights" } } }
オプション
フィールド | タイプ | 説明 | 必須 |
---|---|---|---|
path | string | 検索するドキュメント フィールド。
詳細については、「 クエリ パスの構築」を参照してください。 | はい |
maxCharsToExamine | 整数 | フィールドを強調表示するときにドキュメントで確認する最大文字数。 省略した場合、デフォルトは 500,000 になります。つまり、Atlas Search は強調表示する各ドキュメントの検索フィールドの最初の 500,000 文字のみを検査します。 | no |
maxNumPassages | 整数 | 各フィールドの highlights 結果内のドキュメントごとに返す高スコア パスの数。 通過は、ほぼ文章の長さです。 省略した場合、デフォルトは 5 になります。つまり、各ドキュメントに対して、Atlas Search は検索テキストに一致する最高スコアのパスの上位 5 件を返します。 | no |
"$meta": "searchHighlights"
フィールドにはハイライトされた結果が含まれます。 そのフィールドは元のドキュメントの一部ではないため、クエリ出力に追加するには $projectパイプライン ステージを使用する必要があります。
出力
highlights
フィールドは、次の出力フィールドを含む配列です。
フィールド | タイプ | 説明 |
---|---|---|
path | string | 一致を返したドキュメント フィールド。 |
texts | ドキュメントの配列 | 各検索一致は、一致するテキストとその周囲のテキスト(存在する場合)を含む 1 つ以上の オブジェクトを返します。 |
texts.value | string | 一致を返したフィールドのテキスト。 |
texts.type | string | 結果のタイプ。 値は次のいずれかになります。
|
score | float | 一致する結果に割り当てられたスコア。 highlights スコアは、クエリに対するhighlights オブジェクトの関連性の測定値です。 複数のhighlights オブジェクトが返された場合、最も関連性の高いhighlights オブジェクトが最もスコアが高くなります。 |
前提条件
indexOptions
をoffsets
(デフォルト)に設定して、ハイライトするフィールドを Atlas Search stringタイプとしてインデックスする必要があります。
制限
Atlas Search highlight
オプションは、 embeddedDocument演算子と組み合わせて使用できません。
例
次の例は、Atlas Search Playground または Atlas クラスターで試すことができます。
サンプル コレクション
このページの例では、次のドキュメントを含むfruit
というコレクションを使用します。
{ "_id" : 1, "type" : "fruit", "summary" : "Apple varieties", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", "category": "organic" }, { "_id" : 2, "type" : "fruit", "summary" : "Banana", "description" : "Bananas are usually sold in bunches of five or six.", "category": "nonorganic" }, { "_id" : 3, "type" : "fruit", "summary" : "Pear varieties", "description" : "Bosc and Bartlett are the most common varieties of pears.", "category": "nonorganic" }
サンプル インデックス
fruit
コレクションには、 英語 の アナライザ と 動的フィールドマッピング を使用する インデックス定義 もあります。
{ "analyzer": "lucene.english", "searchAnalyzer": "lucene.english", "mappings": { "dynamic": true } }
注意
強調表示の便利な点の 1 つは、検索クエリによって返される元のテキストが表示されることです。このテキストは、検索タームと完全に一致しない場合もあります。 たとえば、 言語固有のアナライザ を使用すると、テキスト検索ではすべての 語幹 付き 検索タームのバリエーション。
強調表示のもう 1 つの便利な面は、クエリpath
内または外部で任意のフィールドを強調表示するために使用できることです。 たとえば、 というタームを検索する場合、クエリ フィールドとhighlight
オプションを使用して指定したその他のフィールドのクエリ用語を強調表示できます。 詳細については、「マルチフィールドの例 」を参照してください。
サンプル クエリ
次のクエリは、Atlas Search クエリの$search
highlight
オプションを示しています。
基本的な例
次のクエリは、 fruit
コレクションのdescription
フィールドでvariety
とbunch
を検索し、 highlight
オプションを有効にします。
$projectパイプライン ステージは、出力をdescription
フィールドに制限し、ハイライト情報を含むhighlights
という新しいフィールドを追加します。
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": ["variety", "bunch"] 7 }, 8 "highlight": { 9 "path": "description" 10 } 11 } 12 }, 13 { 14 $project: { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
検索タームbunch
は、 _id: 2
を含むドキュメントに一致を返します。これは、 description
フィールドにbunches
という単語が含まれているためです。 検索タームvariety
は、 _id: 3
と_id: 1
を含むドキュメントに一致します。これは、 description
フィールドにvarieties
という単語が含まれているためです。
➤ Atlas Search Playground でこれを試してみてください。
高度な例
次のクエリは、 fruit
コレクションのdescription
フィールドでvariety
とbunch
を検索し、 highlight
オプションを有効にし、検索する最大文字数を40
に設定し、 1
のみを検索します。ドキュメントごとに返される高スコアのパス。
$projectパイプライン ステージは、出力をdescription
フィールドに制限し、ハイライト情報を含むhighlights
という新しいフィールドを追加します。
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": ["variety", "bunch"] 7 }, 8 "highlight": { 9 "path": "description", 10 "maxNumPassages": 1, 11 "maxCharsToExamine": 40 12 } 13 } 14 }, 15 { 16 $project: { 17 "description": 1, 18 "_id": 0, 19 "highlights": { "$meta": "searchHighlights" } 20 } 21 } 22 ])
上記の結果の 2 番目のドキュメントには、検索フィールドに検索用語varieties
が含まれているにもかかわらず空のhighlights
配列が含まれています。これは、Atlas Search が強調表示するために40
文字のみを検査したためです。 同様に、 includ
という単語も切り捨てられます。このコマンドは、Atlas Search が強調表示する検索フィールドの40
文字のみを検査したためです。 3 番目のドキュメントでは、複数のパスに 検索タームが含まれていますが、Atlas Search はhighlights
結果の 1 つのパスのみを返します。クエリでは、 highlights
結果では 1 ドキュメントあたり1
パスのみが必要であったためです。
➤ Atlas Search Playground でこれを試してみてください。
マルチフィールドの例
varieties
description
fruit
次のクエリは、 コレクションの フィールドでhighlight
を検索し、description
summary
フィールドと フィールドの両方で オプションを有効にします。
$projectパイプライン ステージには、 highlights
という新しいフィールドが追加されます。このフィールドには、 highlight
オプションのすべてのフィールドにわたるクエリ用語の強調表示情報が含まれます。
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": "varieties" 7 }, 8 "highlight": { 9 "path": ["description", "summary" ] 10 } 11 } 12 }, 13 { 14 $project: { 15 "description": 1, 16 "summary": 1, 17 "_id": 0, 18 "highlights": { "$meta": "searchHighlights" } 19 } 20 } 21 ])
検索タームvarieties
は、 _id: 1
と_id: 3
を含むドキュメントに一致を返します。両方のドキュメントのクエリ フィールドdescription
にクエリ用語varieties
が含まれているためです。 さらに、 highlights
配列にはsummary
フィールドが含まれます。このフィールドにはクエリ用語varieties
が含まれているためです。
➤ Atlas Search Playground でこれを試してみてください。
ワイルドカードの例
次のクエリは、 fruit
コレクション内のdes
で始まるフィールドでvarieties
というタームを検索し、 des
で始まるフィールドではhighlight
オプションを有効にします。
$projectパイプライン ステージには、ハイライト情報を含むhighlights
という新しいフィールドが追加されます。
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": {"wildcard": "des*"}, 6 "query": ["variety"] 7 }, 8 "highlight": { 9 "path": {"wildcard": "des*"} 10 } 11 } 12 }, 13 { 14 "$project": { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
Atlas Search の結果では、 des
で始まるフィールドが強調表示されます。
➤ Atlas Search Playground でこれを試してみてください。
複合例
次のクエリは、 category
フィールドでorganic
を検索し、 description
フィールドでvariety
という用語を検索します。 $search
複合クエリのhighlight
オプションは、 description
フィールドに対するテキストクエリのみの情報を強調表示するリクエストです。 ただし、 $search
ステージ内のhighlight
オプションは$search
ステージの子であり、 $search
ステージ内の演算子であってはなりません。
$projectパイプライン ステージには、ハイライト情報を含むhighlights
という新しいフィールドが追加されます。
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "should": [{ 6 "text": { 7 "path": "category", 8 "query": "organic" 9 } 10 }, 11 { 12 "text": { 13 "path": "description", 14 "query": "variety" 15 } 16 }] 17 }, 18 "highlight": { 19 "path": "description" 20 } 21 } 22 }, 23 { 24 "$project": { 25 "description": 1, 26 "category": 1, 27 "_id": 0, 28 "highlights": { "$meta": "searchHighlights" } 29 } 30 } 31 ])
➤ Atlas Search Playground でこれを試してみてください。
オートコンプリートの例
この例では、 fruit
コレクションには次のインデックス定義もあります。
{ "mappings": { "dynamic": false, "fields": { "description": [ { "type": "autocomplete", "tokenization": "edgeGram", "minGrams": 2, "maxGrams": 15, "foldDiacritics": true } ] } } }
次のクエリは、fruit
コレクションの description
フィールドで var
の文字を検索し、description
フィールドで highlight
オプションを有効にします。
$projectパイプライン ステージには、ハイライト情報を含むhighlights
という新しいフィールドが追加されます。
重要
パスのオートコンプリート インデックス バージョンを強調表示するには、オートコンプリート演算子がクエリ内でそのパスを使用する唯一の演算子である必要があります。
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "autocomplete": { 5 "path": "description", 6 "query": ["var"] 7 }, 8 "highlight": { 9 "path": "description" 10 } 11 } 12 }, 13 { 14 "$project": { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
Atlas Searchがクエリstring var
に対して _id: 1
と id_: 2
を含むドキュメントに一致を返すのは、fruit
コレクションの description
フィールドに単語の先頭に文字 var
が含まれているためです。 強調表示されたパスが強調表示されたクエリのオペレーターでのみ参照されている場合、Atlas Search は強調表示されたhit
を、より大まかにクエリタームと一致させます。
➤ Atlas Search Playground でこれを試してみてください。