Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

結果で検索タームを強調表示

項目一覧

  • 構文
  • オプション
  • 出力
  • 前提条件
  • 制限
  • サンプル コレクション
  • サンプル インデックス
  • サンプル クエリ

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

検索するドキュメント フィールド。 pathフィールドには以下の値を含めることができます。

  • A 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

結果のタイプ。 値は次のいずれかになります。

  • hit - 結果にはクエリに一致した というタームが含まれます。

  • text - 結果には、一致するタームに隣接するテキスト コンテンツが含まれます。

score
float
一致する結果に割り当てられたスコアhighlightsスコアは、クエリに対するhighlightsオブジェクトの関連性の測定値です。 複数のhighlightsオブジェクトが返された場合、最も関連性の高いhighlightsオブジェクトが最もスコアが高くなります。

indexOptionsoffsets (デフォルト)に設定して、ハイライトするフィールドを 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フィールドでvarietybunchを検索し、 highlightオプションを有効にします。

$projectパイプライン ステージは、出力をdescriptionフィールドに制限し、ハイライト情報を含むhighlightsという新しいフィールドを追加します。

1db.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フィールドでvarietybunchを検索し、 highlightオプションを有効にし、検索する最大文字数を40に設定し、 1のみを検索します。ドキュメントごとに返される高スコアのパス。

$projectパイプライン ステージは、出力をdescriptionフィールドに制限し、ハイライト情報を含むhighlightsという新しいフィールドを追加します。

1db.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 でこれを試してみてください。

varietiesdescriptionfruit次のクエリは、 コレクションの フィールドでhighlight を検索し、description summaryフィールドと フィールドの両方で オプションを有効にします。

$projectパイプライン ステージには、 highlightsという新しいフィールドが追加されます。このフィールドには、 highlightオプションのすべてのフィールドにわたるクエリ用語の強調表示情報が含まれます。

1db.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という新しいフィールドが追加されます。

1db.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という新しいフィールドが追加されます。

1db.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という新しいフィールドが追加されます。

重要

パスのオートコンプリート インデックス バージョンを強調表示するには、オートコンプリート演算子がクエリ内でそのパスを使用する唯一の演算子である必要があります。

1db.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: 1id_: 2 を含むドキュメントに一致を返すのは、fruit コレクションの description フィールドに単語の先頭に文字 var が含まれているためです。 強調表示されたパスが強調表示されたクエリのオペレーターでのみ参照されている場合、Atlas Search は強調表示されたhitを、より大まかにクエリタームと一致させます。

Atlas Search Playground でこれを試してみてください。