mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/04/26 ~ 2023/05/10 #51

Open mojh7 opened 1 year ago

mojh7 commented 1 year ago

다음 스터디

~2023-05-09 pm 09:20 화요일~ 2023-05-10 pm 09:20 목요일

정리 범위

  1. 12.1.2 ~ 12.1.2.2
  2. 12.1.2.3 ~ 12.1.3
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 장현
  2. 단비
danbi5228 commented 1 year ago

12.1.2.3 검색어 확장 (QUERY EXPANSION)

12.1.3 전문 검색 인덱스 디버깅

mojh7 commented 1 year ago

12.1.2 전문 검색 쿼리 모드

MySQL 서버의 전문 검색 쿼리

MySQL 서버에서 자연어 검색 모드와 함께 사용할 수 있는 검색어 확장 기능도 지원한다


12.1.1.1 자연어 검색

검색어에 제시된 단어들을 많이 가지고 있는 순서대로 정렬해서 결과를 반환한다

전문 검색 쿼리의 검색어에는 단일 단어외에도 자연어의 문장을 그대로 사용할 수 있다

문장을 그대로 검색어로 사용하는 형태를 메뉴얼에서는 Phrase Search 라고 한다

SELECT id, title, body
    MATCH(title, body) AGAINST ('MySQL manual is true guide' IN NATURAL LANGUAGE MODE) AS score
    FROM tb_bi_gram
    WHERE MATCH(title, body) AGAINST ('MySQL manual is true guide' IN NATURAL LANGUAGE MODE); 

문장이 검색어로 사용되면

검색어 사용된 단어의 일부만 포함하는 결과도 가져온다

"."이나 "," 등과 같은 문장 기호는 모두 무시됨


12.1.2.2 boolean 검색

자연어 검색은 단순히 검색어에 포함된 단어들이 존재하는 결과만 가져오는데

불리언 검색은 쿼리에 사용되는 검색어의 존재 여부에 대해 논리적 연산이 가능하다

SELECT id, title, body
    MATCH(title, body) AGAINST ('+MySQL -manual' IN BOOLEAN MODE) AS score FROM tb_bi_gram
WHERE MATCH(title, body) AGAINST ('+MySQL -manual' IN BOOLEAN MODE);

MySQL를 포함하지만 manual은 포함하지 않는 레코드를 검색하는 쿼리이다

"+" 표시를 가진 검색 단어는 전문 검색 인덱스 칼럼에 존재해야 하며 "-"는 포함돼 있지 않아야 한다

222p 아래 예제를 보면 '+MySQL +manual' 두 단어를 모두 포함하는 레코드만 검색하는 쿼리를 보면 결과가 1건만 반환됐다

불리언 검색에서 쌍따옴표로 묶인 구는 마치 하나의 단어처럼 취급되어 처리된다


불리언 검색에서 불리언 연산자("+", "-" 등)를 전혀 사용하지 않으면 검색어에 포함된 단어 중 아무거나 하나라도 있으면 일치하는 것으로 판단

불리언 연산자를 전혀 사용하지 않을 때 자연어 검색과 흡사하게 작동하지만 서로 다른 방식으로 일치율을 계산하는 차이점이 있다


주의

불리언 검색에서 와일드 카드 문자를 이용해서 패턴 검색 적용할 수도 있다

'sour*' 으로 검색하면 MySQL is best open source dbms 반환

하지만 n-gram 인덱스에 대한 불리언 검색에서 와일드카드가 아무런 효과가 없다

'sour' 로 검색해도 위에 결과와 똑같이 반환

이미 n-gram 전문 검색 인덱스의 경우 단어의 일부만 검색하는 기능을 지원하기 때문에 와일드카드 문자를 이용한 패턴 검색 기능이 필요치 않다


다른 연산자들

http://www.innodbcluster.com/?depth=120902