복합
정의
compound
compound
연산자는 두 개 이상의 연산자를 하나의 쿼리로 결합합니다.compound
쿼리의 각 요소를 절이라고 하며, 각 절은 하나 이상의 하위 쿼리로 구성됩니다. Atlas Search는 지침과 함께 샘플 복합 쿼리 템플릿을 제공합니다. 자세한 내용은 쿼리 지침 템플릿 보기를 참조하세요.
구문
compound
의 구문은 다음과 같습니다:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "compound": { 5 <must | mustNot | should | filter>: [ { <clauses> } ], 6 "score": <options> 7 } 8 } 9 }
각 must
, mustNot
, should
및 filter
절은 하위 절의 배열을 포함합니다. 배열에 하위 절이 하나만 포함되어 있어도 배열 구문을 사용합니다. 이 페이지의 예시를 참조하세요.
옵션
compound
는 다음 용어를 사용하여 쿼리를 구성합니다:
문서가 결과에 포함되기 위해 일치해야 하는 절입니다. 반환되는 점수는 해당 절에 있는 모든 하위 쿼리의 점수 합계입니다.
| ||||||||||||||
결과에 문서가 포함되려면 일치하지 않아야 하는 절입니다.
| ||||||||||||||
결과에 포함된 문서에서 일치시키려는 절입니다.
예시를 참조하세요.
복합 쿼리 내에서 | ||||||||||||||
문서가 결과에 포함되기 위해 모두 일치해야 하는 절입니다. 예를 들어,
대신
다른 필터 예시를 참조하세요. | ||||||||||||||
score |
사용법
채점 동작
Atlas Search는 문서에서 일치하는 항목을 생성한 각 개별 조항에 대해 해당 문서가 받은 점수를 합산하여 결과 세트에서 문서에 점수를 매깁니다. must
및 should
절만 채점에 참여합니다. 결과 세트은 최고 점수에서 최저 점수 순으로 정렬됩니다.
다음 표는 점수에 기여하거나 기여하지 않는 compound
절을 보여줍니다.
절 | 점수에 기여함 | 점수에 기여하지 않음 |
---|---|---|
filter | ||
must | ||
mustNot | ||
should |
score
옵션을 사용해 전체 복합 쿼리의 점수를 높이거나 바꿀 수 있습니다. 전체 복합 점수를 바꾸는 예시는 아래의 복합 점수 예시를 참조하세요. 점수를 사용하여 각 절의 각 하위 쿼리에 대한 점수를 높이거나 변경할 수도 있습니다. 점수 수정에서 compound
연산자 절에서 변경된 점수의 예시를 확인할 수 있습니다.
예시
Atlas Search Playground 또는 Atlas 클러스터에서 다음 예시를 사용해 볼 수 있습니다.
샘플 컬렉션
이 페이지의 예시에서는 fruit
이라는 컬렉션을 사용하며, 이 컬렉션에는 다음 문서가 포함되어 있습니다:
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }, 8 { 9 "_id" : 2, 10 "type" : "banana", 11 "description" : "Bananas are usually sold in bunches of five or six.", 12 "category" : "nonorganic", 13 "in_stock" : true 14 }, 15 { 16 "_id" : 3, 17 "type" : "pear", 18 "description" : "Bosc and Bartlett are the most common varieties of pears.", 19 "category" : "organic", 20 "in_stock" : true 21 }
샘플 인덱스
fruit
컬렉션에는 컬렉션의 모든 필드를 자동으로 인덱싱하고 기본 표준 분석기를 사용하는 동적 매핑을 통한 기본 인덱스가 있습니다. standard
분석기는 모든 단어를 소문자로 처리하고 일반적인 중지 단어("the", "a", "and",
등)는 무시합니다.
샘플 쿼리
다음 쿼리는 Atlas Search 쿼리의 $search
compound
연산자를 보여줍니다.
must
및 예시<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \"> mustNot
다음 예에서는 must
절과 mustNot
절의 조합을 사용하여 쿼리를 구성합니다. must
절은 텍스트 연산자를 사용하여 description
필드에서 varieties
라는 용어를 검색합니다. 문서가 일치하려면 must
절을 충족해야 합니다. mustNot
절은 description
필드에서 apples
라는 용어에 대한 검색 작업을 수행합니다. 문서가 일치하려면 mustNot
절을 충족하면 안 됩니다.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "mustNot": [{ 12 "text": { 13 "query": "apples", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 } 20 ])
위의 쿼리는 description
필드에 varieties
라는 단어가 포함되어 있고 apples
이 포함되어 있지 않기 때문에 _id: 3
가 포함된 문서를 반환합니다.
➤ Atlas Search Playground에서 사용해 보세요
must
및 예시<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \"> should
다음 쿼리는 must
를 사용하여 충족해야 하는 검색 조건을 지정하고 should
를 사용하여 Fuji
단어가 포함된 문서에 대한 기본 설정을 지정합니다.
이 쿼리의 경우 $project
파이프라인 단계에서는 _id
을(를) 제외한 모든 문서 필드를 제외하고 문서의 관련성 점수를 표시하는 score
필드를 추가합니다.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 }, 20 { 21 "$project": { 22 "score": { "$meta": "searchScore" } 23 } 24 } 25 ])
{ "_id" : 1, "score" : 0.6425117254257202 } { "_id" : 3, "score" : 0.21649497747421265 }
_id: 1
이 있는 문서는 해당 문서의 description
필드에 should
절을 충족하는 단어 Fuji
포함되어 있기 때문에 점수가 더 높습니다.
➤ Atlas Search Playground에서 사용해 보세요
다음 쿼리는 결과의 모든 문서에 대해 3
의 constant
점수도 지정합니다. 이 쿼리의 경우 $project
파이프라인 단계에서는 _id
을(를) 제외한 모든 문서 필드를 제외하고 문서의 관련성 점수를 표시하는 score
필드를 추가합니다.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }], 17 "score": { "constant": { "value": 3 } } 18 } 19 } 20 }, 21 { 22 "$project": { 23 "score": { "$meta": "searchScore" } 24 } 25 } 26 ])
[ { _id: 1, score: 3 }, { _id: 3, score: 3 } ]
쿼리의 constant
옵션은 결과에 있는 각 문서의 점수를 숫자 3
(으)로 대체하기 때문에 두 문서 모두 동일한 점수를 받습니다.
➤ Atlas Search Playground에서 사용해 보세요
minimumShouldMatch 예시
should
절이 여러 개 있는 쿼리에서 miniumumShouldMatch
옵션을 사용하여 결과를 반환하기 위해 일치해야 하는 최소 절 수를 지정할 수 있습니다.
다음 쿼리는 하나의 must
절과 두 개의 should
절이 있고 minimumShouldMatch
값은 1
입니다. 문서는 description
필드에 varieties
라는 용어와 더불어 Fuji
또는 Golden Delicious
중 하나를 포함해야 결과 세트에 포함될 수 있습니다.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }, 17 { 18 "text": { 19 "query": "Golden Delicious", 20 "path": "description" 21 } 22 }], 23 "minimumShouldMatch": 1 24 } 25 } 26 } 27 ])
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }
_id: 1
이 있는 문서는 must
절과 두 개의 should
절 중 첫 번째 절과 일치합니다.
➤ Atlas Search Playground에서 사용해 보세요
filter
예시
filter
filter
절은 must
동일하게 동작하지만,filter
절이 반환된 문서의 점수에서 고려되지 않으므로 반환된 문서의 순서에 영향을 주지 않습니다.
다음 쿼리에서는 다음 절을 사용합니다.
must
및filter
를 사용하여 충족해야 하는 검색 조건을 지정합니다.should
는banana
라는 단어가 포함된 문서에 대한 선호도를 지정합니다.should
절에는minimumShouldMatch
옵션이 포함되어 있지 않습니다.minimumShouldMatch
를 생략하면 기본값은0
이 됩니다.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "banana", 14 "path": "description" 15 } 16 }], 17 "filter": [{ 18 "text": { 19 "query": "granny", 20 "path": "description" 21 } 22 }] 23 } 24 } 25 } 26 ])
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }
반환된 문서는 포함을 위한 모든 요건을 충족합니다.
must
절과filter
절이 모두 일치합니다.minimumShouldMatch
0} 값이 지정되지 않았으므로0
기본값은 입니다. 결과적으로should
절이 실패하고 여전히 문서를 반환합니다.
➤ Atlas Search Playground에서 사용해 보세요
Atlas 클러스터의 데이터에 대한 쿼리에서 $match
를 $in
으로 대체할 수 있으며 이는 filter
절을 사용하여 수행할 수 있습니다. 다음 쿼리는 $search
단계에서 일치해야 하는 검색어를 지정하기 위해 filter
를 사용하는 방법을 보여줍니다. 또한 쿼리는 should
를 사용하여 vvarieties
라는 용어를 포함하는 문서에 대한 선호도를 지정합니다. 쿼리에는 다음 작업을 수행하기 위한 $project
파이프라인 단계도 포함됩니다.
_id
와description
이외의 모든 필드를 제외합니다.문서의 관련성 점수를 표시하는
score
필드를 추가합니다.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "filter": [{ 6 "text": { 7 "query": ["apples", "bananas"], 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "varieties", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 }, 20 { 21 "$project": { 22 "description": 1, 23 "score": { "$meta": "searchScore" } 24 } 25 } 26 ])
1 [ 2 { 3 _id: 1, 4 description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.', 5 score: 0.36074575781822205 6 }, 7 { 8 _id: 2, 9 description: 'Bananas are usually sold in bunches of five or six.', 10 score: 0 11 } 12 ]
결과의 문서는 포함을 위한 모든 요구 사항을 충족합니다.
두 문서 모두 쿼리의
filter
절에 지정된apples
또는bananas
용어를 포함하고 있습니다._id: 1
문서는 쿼리의should
절에 지정된varieties
용어가 포함되어 있어_id: 2
문서보다 점수가 높습니다.
➤ Atlas Search Playground에서 사용해 보세요
중첩된 예시
다음 예시에서는 중첩된 compound
절을 사용하여 쿼리를 구성합니다. 이 예시의 경우 fruit
컬렉션에는 type
, category
및 in_stock
필드에 대한 인덱스가 있으며, 텍스트 필드는 기본 분석기를 사용합니다. 이 쿼리에서는 문서가 다음 should
절 중 하나만 충족해야 합니다.
type
필드에apple
이라는 단어를 입력합니다.category
필드에 용어organic
을 포함하고in_stock
필드에true
값을 갖습니다.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "should": [ 6 { 7 "text": { 8 "query": "apple", 9 "path": "type" 10 } 11 }, 12 { 13 "compound": { 14 "must": [ 15 { 16 "text": { 17 "query": "organic", 18 "path": "category" 19 } 20 }, 21 { 22 "equals": { 23 "value": true, 24 "path": "in_stock" 25 } 26 } 27 ] 28 } 29 } 30 ], 31 "minimumShouldMatch": 1 32 } 33 } 34 } 35 ])
1 { 2 "_id" : 3, 3 "type" : "pear", 4 "description" : "Bosc and Bartlett are the most common varieties of pears.", 5 "category" : "organic", 6 "in_stock" : true 7 } 8 { 9 "_id" : 1, 10 "type" : "apple", 11 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 12 "category" : "nonorganic", 13 "in_stock" : false 14 }
결과의 문서는 포함을 위한 모든 요구 사항을 충족합니다.
_id: 3
이 있는 문서가 두 번째should
절 안에 중첩된must
절과 일치합니다._id: 1
이 있는 문서가 첫 번째should
절과 일치합니다.
➤ Atlas Search Playground에서 사용해 보세요