정규식
정의
regex
regex
query
필드를 정규 표현식으로 해석합니다.regex
은 텀 수준 연산자이므로 필드는query
분석되지 않습니다.참고
regex
연산자가 사용할 수 있는 정규 표현식 언어는 PCRE 라이브러리의 제한된 하위 세트입니다.자세한 내용은 RegExp 클래스 를 참조하세요. 문서화.
구문
regex
의 구문은 다음과 같습니다:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "regex": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "allowAnalyzedField": <boolean>, 8 "score": <options> 9 } 10 } 11 }
옵션
regex
는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 | 기본값 |
---|---|---|---|---|
| 문자열 또는 문자열 배열 | 검색할 문자열 또는 문자열을 입력합니다. | 네 | |
| 문자열 또는 문자열 배열 | 네 | ||
| 부울 | 분석 필드에 대해 쿼리를 실행하는 경우 | no |
|
| 객체 | 일치하는 검색어 결과에 할당할 점수입니다. 옵션은 다음과 같습니다.
| no |
행동
regex
는 용어 수준 연산자이므로 query
필드는 분석되지 않습니다. 정규 표현식 검색은 한 번에 한 단어씩 필드를 인덱싱하기 때문에 키워드 분석기에서 잘 작동합니다. standard
분석기는 모든 용어의 대소문자를 구분하므로 대소문자 구분 검색을 수행하려면 기본 분석기인 표준 분석기는 사용하지 않습니다. 대신 다른 분석기를 지정해야 합니다.
allowAnalyzedField
옵션을 true
로 설정하면 regex
연산자를 사용하여 분석된 필드에서 검색을 수행할 수 있지만 예상치 못한 결과가 나타날 수 있습니다.
예시
keyword
분석기로 색인된 필드에서 *Star Trek*
을 검색하면 어떤 컨텍스트에서든 필드에 문자열 Star Trek
이 포함된 모든 문서를 찾을 수 있습니다. 표준 분석기로 인덱싱된 필드에서 *Star
Trek*
을 검색하면 Star
와 Trek
사이에 공백이 있고 인덱스에 공백이 포함되어 있지 않기 때문에 아무것도 찾을 수 없습니다.
루센 정규 표현식 동작
Atlas Search regex
연산자는 Perl 호환 정규 표현식과는 다른 Lucene 정규 표현식 엔진을 사용합니다.
예약어
다음 문자는 정규 표현식에 사용될 때 연산자로 예약되어 있습니다.
. ? + * | { } [ ] ( ) < > " \ @ #
일치하는 표현식에서 위 문자를 그대로 사용하려면 앞에 \
문자를 추가합니다.
예시
who\?
는 'who?'와 일치합니다
mongosh
또는 드라이버와 함께 이스케이프 문자를 사용하는 경우 이스케이프할 문자 앞에 이중 백슬래시를 사용해야 합니다.
예시
집계 파이프라인에서 리터럴 별표가 포함된 문자열을 검색하는 와일드카드 표현식을 만들려면 다음 표현식을 사용하세요.
"*\\**"
첫 번째 별표와 마지막 별표는 모든 문자와 일치하는 와일드카드 역할을 하며 \\*
는 리터럴 별표와 일치합니다.
참고
리터럴 백슬래시를 이스케이프하려면 다음 표현식을 사용합니다.
"*\\\*"
지원되는 연산자
연산자 | 설명 | 예시 |
---|---|---|
| 모든 문자와 일치합니다. |
|
| 앞 문자는 선택 사항이며 두 번 이상 나오지 않으면 일치합니다. |
|
| 앞의 문자는 한 번 이상 발생하는 경우 일치합니다. |
|
| 앞의 문자는 여러 번 발생하는 경우 일치합니다. |
|
|
|
|
| 앞의 문자가 정확히 <number> 번 발생하면 일치합니다. |
|
| 괄호 안의 문자는 일치를 위해 단일 단위로 처리됩니다. |
|
| 대괄호 안의 모든 문자와 일치합니다. 시작 부분에 대괄호 안의 | [xyz] matches "x", "y", and "z"[^abc] matches any character except "a", "b", or "c"[a-d] matches "a", "b", "c", or "d"[0-9] matches any numeric character from 0 through 9 |
| 숫자 범위를 일치시킵니다. |
|
| 빈 언어 연산자입니다. |
|
지원되지 않는 연산자
regex
앵커 연산자 ^
및 $
을 지원하지 않습니다.
예시
다음 예시에서는 키워드 분석기를 사용하는 사용자 지정 인덱스 정의와 함께 sample_mflix
데이터베이스의 movies
컬렉션을 사용합니다. 클러스터에 샘플 데이터 세트가 있는 경우 movies
컬렉션에 Atlas Search 인덱스를 생성하고 클러스터에서 예시 쿼리를 실행할 수 있습니다.
팁
샘플 데이터 집합을 이미 로드한 경우, Atlas Search 시작하기 자습서에 따라 인덱스 정의를 만들고 Atlas Search 쿼리를 실행하세요.
인덱스 정의
다음 인덱스 정의는 키워드 분석기를사용하여 movies
컬렉션의 title
필드를 인덱싱합니다.
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 } 8 } 9 } 10 }
다음 예시에서는 Seattle
단어로 끝나는 영화 제목에 대한 모든 title
필드를 검색합니다. (.*)
정규 표현식은 임의 개수의 문자와 일치합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "(.*) Seattle" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
위의 쿼리는 다음과 같은 결과를 반환합니다:
{ "title" : "Sleepless in Seattle" } { "title" : "Battle in Seattle" }
다음 예시에서는 정규 표현식 [0-9]{2} (.){4}s
을(를) 사용하여 두 자리 숫자로 시작하고 공백이 뒤따르고, s
로 끝나는 다섯 자로 끝나는 영화 제목을 찾습니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "[0-9]{2} (.){4}s" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
위의 쿼리는 다음과 같은 결과를 반환합니다:
{ "title" : "20 Dates" } { "title" : "25 Watts" } { "title" : "21 Grams" } { "title" : "13 Lakes" } { "title" : "18 Meals" } { "title" : "17 Girls" } { "title" : "16 Acres" } { "title" : "26 Years" } { "title" : "99 Homes" } { "title" : "45 Years" }