Docs Menu
Docs Home
/
클러스터 모니터링
/

전체 텍스트 정규식 쿼리에 MongoDB Search 사용

쿼리가 비효율적인 정규식 일치에 의존하는 경우 집계 파이프라인 단계에서 $search MongoDB Search 쿼리 만들고 실행 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션이 있는 텍스트 쿼리의 성능을 개선합니다.

대소문자를 구분하지 않는 정규식 쿼리를 자주 실행 경우(i 옵션 활용), 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 사용하는 것이 좋습니다.

인덱스에 데이터 정렬 을 지정하여 대소문자 및 악센트 표시 규칙과 같은 문자열 비교를 위한 언어별 규칙을 정의할 수 있습니다. 그러나데이터 정렬은 MongoDB Search 쿼리에 비해 일부 기능 손실을 일으킬 수 있습니다. MongoDB Search 환경이 아닌 경우 대소문자를 구분하지 않는 인덱스는 정규식 쿼리의 성능을 향상시키지 않습니다. $regex 쿼리 연산자 데이터 정렬을 인식하지 못하며 사용 사례 수 없습니다. MongoDB 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 필드 자주 쿼리하는 경우 대소문자를 구분하지 않는 정규식 쿼리를 실행 일치하는 이름을 더 쉽게 찾을 수 있습니다. 대소문자를 구분하지 않는 정규식은 위의 예시 에서 'Michael'과 'MICHAEL'이 모두 first_names 인 경우와 같이 서로 다른 데이터 형식과도 일치합니다. 그러나 집계 파이프라인 단계를 $search 사용하는 MongoDB 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" }

이 쿼리 예상 문서를 반환하지만 인덱스 지원 하지 않고 대소문자를 구분하지 않는 정규식 쿼리는 성능이 그다지 좋지 않습니다. 성능을 개선하려면 MongoDB Search 인덱스 생성:합니다.

{
"mappings": {
"dynamic": true
}
}

데이터 정렬로 인해 일부 기능이 손실될 수 있습니다. 인덱스 collation 문서의 strength 필드가 1 또는 2인 경우 인덱스는 대소문자를 구분하지 않습니다. 데이터 정렬 문서와 다양한 strength 값에 대한 자세한 설명은 데이터 정렬 문서를 참조하세요.

애플리케이션 에서 대소문자를 구분하지 않는 인덱스 사용하려면 regex 쿼리 의 인덱스 에서 동일한 데이터 정렬 문서 지정해야 합니다. $regex 이전 메서드에서 연산자 제거 find() 하고 새로 생성된 인덱스 사용할 수 있지만 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리 사용하는 것이 좋습니다.

대소문자를 구분하지 않는 쿼리
MongoDB 검색 쿼리
db.employees.find( { first_name: "michael" } ).collation( { locale: 'en', strength: 2 } )
db.employees.aggregate([
{
$search: {
"index": "default",
"text": {
"path": "first_name",
"query": "michael"
}
}
}
])

중요

쿼리 에 대소문자를 구분하지 않는 인덱스 사용할 때는 $regex 연산자 사용하지 마세요. $regex 구현 데이터 정렬을 인식하지 못하며 대소문자를 구분하지 않는 인덱스를 사용할 수 없습니다. 대신 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다.

이 페이지의 내용