Database/MongoDB 실습

[MongoDB] 전문검색 인덱스 사용법과 주의사항

꽁담 2024. 8. 6. 14:46

1. MongoDB 전문검색 인덱스

MongoDB 인덱스에서 전문검색 인덱스는 문자열을 빠르게 검색해 주는 방법이다.

형태소 분석방식과 N-Gram 알고리즘 방식이 있다.

 

2. MongoDB 테스트 버전

유형 버전 구성
mongosh 2.2.10  
mongodb 7.0.12 Config : 1개, 포트 20000
Route : 1개, 포트 20001
Shard1 : 1개, 포트 30001
Shard2 : 1개, 포트 40001

 

 

3. MongoDB 테스트 데이터 적재

인덱스 생성 시 text 옵션을 주면 전문검색 인덱스로 생성된다.

[direct: mongos] indexDB> db.wordCollection.insert( { contents : "Mozi Blog is one of Tech Blogs" } )
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66b1b515eba581d9fa1b1580') }
}

[direct: mongos] indexDB> db.wordCollection.insert( { contents : "Mozi 블로그는 기술 블로그중 하나입니다." } )
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66b1b521eba581d9fa1b1581') }
}

[direct: mongos] indexDB> db.wordCollection.createIndex ( { contents : "text" } )
contents_text

 

 

4. 전문검색 인덱스 테스트

4-1. 전문검색 인덱스 조회

전문검색 시에는 find 에서 필드명을 사용하지 않는다.

$text 와 $search 를 사용한다.

[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "Mozi" } } )
[
  {
    _id: ObjectId('66b1b521eba581d9fa1b1581'),
    contents: 'Mozi 블로그는 기술 블로그중 하나입니다.'
  },
  {
    _id: ObjectId('66b1b515eba581d9fa1b1580'),
    contents: 'Mozi Blog is one of Tech Blogs'
  }
]

 

4-2. 전문검색 인덱스 조회 불가경우

그런데 조회가 되지 않는경우도 있다.

기 ,블로그 ,on 등 일부 단어로만 검색시에는 조회가 되지 않는다는 점이다.

[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "기" } } )

[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "기술" } } )
[
  {
    _id: ObjectId('66b1b521eba581d9fa1b1581'),
    contents: 'Mozi 블로그는 기술 블로그중 하나입니다.'
  }
]


[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "블로그" } } )

[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "블로그중" } } )
[
  {
    _id: ObjectId('66b1b521eba581d9fa1b1581'),
    contents: 'Mozi 블로그는 기술 블로그중 하나입니다.'
  }
]


[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "on" } } )

[direct: mongos] indexDB> db.wordCollection.find ( { $text : { $search : "one" } } )
[
  {
    _id: ObjectId('66b1b515eba581d9fa1b1580'),
    contents: 'Mozi Blog is one of Tech Blogs'
  }
]

 

이는 텍스트를 인덱스로 만들 때, 문자열 파싱을 어떻게 하냐에 따라 달라지기 때문이다.

 

5. 전문검색 인덱스 생성 옵션

5-1. 컬렉션에 전문검색 인덱스를 설정하는 방법

컬렉션에 전문검색을 설정하고 싶을 때는 필드부분에 $** 를 작성한다.

참고로 기존에 전문검색 인덱스가 있다면 생성이 불가능하다.

[direct: mongos] indexDB> db.wordCollection.createIndex ( { "$**" : "text" } )
$**_text

 

5-2. 전문검색 중요도 할당

전문검색 시 중요도를 이용하여 정렬할 수 있다.

중요도는 weights 를 사용하며 숫자값이 낮을수록 중요도가 높다.

참고로 기존에 전문검색 인덱스가 있다면 생성이 불가능하다.

[direct: mongos] indexDB> db.wordCollection.createIndex ( { contents : "text" }, { weights: { contents : 1 } } )
contents_text