Database

MongoDB - 기본 쿼리/인덱스

foxlee 2022. 3. 2. 16:00
  • 특허 검색 API를 개발할때 특허 데이터는 MongoDB에 저장하였다. 처음 의도는 특허의 명칭, 요약, 청구항별로 각각 검색할 수 있는 기능을 개발하려 했으나(각각 필드 검색의 경우 전문 검색 인덱스를 활용하지 못함), MongoDB는 인덱스로 설정한 필드들을 대상으로 $text: $search: keyword 방식으로 검색한다. 즉, 여러 필드들로 같이 설정한 인덱스의 경우 그 필드들 중에서 특정 필드를 선택할 수 없다. (참고)

 

공홈

 

쿼리시 db.collection.find(query, projection) // query = {조건}, projection = 다큐먼트를 조회할 때 보여질 field(field:0,field:1) 1인 값인 필드 리턴

 

Exact Phrase

  • 문자열 검색에 사용된 조건에 해당하는 문자열을 정확하게 일치하는 문서를 검색할 수도 있음
  • > db.stores.find( { $text: { $search: "\"keyword1 keyword2\"" } } )
  • 큰 따옴표로 검색 조건의 문자열을 묶으면 대소구분없이 "keyword1 keyword2"과 정확히 일치하는 문서만 결과값에 포함시킴

Term Exclustion

  • "-"연산자를 사용하여 검색에 제외할 텀을 지정 가능
  • 밑의 명령은 keyword1 또는 keyword2을 포함하고 keyword3는 포함하지 않는 텍스트를 검색
  • > db.stores.find( { $text: { $search: "keyword1 keyword2 -keyword3" } } )

Sort

  • 몽고디비는 기본적으로 정렬되지 않은 검색 결과를 반환
  • 그러나 텍스트 검색 쿼리는 문서가 쿼리와 얼마나 잘 일치 하는지를 지정하는 각 문서에 대한 스코어를 계산하기 때문에 스코어링 기준으로 정렬이 가능
  • > db.stores.find({ $text: { $search: "keyword1 keyword2" } },{ score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } )
  • textScore 도큐먼트에 해당 단어가 표시된 횟수를 기반으로 도큐먼트간 관련성을 나타내는 숫자

and

  • 키워드마다 ""로 감싸주면 and로 처리
  • db.sites.find( { $text: { $search: '"keyword1" "keyword2"' } } )

or

  • 띄어쓰기가 or로 구분함
  • db.sites.find( { $text: { $search: 'keyword1 keyword2' } } )

weights

  • 가중치 적용 (기본적으로 발명의 명칭이 요악보다는 더 중요)
  • db.messages.createIndex({"$**":"text"}, {"weights": {title: 3, abstract: 1}}) 

인덱스 파티션

  • db.messages.createIndex( { "year":1, "title": "text", ....} ) // year을 기준으로 인덱스 파티셔닝 , query시 year 값을 반드시 추가해줘야함

알고리즘

  1. 형태소 분석 알고리즘
    • MongoDB의 전문 검색 인덱스는 불용어 처리, 형태소 분석 과정을 통해 색인 작업이 수행
      • 불용어(stop word) 처리
        • 유의미한 단어 토큰만을 선별하기 위해 큰 의미가 없는 단어 토큰을 제거
        • 조사, 접미사 같은 단어들은 문장에서는 자주 등장 하지만 실제 의미 분석을 하는데는 필요없는 경우가 많으며, 이러한 단어들을 불용어라고 부릅니다.
        • 불용어의 개수는 많지 않기 때문에 알고리즘을 구현한 코드에서 모두 상수로 정의해서 사용하는 경우가 많고, 유연성을 위해 불용어 자체를 데이터베이스화 해서 사용자가 추가하거나 삭제할 수 있게 구현
      • 형태소 분석
        • 형태소란 언어에 있어서 “최소 의미 단위”를 말합니다. 이 때 의미는 어휘적 의미와 문법적 의미를 모두 포함
        • 형태소 분석이란 형태소보다 단위가 큰 언어 단위인 어절, 혹은 문장을 최소 의미 단위인 형태소로 분절하는 과정
        • 형태소를 분석 형태소로 분석
  2. N-Gram 알고리즘
    • 입력한 문자열을 N개의 기준 단위로 절단
    • n개의 단어 뭉치 단위로 끊어서 이를 하나의 토큰으로 간주