Amazon DocumentDB를 사용하여 텍스트 검색 수행
Amazon DocumentDB의 기본 전체 텍스트 검색 기능을 사용하면 특수 목적 텍스트 인덱스를 사용하여 대규모 텍스트 데이터 세트에서 텍스트 검색을 수행할 수 있습니다. 이 섹션에서는 텍스트 인덱스 기능의 기능을 설명하고 Amazon DocumentDB에서 텍스트 인덱스를 생성하고 사용하는 방법에 대한 단계를 제공합니다. 텍스트 검색 제한 사항도 나열됩니다.
지원되는 기능
Amazon DocumentDB 텍스트 검색은 다음 MongoDB API 호환 기능을 지원합니다.
단일 필드에 텍스트 인덱스를 생성합니다.
둘 이상의 텍스트 필드가 포함된 복합 텍스트 인덱스를 생성합니다.
단일 단어 또는 다중 단어 검색을 수행합니다.
가중치를 사용하여 검색 결과를 제어합니다.
점수별로 검색 결과를 정렬합니다.
집계 파이프라인에서 텍스트 인덱스를 사용합니다.
정확한 구문을 검색합니다.
Amazon DocumentDB 텍스트 인덱스 사용
문자열 데이터가 포함된 필드에 텍스트 인덱스를 생성하려면 다음과 같이 문자열 ‘텍스트’를 지정합니다.
단일 필드 인덱스:
db.test.createIndex({"comments": "text"})
이 인덱스는 지정된 컬렉션의 '의견' 문자열 필드에서 텍스트 검색 쿼리를 지원합니다.
둘 이상의 문자열 필드에 복합 텍스트 인덱스 생성:
db.test.createIndex({"comments": "text", "title":"text"})
이 인덱스는 지정된 컬렉션의 '의견' 및 '제목' 문자열 필드에서 텍스트 검색 쿼리를 지원합니다. 복합 텍스트 인덱스를 생성할 때 최대 30개의 필드를 지정할 수 있습니다. 생성된 텍스트 검색 쿼리는 모든 인덱싱된 필드를 쿼리합니다.
참고
각 컬렉션에는 하나의 텍스트 인덱스만 허용됩니다.
Amazon DocumentDB 컬렉션에 텍스트 인덱스 나열
아래 예제와 같이 컬렉션에서 getIndexes()
를 사용하여 텍스트 인덱스를 포함한 인덱스를 식별하고 설명할 수 있습니다.
rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]
색인을 생성한 후에는 Amazon DocumentDB 컬렉션에 데이터 삽입을 시작합니다.
db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])
텍스트 검색 쿼리 실행
단일 단어 텍스트 검색 쿼리 실행
$text
및 $search
연산자를 사용하여 텍스트 검색을 수행해야 합니다. 다음 예제에서는 텍스트 인덱싱된 필드에 문자열 “apple” 또는 “apples”와 같이 다른 형식의 “apple”이 포함된 모든 문서를 반환합니다.
db.test.find({$text: {$search: "apple"}})
출력:
이 명령의 출력은 다음과 같이 표시됩니다.
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
다중 단어 텍스트 검색 실행
Amazon DocumentDB 데이터에 대해 다중 단어 텍스트 검색을 수행할 수도 있습니다. 아래 명령은 “apple” 또는 “pie”가 포함된 텍스트 인덱싱 필드가 있는 문서를 반환합니다.
db.test.find({$text: {$search: "apple pie"}})
출력:
이 명령의 출력은 다음과 같이 표시됩니다.
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
다중 단어 구문 텍스트 검색 실행
다중 단어 구문 검색의 경우 다음 예제를 사용합니다.
db.test.find({$text: {$search: "\"apple pie\""}})
출력:
위 명령은 정확한 문구 “apple pie”가 포함된 텍스트 인덱싱 필드가 있는 문서를 반환합니다. 이 명령의 출력은 다음과 같이 표시됩니다.
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
필터로 텍스트 검색 실행
텍스트 검색을 다른 쿼리 연산자와 결합하여 추가 기준에 따라 결과를 필터링할 수도 있습니다.
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})
출력:
위 명령은 모든 형태의 ‘interest’와 5와 동일한 ‘star_rating’이 포함된 텍스트 인덱싱 필드가 있는 문서를 반환합니다. 이 명령의 출력은 다음과 같이 표시됩니다.
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
{ "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }
텍스트 검색에서 반환되는 문서 수 한도
limit
를 사용하여 반환되는 문서 수를 제한하도록 선택할 수 있습니다.
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)
출력:
위 명령은 필터를 충족하는 결과 하나를 반환합니다.
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
텍스트 점수로 결과 정렬
다음 예제에서는 텍스트 검색 결과를 텍스트 점수별로 정렬합니다.
db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})
출력:
위 명령은 “apple” 또는 “apple”이 포함된 텍스트 인덱싱 필드가 포함된 문서를 “apples”와 같은 다른 형식으로 반환하고 문서가 검색어와 얼마나 관련이 있는지에 따라 결과를 정렬합니다. 이 명령의 출력은 다음과 같이 표시됩니다.
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }
$text
및 $search
는 aggregate
, count
, findAndModify
, update
및 delete
명령에도 지원됩니다.
집계 연산자
$match
를 사용한 집계 파이프라인
db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )
출력:
위의 명령은 다음 결과를 반환합니다.
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apple - a healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
다른 집계 연산자의 조합
db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )
출력:
위의 명령은 다음 결과를 반환합니다.
{ "_id" : 4, "score" : 0.6079270860936958 }
{ "_id" : 1, "score" : 0.3039635430468479 }
{ "_id" : 2, "score" : 0.3039635430468479 }
{ "_id" : 3, "score" : 0.3039635430468479 }
텍스트 인덱스를 생성할 때 여러 필드 지정
복합 텍스트 인덱스에서 최대 3개의 필드에 가중치를 할당할 수 있습니다. 텍스트 인덱스의 필드에 할당된 기본 가중치는 일(1)입니다. 가중치는 선택적 파라미터이며 1~100,000 범위여야 합니다.
db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )
MongoDB와의 차이점
Amazon DocumentDB의 텍스트 인덱스 기능은 용어-주파수 알고리즘과 함께 반전된 인덱스를 사용합니다. 텍스트 인덱스는 기본적으로 희소입니다. 구문 분석 로직, 토큰화 구분 기호 등의 차이로 인해 MongoDB와 동일한 결과 세트가 동일한 데이터 세트 또는 쿼리 모양에 대해 반환되지 않을 수 있습니다.
Amazon DocumentDB 텍스트 인덱스와 MongoDB에는 다음과 같은 추가 차이점이 있습니다.
텍스트가 아닌 인덱스를 사용하는 복합 인덱스는 지원되지 않습니다.
Amazon DocumentDB 텍스트 인덱스는 대/소문자를 구분하지 않고 발음 부호를 구분하지 않습니다.
텍스트 인덱스에서는 영어만 지원됩니다.
배열(또는 다중 키) 필드의 텍스트 인덱싱은 지원되지 않습니다. 예를 들어 문서 {“a”:[“apple”, “pie”]}로 “a“에 텍스트 인덱스를 생성하면 실패합니다.
와일드카드 텍스트 인덱싱은 지원되지 않습니다.
고유한 텍스트 인덱스는 지원되지 않습니다.
용어 제외는 지원되지 않습니다.
모범 사례 및 지침
텍스트 점수별 정렬과 관련된 텍스트 검색 쿼리의 성능을 최적화하려면 데이터를 로드하기 전에 텍스트 인덱스를 생성하는 것이 좋습니다.
텍스트 인덱스에는 인덱싱된 데이터의 최적화된 내부 복사본을 위한 추가 스토리지가 필요합니다. 이로 인해 추가 비용이 발생합니다.
제한 사항
Amazon DocumentDB 에서 텍스트 검색에는 다음과 같은 제한이 있습니다.
텍스트 검색은 Amazon DocumentDB 5.0 인스턴스 기반 클러스터에서만 지원됩니다.