단계에서 scoreDetails 불리언 옵션을 $search 사용하여 쿼리 결과의 각 문서에 대한 점수를 자세히 분석할 수 있습니다.
scoreDetails: true 를 $search 단계에서 설정하다 하면 MongoDB Search는 일치하는 각 문서에 대한 자세한 점수 정보를 반환합니다. 이 정보는 문서 쿼리 와 일치하고 검색 결과에서 관련성 점수를 받은 이유를 설명합니다.
By default, scoring is based on the bm25 formula:
텀 빈도: 문서에 검색 텀 나타나는 빈도
역 문서 빈도: 검색 텀 모든 문서에서 얼마나 흔한지
필드 길이: 쿼리 와 일치하는 필드 의 길이
scoreDetails 옵션은 이러한 요소를 세분화하여 문서 쿼리 와 일치하고 점수를 받은 이유 분석 데 도움이 됩니다.
To view the metadata, you must use the $meta expression in the $project stage.
구문
{ "$search": { "<operator>": { <operator-specification> }, "scoreDetails": true | false } }, { "$project": { "scoreDetails": {"$meta": "searchScoreDetails"} } }
옵션
$search 단계 에서 scoreDetails 부울 옵션은 다음 값 중 하나를 사용합니다.
true- to include details of the score for the documents in the results. If set totrue, MongoDB Search returns a detailed breakdown of the score for each document in the result. This provides information on why certain documents matched a MongoDB Search query. To learn more, see Output.false- 결과에서 점수 분석의 세부 정보를 제외합니다. (기본값)
생략하면 scoreDetails 옵션의 기본값은 false 입니다.
In the $project stage, the scoreDetails field takes the $meta expression, which requires the following value:
| 결과에 포함된 각 문서의 점수에 대한 자세한 분석을 반환합니다. |
출력
scoreDetails 옵션은 결과의 각 문서에 대해 scoreDetails 객체 내부의 details 배열에 다음 필드를 반환합니다.
필드 | 유형 | 설명 |
|---|---|---|
| float | |
| 문자열 | 문서에 점수를 매긴 방법과 점수 계산 시 고려된 요소에 대한 정보를 포함하는 채점 공식의 하위 집합입니다. 최상위 자세히 알아보려면 Factors That Contribute to the Score(점수에 기여하는 요인)을 참조하세요. |
| 객체 배열 | 점수 공식의 하위 집합을 기반으로 문서에 있는 각 일치 항목의 점수 분석입니다. 이 값은 구조가 재귀적인 점수 세부 정보 객체의 배열입니다. |
점수에 기여하는 요소
다양한 쿼리 연산자는 결과 내 각 문서의 searchScore를 계산하기 위해 서로 다른 알고리즘을 사용합니다. 다음 섹션에서는 일반적인 쿼리 연산자가 점수 계산을 처리하는 방법을 설명합니다.
텍스트, 구문, 쿼리 문자열 및 자동 완성 연산자
기본적으로 text, phrase, queryString and autocomplete 연산자는 bm25 유사성 알고리즘을 사용하여 문서에 점수를 매깁니다.
여러 쿼리에서 일관된 결과가 필요할 때, 특히 다음 두 조건이 모두 충족되는 경우 stableTfl 또는 boolean 알고리즘을 사용하는 것이 좋습니다.
애플리케이션은
searchScore에 따라 결과를 정렬하고 결과를 페이지 매김합니다. 이는 중복 또는 문서 누락을 방지하기 위해 결정론적 점수에 의존합니다.Your deployment uses dedicated MongoDB Search nodes or has read preference set to
secondaryornearest, which increases the likelihood that initial and subsequent queries are routed to different MongoDB Search nodes
bm25 후속 쿼리 간에 점수가 일관적이지 않을 수 있습니다. 각 MongoDB 검색 노드는 MongoDB 검색 인덱스를 빌드하고 업데이트 및 삭제 작업을 독립적으로 수행하므로, 서로 다른 MongoDB 검색 노드 간에 문서 세트가 달라질 수 있습니다. bm25 계산은 문서 코퍼스에 의존하므로, 다른 MongoDB 검색 노드로 라우팅되는 후속 쿼리는 동일한 문서에 대해 서로 다른 bm25 점수를 계산할 수 있습니다.
다른 유사도 알고리즘을 사용하려면 MongoDB 검색 string 또는 autocomplete 유형으로 색인하는 필드에 대해 MongoDB 검색 인덱스 정의에서 similarity.type 속성을 지정합니다. 이러한 유형에 대해 MongoDB 검색 인덱스를 구성하는 방법은 String 필드를 인덱싱하는 방법 또는 자동 완성을 위한 필드를 인덱싱하는 방법을 참조하세요.
MongoDB 검색 인덱스 정의에서 similarity.type 속성을 지정할 때 다음 유사성 알고리즘 중에서 선택할 수 있습니다.
bm25
bm25 는 문서를 기준으로 순위를 매기는 인기 있는 순위 알고리즘입니다.
텀 빈도: 문서에 검색 텀 나타나는 빈도
역 문서 빈도: 검색 텀 모든 문서에서 얼마나 흔한지
필드 길이: 쿼리 와 일치하는 필드 의 길이
bm25 각 요인이 다음과 같이 정의되는 경우 점수를 boost * idf * tf로 계산합니다.
요인 | 설명 | |
|---|---|---|
| 쿼리 시점에 쿼리 연산자의 | |
| 쿼리 의 역 문서 빈도입니다. MongoDB Search는 다음 공식을 사용하여 빈도를 계산합니다. where:
| |
| 용어 빈도. MongoDB Search는 다음 공식을 사용하여 빈도를 계산합니다. where:
|
부울
boolean 은 각 쿼리 텀이 문서에 존재하는지 확인하고 발견된 텀의 수를 계산하는 점수 알고리즘입니다. 일치하는 모든 텀은 텀의 중요도나 빈도에 대한 조정 없이 동등하게 처리됩니다.
boolean의 경우, 점수는 문서에 존재하는 모든 쿼리 텀의 합으로 계산됩니다. 각 텀이 문서에 존재하는 경우 점수에 1의 값을 기여합니다.
stableTfl
stableTfl 은 텀의 길이를 사용하여 텀의 희귀성을 도출하는 사용자 지정 MongoDB 검색 순위 알고리즘입니다. 이는 긴 단어가 나타나는 빈도가 낮다(더 드물게)는 집프의 법칙에 근거한 것입니다.
stableTfl 각 요인이 다음과 같이 정의되는 경우 점수를 boost * tr * tf로 계산합니다.
요인 | 설명 | |
|---|---|---|
| 쿼리 시점에 쿼리 연산자의 | |
| 감소 함수. MongoDB 검색은 다음 수식을 사용하여 감소 함수를 계산합니다. where:
| |
| 텀 희귀도. MongoDB 검색는 다음 공식을 사용하여 텀의 희귀도를 계산합니다. where:
| |
| 확률 함수는 Zipf의 법칙에 기반합니다. MongoDB 검색는 다음 공식을 사용하여 문서에 쿼리 텀이 나타날 확률을 계산합니다. where:
|
near 연산자
The near operator uses a distance decay function to score documents. It measures the proximity of the MongoDB Search results to the number, date, or geographic point that you set as the origin value.
거리 감소 함수는 점수를 pivot / (pivot + distance)로 계산하며, 각 요소는 다음과 같이 정의됩니다.
요인 | 설명 | |
|---|---|---|
|
| |
|
where:
|
예시
다음 예에서는 다음에 대한 결과에서 점수의 세부 정보를 검색하는 방법을 보여 줍니다.
쿼리는 text, near, 복합 및 embeddedDocument 연산자를 사용하여 실행됩니다.
function옵션 표현식을 사용하여 점수가 수정된 쿼리입니다.
팁
To view details of the score recursively in the arrays of objects, configure the settings in mongosh by running the following:
config.set('inspectDepth', Infinity)
연산자 예제
다음 예제에서는 텍스트 , near , 복합 및 embeddedDocument 연산자 쿼리에 대한 결과의 문서에 대해 옵션을 사용하여 점수 분석을 검색하는 방법을 보여 줍니다.$search scoreDetails
The following example uses the text operator to query the title field in the sample_mflix.movies collection for the term autumn. The query specifies the scoreDetails option in the $search stage to retrieve a detailed breakdown of the score for each document in the results. The query uses the $limit stage to limit the results to three documents and the $project stage to do the following:
_id필드를 제외합니다.title필드만 포함합니다.결과에
score필드를 추가하여 문서의 점수를 반환하고scoreDetails필드를 추가하여 문서의 점수에 대한 자세한 분석을 반환합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "autumn" 7 }, 8 "scoreDetails": true 9 } 10 }, 11 { 12 "$limit": 3 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "score": { "$meta": "searchScore" }, 19 "scoreDetails": { "$meta": "searchScoreDetails" } 20 } 21 } 22 ])
1 [ 2 { 3 title: 'Autumn Leaves', 4 score: 3.834893226623535, 5 scoreDetails: { 6 value: 3.834893226623535, 7 description: '$type:string/title:autumn [BM25Similarity], result of:', 8 details: [ 9 { 10 value: 3.834893226623535, 11 description: 'score(freq=1.0), computed as boost * idf * tf from:', 12 details: [ 13 { 14 value: 7.39188289642334, 15 description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', 16 details: [ 17 { 18 value: 14, 19 description: 'n, number of documents containing term', 20 details: [] 21 }, 22 { 23 value: 23529, 24 description: 'N, total number of documents with field', 25 details: [] 26 } 27 ] 28 }, 29 { 30 value: 0.5187978744506836, 31 description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', 32 details: [ 33 { 34 value: 1, 35 description: 'freq, occurrences of term within document', 36 details: [] 37 }, 38 { 39 value: 1.2000000476837158, 40 description: 'k1, term saturation parameter', 41 details: [] 42 }, 43 { 44 value: 0.75, 45 description: 'b, length normalization parameter', 46 details: [] 47 }, 48 { 49 value: 2, 50 description: 'dl, length of field', 51 details: [] 52 }, 53 { 54 value: 2.868375301361084, 55 description: 'avgdl, average length of field', 56 details: [] 57 } 58 ] 59 } 60 ] 61 } 62 ] 63 } 64 }, 65 { 66 title: 'Late Autumn', 67 score: 3.834893226623535, 68 scoreDetails: { 69 value: 3.834893226623535, 70 description: '$type:string/title:autumn [BM25Similarity], result of:', 71 details: [ 72 { 73 value: 3.834893226623535, 74 description: 'score(freq=1.0), computed as boost * idf * tf from:', 75 details: [ 76 { 77 value: 7.39188289642334, 78 description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', 79 details: [ 80 { 81 value: 14, 82 description: 'n, number of documents containing term', 83 details: [] 84 }, 85 { 86 value: 23529, 87 description: 'N, total number of documents with field', 88 details: [] 89 } 90 ] 91 }, 92 { 93 value: 0.5187978744506836, 94 description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', 95 details: [ 96 { 97 value: 1, 98 description: 'freq, occurrences of term within document', 99 details: [] 100 }, 101 { 102 value: 1.2000000476837158, 103 description: 'k1, term saturation parameter', 104 details: [] 105 }, 106 { 107 value: 0.75, 108 description: 'b, length normalization parameter', 109 details: [] 110 }, 111 { 112 value: 2, 113 description: 'dl, length of field', 114 details: [] 115 }, 116 { 117 value: 2.868375301361084, 118 description: 'avgdl, average length of field', 119 details: [] 120 } 121 ] 122 } 123 ] 124 } 125 ] 126 } 127 }, 128 { 129 title: 'Cheyenne Autumn', 130 score: 3.834893226623535, 131 scoreDetails: { 132 value: 3.834893226623535, 133 description: '$type:string/title:autumn [BM25Similarity], result of:', 134 details: [ 135 { 136 value: 3.834893226623535, 137 description: 'score(freq=1.0), computed as boost * idf * tf from:', 138 details: [ 139 { 140 value: 7.39188289642334, 141 description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', 142 details: [ 143 { 144 value: 14, 145 description: 'n, number of documents containing term', 146 details: [] 147 }, 148 { 149 value: 23529, 150 description: 'N, total number of documents with field', 151 details: [] 152 } 153 ] 154 }, 155 { 156 value: 0.5187978744506836, 157 description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', 158 details: [ 159 { 160 value: 1, 161 description: 'freq, occurrences of term within document', 162 details: [] 163 }, 164 { 165 value: 1.2000000476837158, 166 description: 'k1, term saturation parameter', 167 details: [] 168 }, 169 { 170 value: 0.75, 171 description: 'b, length normalization parameter', 172 details: [] 173 }, 174 { 175 value: 2, 176 description: 'dl, length of field', 177 details: [] 178 }, 179 { 180 value: 2.868375301361084, 181 description: 'avgdl, average length of field', 182 details: [] 183 } 184 ] 185 } 186 ] 187 } 188 ] 189 } 190 } 191 ]
MongoDB Search는 점수를 계산할 때 다음 BM25Similarity 요인을 고려합니다.
요인 | 설명 | |
|---|---|---|
| 쿼리 시점에 쿼리 연산자의 | |
| 쿼리 의 역 문서 빈도입니다. MongoDB Search는 다음 공식을 사용하여 빈도를 계산합니다. where:
| |
| 용어 빈도. MongoDB Search는 다음 공식을 사용하여 빈도를 계산합니다. where:
|
The following example uses the near operator to query the released field in the sample_mflix.movies collection for movies released near January 01, 2010. The query specifies the scoreDetails option in the $search stage to retrieve a detailed breakdown of the score for each document in the results. The query uses the $limit stage to limit the results to three documents and the $project stage to do the following:
_id필드를 제외합니다.title및released필드만 포함합니다.결과에
score필드를 추가하여 문서의 점수를 반환하고scoreDetails필드를 추가하여 문서의 점수에 대한 자세한 분석을 반환합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "near": { 5 "path": "released", 6 "origin": ISODate("2010-01-01T00:00:00.000+00:00"), 7 "pivot": 7776000000 8 }, 9 "scoreDetails": true 10 } 11 }, 12 { 13 "$limit": 3 14 }, 15 { 16 "$project": { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 "score": { "$meta": "searchScore" }, 21 "scoreDetails": { "$meta": "searchScoreDetails" } 22 } 23 } 24 ])
1 [ 2 { 3 title: 'Tony', 4 released: ISODate("2010-01-01T00:00:00.000Z"), 5 score: 1, 6 scoreDetails: { 7 value: 1, 8 description: 'Distance score, computed as weight * pivotDistance / (pivotDistance + abs(value - origin)) from:', 9 details: [ 10 { value: 1, description: 'weight', details: [] }, 11 { 12 value: 7776000000, 13 description: 'pivotDistance', 14 details: [] 15 }, 16 { value: 1262303969280, description: 'origin', details: [] }, 17 { 18 value: 1262303969280, 19 description: 'current value', 20 details: [] 21 } 22 ] 23 } 24 }, 25 { 26 title: 'And Everything Is Going Fine', 27 released: ISODate("2010-01-01T00:00:00.000Z"), 28 score: 1, 29 scoreDetails: { 30 value: 1, 31 description: 'Distance score, computed as weight * pivotDistance / (pivotDistance + abs(value - origin)) from:', 32 details: [ 33 { value: 1, description: 'weight', details: [] }, 34 { 35 value: 7776000000, 36 description: 'pivotDistance', 37 details: [] 38 }, 39 { value: 1262303969280, description: 'origin', details: [] }, 40 { 41 value: 1262303969280, 42 description: 'current value', 43 details: [] 44 } 45 ] 46 } 47 }, 48 { 49 title: 'A Film with Me in It', 50 released: ISODate("2010-01-01T00:00:00.000Z") 51 score: 1, 52 scoreDetails: { 53 value: 1, 54 description: 'Distance score, computed as weight * pivotDistance / (pivotDistance + abs(value - origin)) from:', 55 details: [ 56 { value: 1, description: 'weight', details: [] }, 57 { 58 value: 7776000000, 59 description: 'pivotDistance', 60 details: [] 61 }, 62 { value: 1262303969280, description: 'origin', details: [] }, 63 { 64 value: 1262303969280, 65 description: 'current value', 66 details: [] 67 } 68 ] 69 } 70 } 71 ]
거리 점수의 경우 MongoDB Search는 점수를 계산할 때 다음 요소를 고려합니다.
요인 | 설명 | |
|---|---|---|
|
| |
|
where:
|
다음 예시에서는 compound 연산자를 사용하여 sample_mflix.movies 컬렉션에서 영화를 쿼리하며 다음 절을 사용합니다.
filter제목에friend라는 용어가 포함된 영화를 검색하는 절입니다.must2000년과2015년 사이에 개봉된 영화를 찾는 절입니다.mustNot절은Short,Western및Biography장르에 속하지 않는 영화를 찾습니다.
The query specifies the scoreDetails option in the $search stage to retrieve a detailed breakdown of the score for each document in the results. The query uses the $limit stage to limit the results to three documents and the $project stage to do the following:
_id필드를 제외합니다.title,released,genres필드만 포함하세요.결과에
score필드를 추가하여 문서의 점수를 반환하고scoreDetails필드를 추가하여 문서의 점수에 대한 자세한 분석을 반환합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "filter": [{ 6 "text": { 7 "query": "friend", 8 "path": "title" 9 } 10 }], 11 "must": [{ 12 "range": { 13 "path": "year", 14 "gte": 2000, 15 "lte": 2015 16 } 17 }], 18 "mustNot": [{ 19 "text": { 20 "query": ["Short, Western", "Biography"], 21 "path": "genres" 22 } 23 }] 24 }, 25 "scoreDetails": true 26 } 27 }, 28 { 29 "$limit": 3 30 }, 31 { 32 "$project": { 33 "_id": 0, 34 "title": 1, 35 "released": 1, 36 "genres": 1, 37 "score": { "$meta": "searchScore" }, 38 "scoreDetails": { "$meta": "searchScoreDetails" } 39 } 40 } 41 ])
1 [ 2 { 3 genres: [ 'Comedy', 'Drama', 'Mystery' ], 4 title: 'With a Friend Like Harry...', 5 released: ISODate("2001-06-15T00:00:00.000Z"), 6 score: 1, 7 scoreDetails: { 8 value: 1, 9 description: 'sum of:', 10 details: [ 11 { 12 value: 0, 13 description: 'match on required clause, product of:', 14 details: [ 15 { value: 0, description: '# clause', details: [] }, 16 { 17 value: 1, 18 description: '$type:string/title:friend', 19 details: [] 20 } 21 ] 22 }, 23 { 24 value: 1, 25 description: 'sum of:', 26 details: [ 27 { 28 value: 1, 29 description: 'sum of:', 30 details: [ 31 { 32 value: 1, 33 description: '$type:double/year:[4656510908468559872 TO 4656576879166226432]', 34 details: [] 35 } 36 ] 37 } 38 ] 39 } 40 ] 41 } 42 }, 43 { 44 genres: [ 'Drama' ], 45 title: 'My Friend Henry', 46 released: ISODate("2004-08-20T00:00:00.000Z"), 47 score: 1, 48 scoreDetails: { 49 value: 1, 50 description: 'sum of:', 51 details: [ 52 { 53 value: 0, 54 description: 'match on required clause, product of:', 55 details: [ 56 { value: 0, description: '# clause', details: [] }, 57 { 58 value: 1, 59 description: '$type:string/title:friend', 60 details: [] 61 } 62 ] 63 }, 64 { 65 value: 1, 66 description: 'sum of:', 67 details: [ 68 { 69 value: 1, 70 description: 'sum of:', 71 details: [ 72 { 73 value: 1, 74 description: '$type:double/year:[4656510908468559872 TO 4656576879166226432]', 75 details: [] 76 } 77 ] 78 } 79 ] 80 } 81 ] 82 } 83 }, 84 { 85 genres: [ 'Comedy', 'Drama' ], 86 title: 'A Friend of Mine', 87 released: ISODate("2006-10-26T00:00:00.000Z"), 88 score: 1, 89 scoreDetails: { 90 value: 1, 91 description: 'sum of:', 92 details: [ 93 { 94 value: 0, 95 description: 'match on required clause, product of:', 96 details: [ 97 { value: 0, description: '# clause', details: [] }, 98 { 99 value: 1, 100 description: '$type:string/title:friend', 101 details: [] 102 } 103 ] 104 }, 105 { 106 value: 1, 107 description: 'sum of:', 108 details: [ 109 { 110 value: 1, 111 description: 'sum of:', 112 details: [ 113 { 114 value: 1, 115 description: '$type:double/year:[4656510908468559872 TO 4656576879166226432]', 116 details: [] 117 } 118 ] 119 } 120 ] 121 } 122 ] 123 } 124 } 125 ]
참고
15, 56, 97줄의 결과에 있는 # clause는 문서 점수에 영향을 주지 않는 복합 연산자 쿼리 filter절을 나타냅니다.
The following example uses the embeddedDocument operator to query the products.name field in the sample_training.companies collection for products that contain the term Basic preceded by any number of other characters. The query specifies inside the embeddedDocument operator that the returned score must be a sum of all the matching embedded documents. The query also specifies the scoreDetails option in the $search stage to retrieve a detailed breakdown of the score for each document in the results. The query uses the $limit stage to limit the results to three documents and the $project stage to do the following:
_id필드를 제외합니다.products.name필드만 포함합니다.결과에
score필드를 추가하여 문서의 점수를 반환하고scoreDetails필드를 추가하여 문서의 점수에 대한 자세한 분석을 반환합니다.
1 db.companies.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "products", 5 "operator": { 6 "wildcard": { 7 "path": "products.name", 8 "query": "*Basic", 9 "allowAnalyzedField": true 10 } 11 }, 12 "score": { 13 "embedded": { 14 "aggregate": "sum" 15 } 16 } 17 }, 18 "scoreDetails": true 19 } 20 }, 21 { 22 "$limit": 3 23 }, 24 { 25 "$project": { 26 "_id": 0, 27 "name": 1, 28 "products.name": 1, 29 "score": { "$meta": "searchScore" }, 30 "scoreDetails": { "$meta": "searchScoreDetails" } 31 } 32 })
1 [ 2 { 3 name: 'Plaxo', 4 products: [ 5 { name: 'Plaxo Basic' }, 6 { name: 'Plaxo Pulse' }, 7 { name: 'Plaxo Personal Assistant' } 8 ], 9 score: 1, 10 scoreDetails: { 11 value: 1, 12 description: 'Score based on 1 child docs in range from 27 to 29, best match:', 13 details: [ 14 { 15 value: 1, 16 description: '$embedded:8/products/$type:string/products.name:*Basic', 17 details: [] 18 } 19 ] 20 } 21 }, 22 { 23 name: 'The Game Creators', 24 products: [ 25 { name: 'Dark Basic Professional' }, 26 { name: 'FPS Creator' }, 27 { name: 'FPS Creator X10' } 28 ], 29 score: 1, 30 scoreDetails: { 31 value: 1, 32 description: 'Score based on 1 child docs in range from 7474 to 7476, best match:', 33 details: [ 34 { 35 value: 1, 36 description: '$embedded:8/products/$type:string/products.name:*basic', 37 details: [] 38 } 39 ] 40 } 41 }, 42 { 43 name: 'Load Impact', 44 products: [ 45 { name: 'Load Impact LIGHT' }, 46 { name: 'Load Impact BASIC' }, 47 { name: 'Load Impact PROFESSIONAL' }, 48 { name: 'Load Impact ADVANCED' } 49 ], 50 score: 1, 51 scoreDetails: { 52 value: 1, 53 description: 'Score based on 1 child docs in range from 11545 to 11548, best match:', 54 details: [ 55 { 56 value: 1, 57 description: '$embedded:8/products/$type:string/products.name:*basic', 58 details: [] 59 } 60 ] 61 } 62 } 63 ]
참고
범위 내의 하위 문서를 기반으로 하는 점수의 경우 범위의 숫자는 내부적으로 Lucene에서 인덱싱한 상위 및 하위 문서의 ID를 나타냅니다. 하위 문서의 description(16, 36, 57행에서)은 경로의 내부 표현을 보여줍니다.
사용자 지정 점수 예시
다음 $search scoreDetails 예제에서는 sample_mflix.movies collection에 대한 함수 표현식 예제 쿼리의 결과에 있는 문서에 대해 옵션을 사용하여 점수 분석을 검색하는 방법을 보여 줍니다.
1 db.movies.aggregate([{ 2 "$search": { 3 "text": { 4 "path": "title", 5 "query": "men", 6 "score": { 7 "function":{ 8 "multiply":[ 9 { 10 "path": { 11 "value": "imdb.rating", 12 "undefined": 2 13 } 14 }, 15 { 16 "score": "relevance" 17 } 18 ] 19 } 20 } 21 }, 22 "scoreDetails": true 23 } 24 }, 25 { 26 $limit: 5 27 }, 28 { 29 $project: { 30 "_id": 0, 31 "title": 1, 32 "score": { "$meta": "searchScore" }, 33 "scoreDetails": {"$meta": "searchScoreDetails"} 34 } 35 }])
[ { title: 'Men...', score: 23.431293487548828, scoreDetails: { value: 23.431293487548828, description: 'FunctionScoreQuery($type:string/title:men, scored by (imdb.rating * scores)) [BM25Similarity], result of:', details: [ { value: 23.431293487548828, description: '(imdb.rating * scores)', details: [] } ] } }, { title: '12 Angry Men', score: 22.080968856811523, scoreDetails: { value: 22.080968856811523, description: 'FunctionScoreQuery($type:string/title:men, scored by (imdb.rating * scores)) [BM25Similarity], result of:', details: [ { value: 22.080968856811523, description: '(imdb.rating * scores)', details: [] } ] } }, { title: 'X-Men', score: 21.34803581237793, scoreDetails: { value: 21.34803581237793, description: 'FunctionScoreQuery($type:string/title:men, scored by (imdb.rating * scores)) [BM25Similarity], result of:', details: [ { value: 21.34803581237793, description: '(imdb.rating * scores)', details: [] } ] } }, { title: 'X-Men', score: 21.34803581237793, scoreDetails: { value: 21.34803581237793, description: 'FunctionScoreQuery($type:string/title:men, scored by (imdb.rating * scores)) [BM25Similarity], result of:', details: [ { value: 21.34803581237793, description: '(imdb.rating * scores)', details: [] } ] } }, { title: 'Matchstick Men', score: 21.05954933166504, scoreDetails: { value: 21.05954933166504, description: 'FunctionScoreQuery($type:string/title:men, scored by (imdb.rating * scores)) [BM25Similarity], result of:', details: [ { value: 21.05954933166504, description: '(imdb.rating * scores)', details: [] } ] } } ]
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "men", 7 "score": { 8 "function":{ 9 "constant": 3 10 } 11 } 12 }, 13 "scoreDetails": true 14 } 15 }, 16 { 17 $limit: 5 18 }, 19 { 20 $project: { 21 "_id": 0, 22 "title": 1, 23 "score": { "$meta": "searchScore" }, 24 "scoreDetails": {"$meta": "searchScoreDetails"} 25 } 26 } 27 ])
[ { title: 'Men Without Women', score: 3, scoreDetails: { value: 3, description: 'FunctionScoreQuery($type:string/title:men, scored by constant(3.0)) [BM25Similarity], result of:', details: [ { value: 3, description: 'constant(3.0)', details: [] } ] } }, { title: 'One Hundred Men and a Girl', score: 3, scoreDetails: { value: 3, description: 'FunctionScoreQuery($type:string/title:men, scored by constant(3.0)) [BM25Similarity], result of:', details: [ { value: 3, description: 'constant(3.0)', details: [] } ] } }, { title: 'Of Mice and Men', score: 3, scoreDetails: { value: 3, description: 'FunctionScoreQuery($type:string/title:men, scored by constant(3.0)) [BM25Similarity], result of:', details: [ { value: 3, description: 'constant(3.0)', details: [] } ] } }, { title: "All the King's Men", score: 3, scoreDetails: { value: 3, description: 'FunctionScoreQuery($type:string/title:men, scored by constant(3.0)) [BM25Similarity], result of:', details: [ { value: 3, description: 'constant(3.0)', details: [] } ] } }, { title: 'The Men', score: 3, scoreDetails: { value: 3, description: 'FunctionScoreQuery($type:string/title:men, scored by constant(3.0)) [BM25Similarity], result of:', details: [ { value: 3, description: 'constant(3.0)', details: [] } ] } } ]
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "shop", 7 "score": { 8 "function":{ 9 "gauss": { 10 "path": { 11 "value": "imdb.rating", 12 "undefined": 4.6 13 }, 14 "origin": 9.5, 15 "scale": 5, 16 "offset": 0, 17 "decay": 0.5 18 } 19 } 20 } 21 }, 22 "scoreDetails": true 23 } 24 }, 25 { 26 "$limit": 10 27 }, 28 { 29 "$project": { 30 "_id": 0, 31 "title": 1, 32 "score": { "$meta": "searchScore" }, 33 "scoreDetails": {"$meta": "searchScoreDetails"} 34 } 35 } 36 ])
[ { title: 'The Shop Around the Corner', score: 0.9471074342727661, scoreDetails: { value: 0.9471074342727661, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.9471074342727661, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'Exit Through the Gift Shop', score: 0.9471074342727661, scoreDetails: { value: 0.9471074342727661, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.9471074342727661, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'The Shop on Main Street', score: 0.9395227432250977, scoreDetails: { value: 0.9395227432250977, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.9395227432250977, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'Chop Shop', score: 0.8849083781242371, scoreDetails: { value: 0.8849083781242371, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.8849083781242371, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'Little Shop of Horrors', score: 0.8290896415710449, scoreDetails: { value: 0.8290896415710449, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.8290896415710449, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'The Suicide Shop', score: 0.7257778644561768, scoreDetails: { value: 0.7257778644561768, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.7257778644561768, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'A Woman, a Gun and a Noodle Shop', score: 0.6559237241744995, scoreDetails: { value: 0.6559237241744995, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.6559237241744995, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } }, { title: 'Beauty Shop', score: 0.6274620294570923, scoreDetails: { value: 0.6274620294570923, description: 'FunctionScoreQuery($type:string/title:shop, scored by exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))) [BM25Similarity], result of:', details: [ { value: 0.6274620294570923, description: 'exp((max(0, |imdb.rating - 9.5| - 0.0)^2) / 2 * (5.0^2 / 2 * ln(0.5)))', details: [] } ] } } ]
1 db.movies.aggregate([{ 2 "$search": { 3 "text": { 4 "path": "title", 5 "query": "men", 6 "score": { 7 "function":{ 8 "path": { 9 "value": "imdb.rating", 10 "undefined": 4.6 11 } 12 } 13 } 14 }, 15 "scoreDetails": true 16 } 17 }, 18 { 19 $limit: 5 20 }, 21 { 22 $project: { 23 "_id": 0, 24 "title": 1, 25 "score": { "$meta": "searchScore" }, 26 "scoreDetails": {"$meta": "searchScoreDetails"} 27 } 28 }])
[ { title: '12 Angry Men', score: 8.899999618530273, scoreDetails: { value: 8.899999618530273, description: 'FunctionScoreQuery($type:string/title:men, scored by imdb.rating) [BM25Similarity], result of:', details: [ { value: 8.899999618530273, description: 'imdb.rating', details: [] } ] } }, { title: 'The Men Who Built America', score: 8.600000381469727, scoreDetails: { value: 8.600000381469727, description: 'FunctionScoreQuery($type:string/title:men, scored by imdb.rating) [BM25Similarity], result of:', details: [ { value: 8.600000381469727, description: 'imdb.rating', details: [] } ] } }, { title: 'No Country for Old Men', score: 8.100000381469727, scoreDetails: { value: 8.100000381469727, description: 'FunctionScoreQuery($type:string/title:men, scored by imdb.rating) [BM25Similarity], result of:', details: [ { value: 8.100000381469727, description: 'imdb.rating', details: [] } ] } }, { title: 'X-Men: Days of Future Past', score: 8.100000381469727, scoreDetails: { value: 8.100000381469727, description: 'FunctionScoreQuery($type:string/title:men, scored by imdb.rating) [BM25Similarity], result of:', details: [ { value: 8.100000381469727, description: 'imdb.rating', details: [] } ] } }, { title: 'The Best of Men', score: 8.100000381469727, scoreDetails: { value: 8.100000381469727, description: 'FunctionScoreQuery($type:string/title:men, scored by imdb.rating) [BM25Similarity], result of:', details: [ { value: 8.100000381469727, description: 'imdb.rating', details: [] } ] } } ]
1 db.movies.aggregate([{ 2 "$search": { 3 "text": { 4 "path": "title", 5 "query": "men", 6 "score": { 7 "function":{ 8 "score": "relevance" 9 } 10 } 11 }, 12 "scoreDetails": true 13 } 14 }, 15 { 16 $limit: 5 17 }, 18 { 19 $project: { 20 "_id": 0, 21 "title": 1, 22 "score": { "$meta": "searchScore" }, 23 "scoreDetails": {"$meta": "searchScoreDetails"} 24 } 25 }])
[ { title: 'Men...', score: 3.4457783699035645, scoreDetails: { value: 3.4457783699035645, description: 'FunctionScoreQuery($type:string/title:men, scored by scores) [BM25Similarity], result of:', details: [ { value: 3.4457783699035645, description: 'weight($type:string/title:men in 4705) [BM25Similarity], result of:', details: [ { value: 3.4457783699035645, description: 'score(freq=1.0), computed as boost * idf * tf from:', details: [ { value: 5.5606818199157715, description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', details: [ { value: 90, description: 'n, number of documents containing term', details: [] }, { value: 23529, description: 'N, total number of documents with field', details: [] } ] }, { value: 0.6196683645248413, description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', details: [ { value: 1, description: 'freq, occurrences of term within document', details: [] }, { value: 1.2000000476837158, description: 'k1, term saturation parameter', details: [] }, { value: 0.75, description: 'b, length normalization parameter', details: [] }, { value: 1, description: 'dl, length of field', details: [] }, { value: 2.868375301361084, description: 'avgdl, average length of field', details: [] } ] } ] } ] } ] } }, { title: 'The Men', score: 2.8848698139190674, scoreDetails: { value: 2.8848698139190674, description: 'FunctionScoreQuery($type:string/title:men, scored by scores) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'weight($type:string/title:men in 870) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'score(freq=1.0), computed as boost * idf * tf from:', details: [ { value: 5.5606818199157715, description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', details: [ { value: 90, description: 'n, number of documents containing term', details: [] }, { value: 23529, description: 'N, total number of documents with field', details: [] } ] }, { value: 0.5187978744506836, description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', details: [ { value: 1, description: 'freq, occurrences of term within document', details: [] }, { value: 1.2000000476837158, description: 'k1, term saturation parameter', details: [] }, { value: 0.75, description: 'b, length normalization parameter', details: [] }, { value: 2, description: 'dl, length of field', details: [] }, { value: 2.868375301361084, description: 'avgdl, average length of field', details: [] } ] } ] } ] } ] } }, { title: 'Simple Men', score: 2.8848698139190674, scoreDetails: { value: 2.8848698139190674, description: 'FunctionScoreQuery($type:string/title:men, scored by scores) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'weight($type:string/title:men in 6371) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'score(freq=1.0), computed as boost * idf * tf from:', details: [ { value: 5.5606818199157715, description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', details: [ { value: 90, description: 'n, number of documents containing term', details: [] }, { value: 23529, description: 'N, total number of documents with field', details: [] } ] }, { value: 0.5187978744506836, description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', details: [ { value: 1, description: 'freq, occurrences of term within document', details: [] }, { value: 1.2000000476837158, description: 'k1, term saturation parameter', details: [] }, { value: 0.75, description: 'b, length normalization parameter', details: [] }, { value: 2, description: 'dl, length of field', details: [] }, { value: 2.868375301361084, description: 'avgdl, average length of field', details: [] } ] } ] } ] } ] } }, { title: 'X-Men', score: 2.8848698139190674, scoreDetails: { value: 2.8848698139190674, description: 'FunctionScoreQuery($type:string/title:men, scored by scores) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'weight($type:string/title:men in 8368) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'score(freq=1.0), computed as boost * idf * tf from:', details: [ { value: 5.5606818199157715, description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', details: [ { value: 90, description: 'n, number of documents containing term', details: [] }, { value: 23529, description: 'N, total number of documents with field', details: [] } ] }, { value: 0.5187978744506836, description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', details: [ { value: 1, description: 'freq, occurrences of term within document', details: [] }, { value: 1.2000000476837158, description: 'k1, term saturation parameter', details: [] }, { value: 0.75, description: 'b, length normalization parameter', details: [] }, { value: 2, description: 'dl, length of field', details: [] }, { value: 2.868375301361084, description: 'avgdl, average length of field', details: [] } ] } ] } ] } ] } }, { title: 'Mystery Men', score: 2.8848698139190674, scoreDetails: { value: 2.8848698139190674, description: 'FunctionScoreQuery($type:string/title:men, scored by scores) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'weight($type:string/title:men in 8601) [BM25Similarity], result of:', details: [ { value: 2.8848698139190674, description: 'score(freq=1.0), computed as boost * idf * tf from:', details: [ { value: 5.5606818199157715, description: 'idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:', details: [ { value: 90, description: 'n, number of documents containing term', details: [] }, { value: 23529, description: 'N, total number of documents with field', details: [] } ] }, { value: 0.5187978744506836, description: 'tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:', details: [ { value: 1, description: 'freq, occurrences of term within document', details: [] }, { value: 1.2000000476837158, description: 'k1, term saturation parameter', details: [] }, { value: 0.75, description: 'b, length normalization parameter', details: [] }, { value: 2, description: 'dl, length of field', details: [] }, { value: 2.868375301361084, description: 'avgdl, average length of field', details: [] } ] } ] } ] } ] } } ]
1 db.movies.aggregate([{ 2 "$search": { 3 "text": { 4 "path": "title", 5 "query": "men", 6 "score": { 7 "function": { 8 "log": { 9 "path": { 10 "value": "imdb.rating", 11 "undefined": 10 12 } 13 } 14 } 15 } 16 }, 17 "scoreDetails": true 18 } 19 }, 20 { 21 $limit: 5 22 }, 23 { 24 $project: { 25 "_id": 0, 26 "title": 1, 27 "score": { "$meta": "searchScore" }, 28 "scoreDetails": {"$meta": "searchScoreDetails"} 29 } 30 }])
[ { title: '12 Angry Men', score: 0.9493899941444397, scoreDetails: { value: 0.9493899941444397, description: 'FunctionScoreQuery($type:string/title:men, scored by log(imdb.rating)) [BM25Similarity], result of:', details: [ { value: 0.9493899941444397, description: 'log(imdb.rating)', details: [] } ] } }, { title: 'The Men Who Built America', score: 0.9344984292984009, scoreDetails: { value: 0.9344984292984009, description: 'FunctionScoreQuery($type:string/title:men, scored by log(imdb.rating)) [BM25Similarity], result of:', details: [ { value: 0.9344984292984009, description: 'log(imdb.rating)', details: [] } ] } }, { title: 'No Country for Old Men', score: 0.9084849953651428, scoreDetails: { value: 0.9084849953651428, description: 'FunctionScoreQuery($type:string/title:men, scored by log(imdb.rating)) [BM25Similarity], result of:', details: [ { value: 0.9084849953651428, description: 'log(imdb.rating)', details: [] } ] } }, { title: 'X-Men: Days of Future Past', score: 0.9084849953651428, scoreDetails: { value: 0.9084849953651428, description: 'FunctionScoreQuery($type:string/title:men, scored by log(imdb.rating)) [BM25Similarity], result of:', details: [ { value: 0.9084849953651428, description: 'log(imdb.rating)', details: [] } ] } }, { title: 'The Best of Men', score: 0.9084849953651428, scoreDetails: { value: 0.9084849953651428, description: 'FunctionScoreQuery($type:string/title:men, scored by log(imdb.rating)) [BM25Similarity], result of:', details: [ { value: 0.9084849953651428, description: 'log(imdb.rating)', details: [] } ] } } ]