결과에서 검색어 강조 표시
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 | 문자열 | 네 | |
maxCharsToExamine | int | 필드에 대해 강조 표시를 수행할 때 문서에서 검사할 최대 문자 수입니다. 생략할 경우 기본값은 500,000 입니다. 즉, Atlas Search는 각 문서의 검색 필드에 있는 처음 500,000자만 검사하여 강조 표시합니다. | no |
maxNumPassages | int | 각 필드에 대한 highlights 결과에서 문서당 반환할 높은 점수의 구절 수입니다. 구절은 한 문장의 대략적인 길이입니다. 생략하면 기본값은 5이며, 이는 각 문서에 대해 Atlas Search가 검색 텍스트와 일치하는 가장 높은 점수를 받은 상위 5개 구절을 반환한다는 의미입니다. | no |
"$meta": "searchHighlights"
필드에는 강조 표시된 결과가 포함되어 있습니다. 해당 필드는 원본 문서의 일부가 아니므로 $project 파이프라인 단계를 사용하여 쿼리 출력에 추가해야 합니다.
출력
highlights
필드는 다음 출력 필드를 포함하는 배열입니다.
필드 | 유형 | 설명 |
---|---|---|
path | 문자열 | 일치 항목을 반환한 문서 필드입니다. |
texts | 문서 배열 | 각 검색은 일치하는 텍스트와 주변 텍스트(있는 경우)를 포함하는 하나 이상의 객체를 반환합니다. |
texts.value | 문자열 | 일치 항목을 반환한 필드의 텍스트입니다. |
texts.type | 문자열 | 결과 유형. 값은 다음 중 하나일 수 있습니다.
|
score | float | 일치하는 결과에 할당된 점수입니다. highlights 점수는 쿼리에 대한 highlights 객체의 관련성을 측정한 값입니다. 여러 개의 highlights 객체가 반환되는 경우 가장 관련성이 높은 highlights 객체의 점수가 가장 높습니다. |
전제 조건
indexOptions
를 offsets
(기본값)으로 설정하여 강조 표시하려는 필드를 Atlas Search 문자열 유형으로 인덱싱해야 합니다.
제한 사항
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 } }
참고
강조 표시의 한 가지 유용한 측면은 검색어와 정확히 동일하지 않을 수 있는 검색 쿼리가 반환한 원본 텍스트를 표시한다는 점입니다. 예를 들어 언어별 분석기를 사용하는 경우 텍스트 검색은 검색어의 모든 어간 변형어를 반환합니다.
강조 표시의 또 다른 유용한 측면은 path
쿼리 내부 또는 외부의 모든 필드를 강조 표시하는 데 사용할 수 있다는 점입니다. 예를 들어 용어를 검색할 때 highlight
옵션을 사용하여 지정한 다른 필드와 쿼리 필드에서 쿼리 용어에 대해 강조 표시를 수행할 수 있습니다. 자세한 내용은 다중 필드 예시를 참조하세요.
샘플 쿼리
다음 쿼리는 Atlas Search 쿼리의 $search
highlight
옵션을 보여줍니다.
기본 예시
다음 쿼리는 highlight
옵션이 활성화된 상태에서 fruit
컬렉션의 description
필드에서 variety
및 bunch
를 검색합니다.
$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 ])
1 { 2 "description" : "Bananas are usually sold in bunches of five or six. ", 3 "highlights" : [ 4 { 5 "path" : "description", 6 "texts" : [ 7 { 8 "value" : "Bananas are usually sold in ", 9 "type" : "text" 10 }, 11 { 12 "value" : "bunches", 13 "type" : "hit" 14 }, 15 { 16 "value" : " of five or six. ", 17 "type" : "text" 18 } 19 ], 20 "score" : 1.2841906547546387 21 } 22 ] 23 } 24 { 25 "description" : "Bosc and Bartlett are the most common varieties of pears.", 26 "highlights" : [ 27 { 28 "path" : "description", 29 "texts" : [ 30 { 31 "value" : "Bosc and Bartlett are the most common ", 32 "type" : "text" 33 }, 34 { 35 "value" : "varieties", 36 "type" : "hit" 37 }, 38 { 39 "value" : " of pears.", 40 "type" : "text" 41 } 42 ], 43 "score" : 1.2691514492034912 44 } 45 ] 46 } 47 { 48 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith. ", 49 "highlights" : [ 50 { 51 "path" : "description", 52 "texts" : [ 53 { 54 "value" : "Apples come in several ", 55 "type" : "text" 56 }, 57 { 58 "value" : "varieties", 59 "type" : "hit" 60 }, 61 { 62 "value" : ", including Fuji, Granny Smith, and Honeycrisp. ", 63 "type" : "text" 64 } 65 ], 66 "score" : 1.0330637693405151 67 }, 68 { 69 "path" : "description", 70 "texts" : [ 71 { 72 "value" : "The most popular ", 73 "type" : "text" 74 }, 75 { 76 "value" : "varieties", 77 "type" : "hit" 78 }, 79 { 80 "value" : " are McIntosh, Gala, and Granny Smith. ", 81 "type" : "text" 82 } 83 ], 84 "score" : 1.0940992832183838 85 } 86 ] 87 }
검색어 bunch
는 description
필드에 bunches
라는 단어가 포함되어 있으므로 _id: 2
가 있는 문서에서 일치하는 항목을 반환합니다. 검색어 variety
는 description
필드에 varieties
라는 단어가 포함되어 있기 때문에 _id: 3
및 _id: 1
이 있는 문서에서 일치하는 항목을 반환합니다.
➤ Atlas Search Playground에서 사용해 보세요
고급 예시
다음 쿼리는 highlight
옵션을 활성화하고 검사할 최대 문자 수를 40
로 설정하고 높은 점수의 구절을 문서당 1
개만 반환하도록 설정한 상태에서fruit
컬렉션의 description
필드에서 variety
및 bunch
를 검색합니다.
$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 ])
1 { 2 "description" : "Bananas are usually sold in bunches of five or six. ", 3 "highlights" : [ 4 { 5 "path" : "description", 6 "texts" : [ 7 { 8 "value" : "Bananas are usually sold in ", 9 "type" : "text" 10 }, 11 { 12 "value" : "bunches", 13 "type" : "hit" 14 }, 15 { 16 "value" : " of f", 17 "type" : "text" 18 } 19 ], 20 "score" : 1.313065767288208 21 } 22 ] 23 } 24 { 25 "description" : "Bosc and Bartlett are the most common varieties of pears.", 26 "highlights" : [ ] 27 } 28 { 29 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", 30 "highlights" : [ 31 { 32 "path" : "description", 33 "texts" : [ 34 { 35 "value" : "Apples come in several ", 36 "type" : "text" 37 }, 38 { 39 "value" : "varieties", 40 "type" : "hit" 41 }, 42 { 43 "value" : ", includ", 44 "type" : "text" 45 } 46 ], 47 "score" : 0.9093900918960571 48 } 49 ] 50 }
위 결과의 두 번째 문서에는 검색 필드에 검색어 varieties
가 포함되어 있음에도 불구하고 빈 highlights
배열이 포함되어 있는데, 이는 Atlas Search에서 강조 표시를 위해 문자를40
개만 검사했기 때문입니다. 마찬가지로, includ
라는 단어가 잘린 이유는 Atlas Search가 검색 필드에서 강조 표시를 위해 문자 40
개만 검사했기 때문입니다. 세 번째 문서에는 여러 구절에 검색어가 포함되어 있지만, 쿼리가 highlights
결과에서 문서당 구절이 1
개만 필요하기 때문에 Atlas Search는 highlights
결과에서 하나의 구절만 반환합니다.
➤ Atlas Search Playground에서 사용해 보세요
다중 필드 예시
다음 쿼리는 description
및 summary
필드 모두에 highlight
옵션이 활성화된 상태에서 fruit
컬렉션의 description
필드에서 varieties
을 검색합니다.
$project 파이프라인 단계에서는 highlight
옵션의 모든 필드에서 쿼리 용어에 대한 하이라이트 정보를 포함하는 highlights
라는 새 필드를 추가합니다.
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 ])
1 { 2 "summary" : "Pear varieties", 3 "description" : "Bosc and Bartlett are the most common varieties of pears.", 4 "highlights" : [ 5 { 6 "path" : "summary", 7 "texts" : [ 8 { 9 "value" : "Pear ", 10 "type" : "text" 11 }, 12 { 13 "value" : "varieties", 14 "type" : "hit" 15 } 16 ], 17 "score" : 1.3891443014144897 }, 18 { 19 "path" : "description", 20 "texts" : [ 21 { 22 "value" : "Bosc and Bartlett are the most common ", 23 "type" : "text" 24 }, 25 { 26 "value" : "varieties", 27 "type" : "hit" 28 }, 29 { 30 "value" : " of pears.", 31 "type" : "text" 32 } 33 ], 34 "score" : 1.2691514492034912 35 } 36 ] 37 } 38 { 39 "summary" : "Apple varieties", 40 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", 41 "highlights" : [ 42 { 43 "path" : "summary", 44 "texts" : [ 45 { 46 "value" : "Apple ", 47 "type" : "text" 48 }, 49 { 50 "value" : "varieties", 51 "type" : "hit" 52 } 53 ], 54 "score" : 1.3859853744506836 55 }, 56 { 57 "path" : "description", 58 "texts" : [ 59 { 60 "value" : "Apples come in several ", 61 "type" : "text" 62 }, 63 { 64 "value" : "varieties", 65 "type" : "hit" 66 }, 67 { 68 "value" : ", including Fuji, Granny Smith, and Honeycrisp. ", 69 "type" : "text" 70 } 71 ], 72 "score" : 1.0330637693405151 73 }, 74 { 75 "path" : "description", 76 "texts" : [ 77 { 78 "value" : "The most popular ", 79 "type" : "text" 80 }, 81 { 82 "value" : "varieties", 83 "type" : "hit" 84 }, 85 { 86 "value" : " are McIntosh, Gala, and Granny Smith.", 87 "type" : "text" 88 } 89 ], 90 "score" : 1.0940992832183838 91 } 92 ] 93 }
두 문서의 쿼리 필드 description
에 쿼리 용어 varieties
가 포함되어 있기 때문에 검색어 varieties
는 _id: 1
및 _id: 3
이 있는 문서에서 일치하는 항목을 반환합니다. 또한 highlights
배열에는 summary
필드가 포함되는데, 이는 필드에 쿼리 용어 varieties
가 포함되어 있기 때문입니다.
➤ Atlas Search Playground에서 사용해 보세요
와일드카드 예시
다음 쿼리는 des
로 시작하는 필드에 대해 highlight
옵션이 활성화된 상태에서 fruit
컬렉션의 des
로 시작하는 필드에서 varieties
라는 용어를 검색합니다.
$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 ])
1 { 2 "description" : "Bosc and Bartlett are the most common varieties of pears.", 3 "highlights" : [ 4 { 5 "path" : "description", 6 "texts" : [ 7 { 8 "value" : "Bosc and Bartlett are the most common ", 9 "type" : "text" 10 }, 11 { 12 "value" : "varieties", 13 "type" : "hit" 14 }, 15 { 16 "value" : " of pears.", 17 "type" : "text" 18 } 19 ], 20 "score" : 1.2691514492034912 21 } 22 ] 23 }, 24 { 25 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", 26 "highlights" : [ 27 { 28 "path" : "description", 29 "texts" : [ 30 { 31 "value" : "Apples come in several ", 32 "type" : "text" 33 }, 34 { 35 "value" : "varieties", 36 "type" : "hit" 37 }, 38 { 39 "value" : ", including Fuji, Granny Smith, and Honeycrisp. ", 40 "type" : "text" 41 } 42 ], 43 "score" : 1.0330637693405151 44 }, 45 { 46 "path" : "description", 47 "texts" : [ 48 { 49 "value" : "The most popular ", 50 "type" : "text" 51 }, 52 { 53 "value" : "varieties", 54 "type" : "hit" 55 }, 56 { 57 "value" : " are McIntosh, Gala, and Granny Smith.", 58 "type" : "text" 59 } 60 ], 61 "score" : 1.0940992832183838 62 } 63 ] 64 }
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 ])
1 [ 2 { 3 description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.', 4 category: 'organic', 5 highlights: [ 6 { 7 score: 1.0330637693405151, 8 path: 'description', 9 texts: [ 10 { value: 'Apples come in several ', type: 'text' }, 11 { value: 'varieties', type: 'hit' }, 12 { 13 value: ', including Fuji, Granny Smith, and Honeycrisp. ', 14 type: 'text' 15 } 16 ] 17 }, 18 { 19 score: 1.0940992832183838, 20 path: 'description', 21 texts: [ 22 { value: 'The most popular ', type: 'text' }, 23 { value: 'varieties', type: 'hit' }, 24 { 25 value: ' are McIntosh, Gala, and Granny Smith.', 26 type: 'text' 27 } 28 ] 29 } 30 ] 31 }, 32 { 33 description: 'Bosc and Bartlett are the most common varieties of pears.', 34 category: 'nonorganic', 35 highlights: [ 36 { 37 score: 1.2691514492034912, 38 path: 'description', 39 texts: [ 40 { 41 value: 'Bosc and Bartlett are the most common ', 42 type: 'text' 43 }, 44 { value: 'varieties', type: 'hit' }, 45 { value: ' of pears.', type: 'text' } 46 ] 47 } 48 ] 49 } 50 ]
➤ 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 ])
1 { 2 "description": "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", 3 "highlights": [ 4 { 5 "score": 0.774385392665863, 6 "path": "description", 7 "texts": [ 8 { "value": "Apples come in several ", "type": "text" }, 9 { "value": "varieties, including Fuji", "type": "hit" }, 10 { "value": ", Granny Smith, and Honeycrisp. ", "type": "text" } 11 ] 12 }, 13 { 14 "score": 0.7879307270050049, 15 "path": "description", 16 "texts": [ 17 { "value": "The most popular ", "type": "text" }, 18 { "value": "varieties are McIntosh", "type": "hit" }, 19 { "value": ", Gala, and Granny Smith.", "type": "text" } 20 ] 21 } 22 ] 23 }, 24 { 25 "description": "Bosc and Bartlett are the most common varieties of pears.", 26 "highlights": [ 27 { 28 "score": 0.9964432120323181, 29 "path": "description", 30 "texts": [ 31 { 32 "value": "Bosc and Bartlett are the most common ", 33 "type": "text" 34 }, 35 { "value": "varieties of pears", "type": "hit" }, 36 { "value": ".", "type": "text" } 37 ] 38 } 39 ] 40 }
fruit
컬렉션 description
필드의 단어 시작 부분에 var
문자가 포함되어 있기 때문에 Atlas Search는 쿼리 문자열 var
에 대해 _id: 1
및 id_: 2
가 일치하는 문서를 반환합니다. Atlas Search는 강조 표시된 경로가 강조 표시된 쿼리의 자동 완성 연산자에서만 참조되는 경우 강조 표시된 hit
를 쿼리 용어에 좀 더 폭넓게 매칭시킵니다.
➤ Atlas Search Playground에서 사용해 보세요