MySQL ngram Trình phân tích cú pháp toàn văn

MySQL ngram Trình phân tích cú pháp toàn văn

?

Tóm tắt : hướng dẫn này chỉ cho bạn cách sử dụng trình phân tích cú pháp toàn văn bản MySQL ngram để hỗ trợ tìm kiếm toàn văn cho các ngôn ngữ tư tưởng như tiếng Trung, tiếng Nhật, tiếng Hàn, v.v.

Giới thiệu về MySQL ngram trình phân tích cú pháp toàn văn

Trình phân tích cú pháp toàn văn bản tích hợp của MySQL xác định phần đầu và phần cuối của các từ sử dụng khoảng trắng. Khi nói đến các ngôn ngữ tư tưởng như tiếng Trung, tiếng Nhật hoặc tiếng Hàn, v.v., đây là một hạn chế vì các ngôn ngữ này không sử dụng các dấu phân cách từ.

Để giải quyết vấn đề này, MySQL đã cung cấp trình phân tích cú pháp toàn văn bản ngram. Kể từ phiên bản 5.7.6, MySQL đã bao gồm trình phân tích cú pháp toàn văn bản ngram như một plugin máy chủ tích hợp, nghĩa là MySQL sẽ tự động tải plugin này khi máy chủ cơ sở dữ liệu MySQL khởi động. MySQL hỗ trợ trình phân tích cú pháp toàn văn bản ngram cho cả hai công cụ lưu trữ InnoDB và MyISAM.

Theo định nghĩa, ngram là một chuỗi liền kề của một số ký tự từ một chuỗi văn bản. Chức năng chính của trình phân tích cú pháp toàn văn bản ngram là mã hóa một chuỗi văn bản thành một chuỗi n ký tự liền kề.

Phần sau đây minh họa cách trình phân tích cú pháp toàn văn bản ngram mã hóa một chuỗi văn bản cho các giá trị khác nhau của n:

n = 1: 'm','y','s','q','l'
n = 2: 'my', 'ys', 'sq','ql' 
n = 3: 'mys', 'ysq', 'sql'
n = 4: 'mysq', 'ysql'
n = 5: 'mysql'

Tạo các chỉ mục FULLTEXT với trình phân tích ngram

Để tạo ra một FULLTEXTchỉ số có sử dụng ngram phân tích cú pháp văn bản đầy đủ, bạn thêm WITH PARSER ngramvào CREATE TABLE, ALTER TABLEhoặc CREATE INDEXtuyên bố.

Ví dụ: câu lệnh sau tạo postsbảng mới và thêm các cột titlebodycột vào FULLTEXTchỉ mục sử dụng trình phân tích cú pháp toàn văn bản ngram.

CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255),
    body TEXT,
    FULLTEXT ( title , body ) WITH PARSER NGRAM
)  ENGINE=INNODB CHARACTER SET UTF8MB4;

Câu INSERTlệnh sau đây chèn một hàng mới vào postsbảng:

SET NAMES utf8mb4;
 
INSERT INTO posts(title,body)
VALUES('MySQL全文搜索','MySQL提供了具有许多好的功能的内置全文搜索'),
      ('MySQL教程','学习MySQL快速,简单和有趣');

Lưu ý rằng SET NAMEScâu lệnh thiết lập bộ ký tự mà cả máy khách và máy chủ sẽ sử dụng để gửi và nhận dữ liệu; trong trường hợp này, nó là utf8mb4.

Để xem cách ngram token hóa văn bản, bạn sử dụng câu lệnh sau:

SET GLOBAL innodb_ft_aux_table="test/posts";
SELECT 
    *
FROM
    information_schema.innodb_ft_index_cache
ORDER BY doc_id , position;

Truy vấn này hữu ích cho mục đích khắc phục sự cố. Ví dụ: nếu một từ không bao gồm trong kết quả tìm kiếm, thì từ đó có thể không được lập chỉ mục vì đó là từ khóa hoặc nó có thể là một lý do khác.

Đặt kích thước mã thông báo ngram

Như bạn có thể thấy ví dụ trước, kích thước mã thông báo (n) trong ngram theo mặc định là 2. Để thay đổi kích thước mã thông báo, bạn sử dụng ngram_token_sizetùy chọn cấu hình, có giá trị từ 1 đến 10.

Lưu ý rằng kích thước mã thông báo nhỏ hơn làm cho chỉ mục tìm kiếm toàn văn bản nhỏ hơn và cho phép bạn tìm kiếm nhanh hơn.

ngram_token_sizelà biến chỉ đọc, do đó bạn chỉ có thể đặt giá trị của nó bằng hai tùy chọn:

Đầu tiên, trong chuỗi khởi động:

mysqld --ngram_token_size=1

Thứ hai, trong tập tin cấu hình:

[mysqld]
ngram_token_size=1

ngram trình phân tích cú pháp tìm kiếm

MySQL chuyển đổi một tìm kiếm cụm từ thành tìm kiếm cụm từ ngram. Ví dụ, "abc"được chuyển đổi thành "ab bc", trả về các tài liệu có chứa "ab bc""abc".

Ví dụ sau đây cho thấy bạn tìm kiếm cụm từ 搜索trong postsbảng:

SELECT 
    id, title, body
FROM
    posts
WHERE
    MATCH (title , body) AGAINST ('搜索' );

Xử lý kết quả tìm kiếm với ngram

Chế độ ngôn ngữ tự nhiên

Trong NATURAL LANGUAGE MODEcác tìm kiếm, thuật ngữ tìm kiếm được chuyển đổi thành một tập hợp các giá trị ngram. Giả sử kích thước mã thông báo là 2 hoặc bigram, cụm từ tìm kiếm mysqlđược chuyển đổi thành my ys sqql.

SELECT 
    *
FROM
    posts
WHERE
    MATCH (title , body) AGAINST ('简单和有趣' IN natural language MODE);

Chế độ Boolean

Trong BOOLEAN MODEcác tìm kiếm, thuật ngữ tìm kiếm được chuyển đổi thành tìm kiếm cụm từ ngram. Ví dụ:

SELECT 
    *
FROM
    posts
WHERE
    MATCH (title , body) AGAINST ('简单和有趣' IN BOOLEAN MODE);

tìm kiếm ký tự đại diện

FULLTEXTChỉ số ngram chỉ chứa ngrams, do đó nó không biết bắt đầu các điều khoản. Khi bạn thực hiện tìm kiếm ký tự đại diện, nó có thể trả về kết quả không mong muốn.

Các quy tắc sau được áp dụng cho tìm kiếm ký tự đại diện bằng FULLTEXTchỉ mục tìm kiếm ngram :

Nếu thuật ngữ tiền tố trong ký tự đại diện ngắn hơn kích thước mã thông báo ngram, truy vấn sẽ trả về tất cả các tài liệu có chứa mã thông báo ngram bắt đầu bằng thuật ngữ tiền tố. Ví dụ:

SELECT 
    id, title, body
FROM
    posts
WHERE
    MATCH (title , body) AGAINST ('my*' );
SELECT 
    id, title, body
FROM
    posts
WHERE
    MATCH (title , body) AGAINST ('mysqld*' );

Trong trường hợp thuật ngữ tiền tố trong ký tự đại diện dài hơn kích thước mã thông báo ngram, MySQL sẽ chuyển đổi thuật ngữ tiền tố thành cụm từ ngram và bỏ qua toán tử ký tự đại diện. Xem ví dụ sau:

Trong ví dụ này, thuật ngữ nhóm mysqld"được chuyển đổi thành cụm từ ngram : "my" "ys" "sq" "ql""ld". Do đó, tất cả các tài liệu có chứa một trong những cụm từ này được trả lại.

Xử lý mật khẩu

Trình phân tích ngram loại trừ các mã thông báo có chứa từ khóa trong danh sách từ khóa. Ví dụ: giả sử ngram_token_sizelà 2 và tài liệu chứa "abc". Trình phân tích ngram sẽ mã hóa tài liệu thành "ab""bc". Nếu "b"là một từ dừng, ngram sẽ loại trừ cả hai "ab""bc"vì chúng chứa "b".

Lưu ý rằng bạn phải xác định danh sách từ khóa riêng của mình nếu ngôn ngữ không phải là tiếng Anh. Ngoài ra, các từ khóa có độ dài lớn hơn ngram_token_sizebị bỏ qua.

Trong hướng dẫn này, bạn đã học cách sử dụng trình phân tích cú pháp toàn văn bản MySQL ngram để xử lý các tìm kiếm toàn văn bản cho các ngôn ngữ tư tưởng.

Last updated