쿼리가 정규식 일치에 의존하는 경우 MongoDB Search 인덱스 생성하고 $search 집계 파이프라인 단계 실행 쿼리 의 성능과 효율성 개선할 수 있습니다. $regex 는 항상 인덱스를 사용할 수는 없기 때문에 비효율적인 반면, MongoDB Search 인덱스 는 쿼리 성능을 크게 향상시키고 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션을 제공합니다.
이 페이지에서는 $regex 사용 사례에 대한 몇 가지 일반적인 MongoDB Search 인덱스 및 쿼리 구성에 대해 설명합니다.
예시
이 예제에서는 sample_mflix.movies 네임스페이스 사용합니다. 샘플 쿼리를 실행 하려면 이 컬렉션 클러스터 에 추가 하거나 MongoDB Search 플레이그라운드에서 사전 구성된 스냅샷을 사용하세요. 샘플 쿼리는 다음 $regex 사용 사례에서 대신 를 사용하는 방법을 보여줍니다.$search
애플리케이션 에서 문자 또는 접두사 설정하다 로 시작하는 string 값을 자주 쿼리하는 경우 string 값의 시작부터 검색하는 $regex 옵션 ^와 대소문자를 구분하는 i를 사용할 수 있습니다. 둔감합니다.
대신 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다. 다음 쿼리는 접두사 back로 시작하는 영화 제목을 검색 .
➤ MongoDB Search 플레이그라운드에서 시도해 보세요.
$regex 쿼리 | $search 쿼리 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
이 $search 쿼리 실행 하려면 다음과 유사한 MongoDB Search 인덱스 만듭니다.
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "string", "analyzer": "autocomplete-search", "searchAnalyzer": "lucene.standard" } ] } }, "analyzers": [ { "name": "autocomplete-search", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "edgeGram", "minGram": 4, "maxGram": 10 } ] } ] }
이 인덱스 정의는 movies 컬렉션 의 title 필드 인덱싱된 필드에는 autocomplete-search 사용자 지정 분석기 사용하고 쿼리에는 lucene.standard 분석기 사용하는 string 유형으로 인덱싱합니다. 사용자 지정 분석기 autocomplete-search 를 인덱싱된 필드의 경우 analyzer 로, lucene.standard 을 쿼리의 경우 searchAnalyzer 로 명명했습니다. 사용자 지정 분석기
lowercase대소문자를 구분하지 않는 쿼리를 지원 하기 위해 모든 문자를 소문자로 변환하는 토큰 필터하는edgeGram필터를 사용하여4~10자 길이의 토큰 생성
참고
이 사용자 지정 분석기 최대 10자 길이의 단어만 지원합니다. 단어와 쿼리가 10자를 초과해야 하는 경우 maxGram 값을 늘리세요. maxGram 값을 15보다 높게 설정하면 인덱스 크기가 커지고 성능 및 가용성에 영향 수 있으므로 값을 15보다 높게 설정하지 않는 것이 좋습니다.
애플리케이션 에서 필드 어느 곳에나 있는 문자열을 자주 쿼리하는 경우 $regex 쿼리를 실행 모든 문서 확인하고 특정 순서 없이 일치하는 모든 항목을 반환할 수 있습니다.
대신 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다. 다음 쿼리는 title 필드 에 park 라는 텀 포함된 영화 제목을 검색 .
➤ MongoDB Search 플레이그라운드에서 시도해 보세요.
$regex 쿼리 | $search 쿼리 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
이 $search 쿼리 실행 하려면 다음 정의를 사용하여 MongoDB Search 인덱스 만듭니다.
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "contains", "searchAnalyzer": "lucene.standard" } } }, "analyzers": [ { "name": "contains", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "reverse" }, { "type": "edgeGram", "minGram": 4, "maxGram": 15 }, { "type": "reverse" } ] } ] }
이 인덱스 정의는 다음을 적용하는 contains 이라는 사용자 지정 분석기 사용하여 movies 컬렉션 의 title 필드 string 유형으로 인덱싱합니다.
standard토크나이저 사용하여 단어를 공백이나 구두점으로 분할 .lowercase토큰 필터하다 사용하여 문자를 소문자로 변환하여 대소문자를 구분하지 않는 쿼리를 지원 .reverse토큰 필터 (두 번)를 사용하여 단어를 반전시켜 효율적인 앵커되지 않은 쿼리를 지원하다.edgeGram토큰 필터를 사용하여 4~15자 길이의 토큰을 생성합니다.
참고
이 사용자 지정 분석기 최대 15자 길이의 단어만 지원합니다. 15자를 초과하는 단어가 있는 경우 maxGram 값을 늘립니다. maxGram 값을 15보다 높게 설정하면 인덱스 크기가 늘어나고 성능 및 가용성에 영향 수 있으므로 값을 15보다 높게 설정하다 하지 않는 것이 좋습니다.
애플리케이션 에서 문자 또는 접미사 설정하다 로 끝나는 문자열 필드 값을 자주 쿼리하는 경우 $regex 옵션 $ 및 옵션 i을 사용하여 정규식 쿼리를 실행 수 있습니다. 대소문자를 구분하지 않습니다.
대신 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다. 다음 쿼리는 ring라는 텀 로 끝나는 영화 제목을 검색 .
➤ MongoDB Search 플레이그라운드에서 시도해 보세요.
$regex 쿼리 | $search 쿼리 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
이 $search 쿼리 실행 하려면 다음과 유사한 MongoDB Search 인덱스 만듭니다.
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "autocomplete", "minGrams": 4, "maxGrams": 10, "analyzer": "lucene.keyword", "tokenization": "rightEdgeGram" } ] } } }
이 인덱스 정의는 다음을 사용하여 title 필드 인덱싱합니다.
rightEdgeGram토큰화 전략을 사용하여 텍스트를 4 (최소)~ 10 (최대)자 길이의 하위 문자열 또는 "그램"으로 분할autocomplete유형으로, 다음 끝에서 시작하는 부분 검색을 지원합니다. 문자열.lucene.keyword분석기 하여 중간 단어의 끝이 아닌 텍스트 끝에서만 일치하는지 확인합니다. 중간 단어에서 일치하는 접미사를 찾으려면lucene.standard을 사용합니다.
자세히 알아보기
MongoDB Search 쿼리에 대해 자세히 학습하려면 쿼리 및 인덱스를 참조하세요.
MongoDB의 정규식 쿼리에 대해 자세히 알아보려면 $regex를 참조하세요.
MongoDB University는 MongoDB 성능 최적화에 대한 무료 과정을 제공합니다. 자세한 내용은 모니터링 및 인사이트를 참조하세요.