전체 텍스트 Regex 쿼리에 Atlas Search 사용
이 페이지의 내용
쿼리가 비효율적인 정규식 일치에 의존하는 경우 $search 집계 파이프라인 단계로 Atlas Search 쿼리를 생성하고 실행하여 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션이 있는 텍스트 쿼리의 성능을 개선하세요.
비효율적인 정규식 일치 피하기
대소문자를 구분하지 않는 정규식 쿼리를 자주 실행하는 경우(i
옵션 활용), $search 집계 파이프라인 단계를 사용하는 Atlas Search 쿼리를 사용하는 것을 권장합니다.
인덱스에 데이터 정렬 을 지정하여 대소문자 및 악센트 표시 규칙과 같은 string 비교를 위한 언어별 규칙을 정의할 수 있습니다. 그러나 데이터 정렬 은 Atlas Search 쿼리 에 비해 일부 기능 손실을 일으킬 수 있습니다. Atlas Search가 아닌 환경에서 대소문자를 구분하지 않는 인덱스는 정규식 쿼리의 성능을 향상시키지 않습니다. $regex
쿼리 연산자는 데이터 정렬을 인식하지 못하며 대소문자를 구분하지 않는 인덱스를 효과적으로 사용할 수 없습니다. Atlas Search 인덱스 는 대소문자 구분 쿼리의 성능을 크게 향상시키고 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션을 제공합니다.
예시
다음 문서가 포함된 employees
컬렉션을 생각해 보세요. 이 컬렉션에는 기본 _id
인덱스 외에 인덱스가 없습니다:
// employees collection { "_id": 1, "first_name": "Hannah", "last_name": "Simmons", "dept": "Engineering" }, { "_id": 2, "first_name": "Michael", "last_name": "Hughes", "dept": "Security" }, { "_id": 3, "first_name": "Wendy", "last_name": "Crawford", "dept": "Human Resources" }, { "_id": 4, "first_name": "MICHAEL", "last_name": "FLORES", "dept": "Sales" }
애플리케이션에서 first_name
필드를 자주 쿼리하는 경우 대소문자를 구분하지 않는 정규식 쿼리를 실행하여 일치하는 이름을 더 쉽게 찾을 수 있습니다. 대소문자를 구분하지 않는 정규식은 위의 예에서 first_names
에 대해 'Michael'과 'MICHAEL'이 모두 포함된 경우와 같이 서로 다른 데이터 형식도 일치시킵니다. 하지만 $search 집계 파이프라인 단계를 사용하는 Atlas Search 쿼리를 권장합니다.
사용자가 문자열 'michael'을 검색하면 애플리케이션은 다음 쿼리를 실행할 수 있습니다.
db.employees.find( { first_name: { $regex: /michael/i } } )
이 쿼리는 $regex 옵션 i
를 지정하므로 대소문자를 구분하지 않습니다. 이 쿼리는 다음 문서를 반환합니다.
{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" } { "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }
이 쿼리는 예상 문서를 반환하지만 인덱스를 지원하지 않고 대소문자를 구분하지 않는 정규식 쿼리는 성능이 그다지 좋지 않습니다. 성능을 향상하려면 Atlas Search 인덱스를 다음과 같이 생성하세요.
{ "mappings": { "dynamic": true } }
데이터 정렬로 인해 일부 기능이 손실될 수 있습니다. 인덱스 collation
문서의 strength
필드가 1
또는 2
인 경우 인덱스는 대소문자를 구분하지 않습니다. 데이터 정렬 문서와 다양한 strength
값에 대한 자세한 설명은 데이터 정렬 문서를 참조하세요.
애플리케이션에서 대소문자를 구분하지 않는 인덱스를 사용하려면 정규식 쿼리에서 인덱스와 동일한 데이터 정렬 문서를 지정해야 합니다. 이전 find()
메서드에서 $regex
연산자를 제거하고 새로 만든 인덱스를 사용할 수 있지만, $search 집계 파이프라인 단계를 사용하는 Atlas Search 쿼리를 사용하는 것이 좋습니다.
대소문자를 구분하지 않는 쿼리 | Atlas Search 쿼리 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
중요
쿼리에 대소문자를 구분하지 않는 인덱스를 사용할 때는 $regex 연산자를 사용하지 마세요. $regex
구현은 데이터 정렬을 인식하지 못하며 대소문자 구분 없는 인덱스를 사용할 수 없습니다. 대신 $search 집계 파이프라인 단계를 사용하는 Atlas Search 쿼리를 추천합니다.
자세히 알아보기
Atlas Search 쿼리에 대해 자세히 알아보려면 Atlas Search 쿼리 만들기 및 실행을 참조하세요.
대소문자를 구분하지 않는 인덱스에 대해 더욱 자세히 알아보려면 대소문자를 구분하지 않는 인덱스를 참조하세요.
MongoDB의 정규식 쿼리에 대해 자세히 알아보려면 $regex를 참조하세요.
MongoDB University는 MongoDB 성능 최적화에 대한 무료 과정을 제공합니다. 자세한 내용은 모니터링 및 인사이트를 참조하세요.