Java for Web 학습 노트 (1, 2, 2): 검색 (4) MySQL 전체 텍스트 인덱스 (위)

전체 텍스트 인덱스
전체 텍스트 색인 은 색인 데이터 에 저 장 된 단어의 주파수 와 소재 기록 으로 빈도 가 높 을 수록 가중치 가 낮 으 며 일정한 계산 개 를 사용 하여 관련 성 평 점 (relevance score) 을 줍 니 다.MySQL 의 MyISAM 과 InnoDB 는 전체 텍스트 검색 을 지원 하지만 주의해 야 합 니 다.
  • InnoDB 는 버 전 5.6.4 에서 야 전체 텍스트 색인 을 제공 하기 시작 했다
  • 문법 은 같 지만 MyISAM 과 InnoDB 는 실현 과 알고리즘 이 다 릅 니 다. 이들 의 상관 성 평 점 은 비교 가능성 을 가지 지 않 습 니 다. 즉, InnoDB 표 의 상관 도 값 과 MyIASM 표 로 비교 하지 마 십시오.
  • MyISAM 은 543 개의 stopwords (단어 가 너무 많이 사용 되 어 색인 으로 사용 되 지 않 음) 가 있 고, InnoDB 는 36 개 이 며, MySQL 문 서 는 엔진 에 stopword 를 추가 하거나 삭제 하 라 는 명령 을 내 렸 고, Full Text search 의 설정 매개 변수 조정 방식 도 제시 했다.

  • SQL
    MYSQL 공식 문서 참조
    표 에 FULLTEXT KEY 설정
    --     
    ALTER TABLE TicketComment ADD FULLTEXT INDEX TicketComment_Search (Body);
    --       ,       ,           ,        
    ALTER TABLE Ticket ADD FULLTEXT INDEX Ticket_Search (Subject, Body);

    검색 한 sql 문장
    단어 검색
    mysql> SELECT * FROM `TicketComment` WHERE MATCH(`Body`) AGAINST('test');
    +-----------+----------+--------+-------------------+----------------------------+
    | CommentId | TicketId | UserId | Body              | DateCreated                |
    +-----------+----------+--------+-------------------+----------------------------+
    |         2 |        1 |      4 | Comment Two: test | 2018-03-07 15:40:22.631000 |
    |        12 |        1 |      4 | Test              | 2018-03-07 15:50:35.068000 |
    +-----------+----------+--------+-------------------+----------------------------+
    2 rows in set (0.04 sec)

    관련 값 보기
    mysql> SELECT *, MATCH(`Body`) AGAINST('test') AS score From TicketComment;
    +-----------+----------+--------+-------------------+----------------------------+--------------------+
    | CommentId | TicketId | UserId | Body              | DateCreated                | score              |
    +-----------+----------+--------+-------------------+----------------------------+--------------------+
    |         1 |        1 |      4 | my comment: Hello | 2018-03-07 15:40:00.719000 |                  0 |
    |         2 |        1 |      4 | Comment Two: test | 2018-03-07 15:40:22.631000 | 0.6055193543434143 |
    |         3 |        1 |      4 | Comment Three : 3 | 2018-03-07 15:40:51.588000 |                  0 |
    |         4 |        1 |      4 | Comment Four: 4   | 2018-03-07 15:41:00.622000 |                  0 |
    |         5 |        1 |      4 | Comment Five: 5   | 2018-03-07 15:41:09.777000 |                  0 |
    |         6 |        1 |      4 | Comment Six: 6    | 2018-03-07 15:41:16.899000 |                  0 |
    |         7 |        1 |      4 | Comment Serven: 7 | 2018-03-07 15:41:28.665000 |                  0 |
    |         8 |        1 |      4 | Comment  8        | 2018-03-07 15:41:37.733000 |                  0 |
    |         9 |        1 |      4 | Comment 9         | 2018-03-07 15:41:43.515000 |                  0 |
    |        10 |        1 |      4 | Comment 10        | 2018-03-07 15:41:51.349000 |                  0 |
    |        11 |        1 |      4 | Comment 11        | 2018-03-07 15:42:01.263000 |                  0 |
    |        12 |        1 |      4 | Test              | 2018-03-07 15:50:35.068000 | 0.6055193543434143 |
    +-----------+----------+--------+-------------------+----------------------------+--------------------+
    12 rows in set (0.01 sec)
    SELECT *, MATCH(`Body`) AGAINST('test Hello') AS score From TicketComment;
    #         ,                ,                (   join)
    SELECT *, (MATCH(`Body`) AGAINST('test')+ MATCH(`Body`) AGAINST('Hello')) AS score From TicketComment; 

    검색
    mysql> select * from TicketComment where match(`Body`) against('Five Six');
    +-----------+----------+--------+-----------------+----------------------------+
    | CommentId | TicketId | UserId | Body            | DateCreated                |
    +-----------+----------+--------+-----------------+----------------------------+
    |         5 |        1 |      4 | Comment Five: 5 | 2018-03-07 15:41:09.777000 |
    |         6 |        1 |      4 | Comment Six: 6  | 2018-03-07 15:41:16.899000 |
    +-----------+----------+--------+-----------------+----------------------------+
    2 rows in set (0.00 sec)

    테스트 결과 숫자 는 stopwords 에 속 하고 my 도 stopwords 에 속 합 니 다.
    연합 색인
    mysql> select * from Ticket where Match(`subject`,`Body`) against('hello');
    +----------+--------+---------+-----------------------------------+----------------------------+
    | TicketId | UserId | Subject | Body                              | DateCreated                |
    +----------+--------+---------+-----------------------------------+----------------------------+
    |        1 |      3 | hello   | This is the frist ticket created! | 2018-01-15 16:09:13.016000 |
    +----------+--------+---------+-----------------------------------+----------------------------+
    1 row in set (0.01 sec)

    boolean mode 사용 하기
    우 리 는 against 에서 boolean mode 를 사용 하면 논리 적 조합 을 얻 을 수 있 습 니 다. 예 를 들 어 어떤 것 으로 시작 해 야 하 는 지, 아니면 관 계 를 포함 하지 않 아야 합 니 다.사용 가능 한 기 호 는 ft 를 조회 할 수 있 습 니 다.boolean_syntax, 그 중 ft 는 fulltext 의 줄 임 말 입 니 다.
    mysql> SHOW VARIABLES LIKE 'ft%';
    +--------------------------+----------------+
    | Variable_name            | Value          |
    +--------------------------+----------------+
    | ft_boolean_syntax        | + ->
  • + 포함 해 야 함 을 표시 합 니 다.예 를 들 어 + apple 은 애플 이 있어 야 하고 애플 로 시작 해 야 한 다 는 뜻 입 니 다. 예 를 들 어 애플 123.
  • 공 은 함유 또는.예 를 들 어 애플 바 나 나 는 애플 이나 바 나 나 를 포함 하고 있다 는 뜻 이다
  • .
  • - 포함 할 수 없다 는 뜻 입 니 다.예 를 들 어 + apple - banana 는 apple 을 포함 하지만 banana
  • 를 포함 할 수 없다 는 뜻 이다.
  • > 이 단어의 상관 성 을 높이 는 것, 즉 이 단 어 를 우선 포함 하 는 것
  • < 연관 성 낮 추기,
  • () 괄호 로 글자 조건 을 사용 할 수 있다.예 를 들 어 + aa + (> bbb
  • ~ 상관 성 을 플러스 에서 마이너스 로 바 꾸 는 것 은 이 글 자 를 가지 고 있 으 면 상관 성 이 떨어진다 는 뜻 이지 만 '-' 가 제외 하 는 것 이 아니 라 뒤에 만 있다 는 뜻 이다.
  • * 마스크 입 니 다. 이것 은 문자열 뒤에 만 연결 할 수 있 습 니 다.
  • " " :전체적으로 일치 합 니 다. 한 단락 의 문장 을 작은 따옴표 로 싸 서 완전히 일치 해 야 하 며 읽 을 수 없 음 을 표시 합 니 다.
  • 사용 예:
    select * from TicketComment where match(`Body`) against('Test -two' in boolean mode);
    [참고]https://blog.csdn.net/u011734144/article/details/52817766
    나의 Professional Java for Web Applications 관련 글

    좋은 웹페이지 즐겨찾기