MySQL의 InnoDB의 일본어 전문 검색 인덱스를 시도합니다. (위에서부터 순서대로 SQL만 붙입니다.)

GMO씨의 이쪽 기사를 시도한 뒤 데이터를 조금 더 추가한 것이다.
https://techblog.gmo-ap.jp/2020/01/06/mysql-innodb-fulltext-search-tuto/
전체 텍스트 검색
긴 문장에 있는 단어의 출현 횟수 목록을 준비하면 SQL의like문보다 유연한 문서를 빠르게 검색할 수 있다.현실적인 용도로 구글 등 검색엔진은 아마존에서 무엇을 검색하든 상품명부터 해설문까지 일치해 한순간에 결과를 한눈에 볼 수 있고, 맥의 파일과 애플리케이션의 스포트라이트 검색과 CLI 버전의 mdfind 명령도 비슷한 구조를 갖고 있다.
기존에는 마이SQL에서 전용 제품을 조합해 엘라스틱서치 등 다른 제품에서 많이 사용했는데, 2015년에는 마이SQL5였다.7부터 표준 일본어 전문 검색을 시작합니다.
실패하다
문장을 분해하고 단어 하나하나의 출현 횟수 목록(Index=서명)을 작성하며, 본문 대신 이 색인을 묻고, 일반적인like문 등 모든 텍스트를 직접 찾는 방법보다 원하는 문서를 더 빠르고 유연하게 찾아 중요한 순서대로 표시한다.
등록 시 시간을 들여 색인화하고 정리하면 상담의 호응을 가속화할 수 있기 때문에 업데이트되지 않은 대량의 데이터(50년간의 뉴스 보도, 100년의 재판 사례),업데이트되었지만 더 많은 상담을 위한 서비스(수억 사이트의 웹 검색 엔진을 처리하고 사이트 200만 명의 프로필 검색을 일치시킨다).
일본어와 영어
단어가 나오는 리스트를 만들 때 영어 등 단어를 공백으로 구분하는 언어로 리스트를 만드는 것은 간단하고, 일본어와 중국어는 단어 구분자 없이 공들여 기계적으로 몇 개의 문자로 리스트를 작성해야 하는 N-gram단어사전과 문법을 준비한 토대에서 목록화된 형태소 해석(문장을 최소 요소로 분해) 등의 기법이 있다.
역사.
2000년께 구글 등 검색엔진 주변의 수요로 개발된 원천개발이 꾸준히 추진되면서 일라스틱사의 일라스틱 서치 등을 상용화하는 형태로 선보였고, 마이SQL도 일본어 전체 검색이 가능하도록 리모델링(광설의 미래 검색 브라질사), 2015년 마이SQL5를 진행했다.7에서 일본어 전문을 정식으로 검색했다.
InnoDB 테이블 만들기
MySQL에서 일본어 전체 텍스트 검색이 가능한 스토리지 엔진은 이노DB입니다.
TEXT형 바디(본문) 열에 일본어 전문 검색을 추가합니다.
전체 텍스트 검색의 구조는 인덱스이기 때문에 열의 데이터 형식은 VARCHAR이든 TEXT든 모두 가능합니다.
CREATE TABLE full_text_test (
  id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
  body TEXT
) ENGINE=InnoDB CHARACTER SET utf8mb4;
데이터를 만들다
도쿄, 오사카, 교토 등의 단어를 한 번 등록하거나 대량으로 사용한 글.
INSERT INTO full_text_test (body) VALUES
  ('東京都で遊ぶ'),
  ('京都で遊ぶ'),
  ('大阪で遊ぶ'),
  ('京都と大阪で遊ぶ'),
  ('東京都で働く'),
  ('京都で働く'),
  ('大阪で働く'),
  ('京都と大阪で働く'),
  ('京都と大阪で遊ぶけど、やっぱり京都が好きで5回京都に行ったし京都に住んだこともあるし、働いたこともある'),
  ('東京都で遊ぶといえば、東京駅から初めて東京都庁をめぐり・・・。'),
 ('大阪大好き! 大阪大阪大阪大阪大阪大阪大阪大阪!! 大阪大阪大阪大阪大阪大阪大阪大阪!!'),
 ('東京大好き! 東京東京東京東京東京東京東京!! 東京東京東京東京東京東京東京!!'),
 ('東京大好き! 東京東京東京東京東京東京東京!! 遊びまくる、遊ぶ遊ぶ遊ぶ遊ぶ遊ぶ!'),
 ('東京大好き! 東京東京東京東京東京東京東京!! 働きまくる! 働く働く働く働く働く働く!');
전체 텍스트 붙여넣기(전체 텍스트 검색) 인덱스
n-gram 방식의 인덱스를 바디열에 추가합니다.
ALTER TABLE full_text_test 
ADD FULLTEXT INDEX ngram_idx (body) WITH PARSER ngram;
꺼내봐. boolean mode.
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('東京' IN BOOLEAN MODE); // 東京と関係が深い順
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('大阪' IN BOOLEAN MODE); // 大阪と関係が深い順
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('京都' IN BOOLEAN MODE); // 京都と関係が深い順
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('労働' IN BOOLEAN MODE); // 労働と関係が深い順
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('+東京 都庁 '  IN BOOLEAN MODE); // 東京があって、都庁もあればなお良い

SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('+京都 -東京' IN BOOLEAN MODE); // 京都があって東京がないものを重要度順に
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('+京都 +大阪 -東京' IN BOOLEAN MODE);
SELECT * FROM full_text_test WHERE MATCH (body) 
AGAINST ('+京都 大阪 -東京' IN BOOLEAN MODE);

좋은 웹페이지 즐겨찾기