evergreen96
317
2021-04-30 01:56:42 작성 2021-04-30 02:06:30 수정됨
6
189

띄어쓰기및 글자별 DB검색 효율성 질문


DB검색을 할 때 사용자의 입력이 다양하다는 것을 전제로 해서 입력을 그대로 검색에 사용하는 것은 좋지 않은 것 같더라구요 그래서 구글 검색을 해보니 띄어쓰기를 삭제하고 검색하는 방법을 사용하시는 것 같은데 그것도 완벽하다고 생각들지 않더라구요

예를 들어 '컴퓨터공학개론' 이라는 값이 DB에 저장되어 있고 사용자가 '컴퓨터개론'으로 검색하면 저 결과는 검색되지 않으니까요

그래서 한 글자 한글자 and조건으로 사용자가 입력한 문장의 글자들을 포함하는 것으로 query를 만들었는데 효율성이 걱정되더라구요 시간이 너무 오래걸리는 거는 아닐지 궁금한데 고수님들은 어떻게 생각하는지 궁금합니다.

물론 글자별로 검색하면 긴 문장의 경우 상관없는 결과도 나오겠지만 짧은 문장이라서 그럴 가능성이 적다고 한다면 괜찮을까요?

0
  • 답변 6

  • 캐티
    5k
    2021-04-30 02:45:49
    -1
  • 엡실론
    2k
    2021-04-30 02:48:07

    full text index를 찾아보시면 좋을 것 같네요.

    n-gram이나 형태소 분석을 쓸 수 있습니다.

  • aigo
    30
    2021-04-30 07:44:22

    사용하시는 언어나 환경을 모르겠지만 텍스트 검색엔 fuzzy search를 사용하시면 좋아요.

    예를들어 자바스크립트에선 fuse.js를 사용하여 효율적인 문자열 검색을 할 수 있습니다.

    "컴퓨터공학개론" 문자열을 검색한다고 가정 했을 때 LIKE '컴%' 으로 검색하시고

    결과에서 퍼지 서치를 적용하는 방법입니다.

    const queryText = "컴퓨터 공학개론"
    const results = sql.query(`
        SELECT * 
        FROM MAJOR 
        WHERE name LIKE "${queryText.charAt(0)}%"
    `)
    
    const fuse = new Fuse(results, {
      keys: ['name', 'subName']
    })
    
    fuse.search(queryText)


  • 카스마당
    1k
    2021-04-30 09:18:27 작성 2021-04-30 09:19:21 수정됨

    MariaDB(MySQL)의 경우 다른 DBMS 같겠지만 윗분들이 먼저 올리신 것처럼 FULLTEXT 내용 알아보시면

    될것 같고 만약 그정도로 큰 데이터를 검색하지 않고 간단한 게시물 정도면 

    정규 표현식으로 검색하기도 합니다.

    예를 들어 "컴퓨터공학" 또는 "컴퓨터 공학" 둘다 검색시는..

    WHERE REGEXP '컴퓨터[[:space:]]?공학';
    WHERE RLIKE  '컴퓨터 ?공학';

    하시면 편하겠네요.~

  • evergreen96
    317
    2021-04-30 11:09:59
    감사합니다. 공부해보겠습니다.
  • 309
    2021-04-30 14:03:27 작성 2021-04-30 14:06:50 수정됨

    검색 단어 갯수가 많을수록 속도는 느리겠지만 쉬운 방법으로는 like 조건으로 단어갯수만큼 조회 가능하겠습니다.

    동해물과 백두산이 마르고 닳도록

    where 1=1

    and text like '%동해물과%'

    and text like '%백두산이%'

    and text like '%마르고%'

    and text like '%닳도록%'

  • 로그인을 하시면 답변을 등록할 수 있습니다.