MySQL tìm kiếm toàn văn ngram

Trình phân tích cú pháp toàn văn MySQL tích hợp sử dụng khoảng trắng giữa các từ làm dấu phân cách để xác định vị trí bắt đầu và kết thúc của từ, đây là một hạn chế khi làm việc với các ngôn ngữ tượng hình không sử dụng dấu phân cách từ. Để giải quyết hạn chế này, MySQL cung cấp trình phân tích cú pháp toàn văn ngram hỗ trợ tiếng Trung, tiếng Nhật và tiếng Hàn (CJK). Trình phân tích cú pháp toàn văn ngram được hỗ trợ để sử dụng với InnoDB và MyISAM

Tạo Chỉ mục Toàn văn

Tạo Chỉ mục FULLTEXT sử dụng Trình phân tích cú pháp ngram

1
CREATE FULLTEXT INDEX content_fulltext ON table_name(column1, column2,...) with parser ngram;

Tìm kiếm toàn văn

Tìm kiếm toàn văn bằng ngôn ngữ tự nhiên

1
2
3
4
5
SELECT COUNT(*) FROM articles
WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);
-- or
SELECT COUNT(*) FROM articles
WHERE MATCH (title,body) AGAINST ('database');

các cột được đặt tên trong hàm MATCH() (tiêu đề và nội dung) giống với các cột được đặt tên trong định nghĩa của chỉ mục FULLTEXT của bảng bài viết. Để tìm kiếm tiêu đề hoặc nội dung một cách riêng biệt, bạn sẽ tạo các chỉ mục FULLTEXT riêng cho từng cột

GHI CHÚ. Bây giờ, cũng có dự án trình phân tích cú pháp bi-gram khác. "Bộ sưu tập plugin trình phân tích cú pháp toàn văn MySQL". có thể tốt hơn một chút so với trình phân tích cú pháp này. (hoặc tốt hơn là "Dự án Tritton" đưa công cụ toàn văn "senna" vào MySQL. )

MySQL có khả năng tìm kiếm chỉ mục toàn văn cho trường văn bản. nhưng nó là chỉ mục dựa trên từ, nó không thể được sử dụng cho ngôn ngữ không có dấu phân cách từ như tiếng Nhật hoặc tiếng Trung. và nó cũng không thể tìm kiếm các ký tự ở giữa các từ. (cf. tìm kiếm 'trong' sẽ không khớp với từ 'ping'. )

Bắt đầu từ MySQL 5. 1, MySQL hỗ trợ plugin cho phép thay đổi thành phần server (fulltext search parser) mà không cần khởi động lại/biên dịch lại server

Trình phân tích cú pháp n-gram này sử dụng giao diện plugin này để triển khai trình phân tích cú pháp chỉ mục toàn văn bản n-gram (bi-gram) đơn giản, có thể lập chỉ mục mà không cần phân tách từ.

Trình phân tích cú pháp N-gram

N-gram (bi-gram) là thuật toán đơn giản, chỉ cần lấy 2 dãy ký tự từ văn bản để làm chỉ số. Plugin này sử dụng chức năng ký tự nhiều byte bên trong của MySQL để nhận chuỗi 2 ký tự, do đó, plugin này hoạt động với mọi mã hóa mà MySQL hỗ trợ, bao gồm cả utf-8

Bản thân plugin cũng rất đơn giản. về cơ bản tôi chỉ thay đổi 1 chức năng (bi_gram_parser_parse, trong bi_gram_plugin. c) từ trình phân tích cú pháp toàn văn ví dụ đi kèm với kho lưu trữ nguồn MySQL

Thay đổi từ 1. 0

-- Phiên bản 1. 0. 1
 * Đã thêm tệp missig. (Nhật ký thay đổi, SAO CHÉP, v.v. )
 * Giấy phép đã thay đổi từ GPL thành LGPL.
 * Đã sửa để sử dụng. /cấu hình thông số.
 * Đã sửa lỗi, khi tìm kiếm/lập chỉ mục chỉ bằng một ký tự sẽ trả về kết quả chính xác.

biên dịch

1) lấy kho lưu trữ mã nguồn. bi_gram-src-1. 0. 1. hắc ín. gz

2). /configure --prefix=/usr (hoặc /usr/local)

3) thực hiện (bạn cần cài đặt tiêu đề MySQL. )

4) thực hiện cài đặt (plugin sẽ nằm trong /usr/lib/mysql/)

GHI CHÚ. trong phiên bản mới hơn của MySQL souce, bạn có thể thấy lỗi 'In_C_you_nên_use_my_bool_instead' khi biên dịch. nếu vậy, vui lòng thay 'bool' thành 'my_bool'

LƯU Ý 2. Nếu bạn sử dụng máy tính i386, phiên bản biên dịch trước của bi_gramlib nhị phân. như vậy là có sẵn. tải xuống và đặt nó vào/usr/lib/mysql, v.v.

Cài đặt

1) Nếu bạn đã tải tệp nhị phân i386 xuống, hãy sao chép nó vào/usr/lib/mysql, v.v. (bạn không cần phải làm điều này nếu bạn đã 'thực hiện cài đặt' khi biên dịch)

2) sửa đổi /etc/my. cnf để thêm dòng này

[mysqld]
ft_min_word_len=1

3) khởi động lại máy chủ MySQL. (bởi vì tôi. cnf đã được thay đổi. )

4) kết nối với máy chủ bằng lệnh 'mysql'. sau đó gõ,

INSTALL PLUGIN bi_gram SONAME 'bi_gramlib.so';

(bạn có thể gõ 'HIỂN THỊ PLUGIN' để kiểm tra điều này. )


Cách sử dụng

1) tạo chỉ mục toàn văn bằng "VỚI PARSER bi_gram". (bằng cách 'tạo bảng' hoặc 'tạo chỉ mục', v.v. )

TẠO BẢNG t (c VARCHAR(255), FULLTEXT (c) VỚI PARSER bi_gram);

hoặc

TẠO CHỈ SỐ FULLTEXT c ON t(c) VỚI PARSER bi_gram;

2) thực hiện tìm kiếm toàn văn bằng cú pháp 'khớp - chống'

SELECT MATCH(c) AGAINST('case' IN BOOLEAN MODE) FROM t;

GHI CHÚ. bạn cần "Ở CHẾ ĐỘ BOOLESE"

lỗi đã biết

tìm kiếm không thành công khi từ kết thúc bằng dòng mới. (từ kết quả của công cụ ftdump, bản thân trình phân tích cú pháp bi-gram đã phân tích thành công từ đó. nhưng có vẻ như điều này xảy ra bên trong MySQL. Tôi đang điều tra thêm. )

Theo mặc định, MySQL đang sử dụng đối chiếu phân biệt chữ hoa chữ thường và dấu trọng âm cho tìm kiếm toàn văn bản (FTS), bạn có thể chỉ định một đối chiếu khác tại đây, chẳng hạn

$CFG->dboptions['ftslanguage'] = 'utf8_unicode_ci';
$CFG->dboptions['ftslanguage'] = 'utf8mb4_0900_as_ci';
$CFG->dboptions['ftslanguage'] = 'utf8mb4_de_pb_0900_ai_ci';

MySQL không hỗ trợ tiếng Nhật và các ngôn ngữ khác với các từ rất ngắn không có dấu cách ở giữa, hãy bật cài đặt sau để nhận hỗ trợ thử nghiệm cơ bản cho các ngôn ngữ này

________số 8


Sau bất kỳ thay đổi nào trong số này, hãy điền lại các bảng FTS và xây dựng lại các chỉ mục bằng cách chạy

php admin/cli/fts_repopulate_tables.php
php admin/cli/fts_rebuild_indexes.php

Độ dài cụm từ tìm kiếm tối thiểu

Có thể thay đổi giới hạn ký tự tìm kiếm mặc định của MySQL bằng cách chỉnh sửa tệp cấu hình MySQL

CREATE FULLTEXT INDEX content_fulltext ON table_name(column1, column2,...) with parser ngram;
0

Ngưng từ

Các từ dừng là một từ điển các từ sẽ bị loại khỏi chỉ mục và truy vấn tìm kiếm. Chúng phụ thuộc vào ngôn ngữ được sử dụng trong quá trình lập chỉ mục và tìm kiếm cũng như sự hiện diện của từ điển để cài đặt cơ sở dữ liệu e. g. nếu người dùng tìm kiếm "Khách sạn ở Wellington" thì hệ thống sẽ loại trừ từ "Ở" khỏi tìm kiếm

Thông tin chi tiết về các từ dừng của MySQL có thể được tìm thấy trong tài liệu trợ giúp của MySQL

tìm kiếm hình thái

Ngram là trình phân tích cú pháp toàn văn bản MySQL tích hợp, xác định phần đầu và phần cuối của từ bằng cách sử dụng khoảng trắng và các chuỗi ký tự cụ thể. Nó thường được bật theo mặc định, nhưng có thể phụ thuộc vào phân phối. Nó có thể phân tích hai hoặc nhiều từ bắt nguồn từ các từ ghép. Ví dụ: trong tiếng Đức, với từ ' Fußballweltmeisterschaft ', nó sẽ cho phép tìm kiếm từ đó bằng các từ như 'meister', 'schaft', v.v. . Chỉ mục toàn văn được tạo mà không sử dụng plugin này sẽ không thể chia từ thành các phần nhỏ hơn và SQL đang cố tìm từ khóa như 'meister' sẽ không thể tìm thấy bản ghi.

Đối với một số ngôn ngữ có chữ tượng hình (như ví dụ ở trên), chỉ mục toàn văn thông thường sẽ bị giới hạn ở những gì nó có thể tìm kiếm vì không có dấu phân cách cho những từ đó. Vì vậy, đây là lúc ngram có ích. Nó 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 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ề

Trong một số trường hợp, Ngram thực hiện tìm kiếm quá háo hức và trả về kết quả dương tính giả (mặc dù chúng được xếp hạng thấp và xuất hiện ở cuối danh sách), do đó, bạn nên xác nhận rằng hành vi tìm kiếm phù hợp với nhu cầu của mình sau khi bật hỗ trợ Ngram

Cách tìm kiếm đầy đủ

Để sử dụng tìm kiếm toàn văn bản trong MySQL, bạn cần phải sử dụng các chỉ mục toàn văn bản và hàm MATCH() . Chỉ mục toàn văn là FULLTEXT. Mysql hỗ trợ các chỉ mục toàn văn trên các bảng MyISAM. Hỗ trợ InnoDB đã được thêm vào kể từ phiên bản 5. 6.

ngram toàn văn là gì?

Trình phân tích cú pháp toàn văn ngram được hỗ trợ cho cả công cụ lưu trữ InnoDB và MyISAM trong MySQL. Theo định nghĩa của nó trong MySQL, một ngram là một chuỗi liền kề một số ký tự từ một chuỗi văn bản nhất định . Chức năng chính của nó là mã hóa một chuỗi văn bản thành một chuỗi n ký tự liền kề.

Làm thế nào để đầy đủ

Các chỉ mục toàn văn bản được tạo trên các cột dựa trên văn bản ( cột CHAR , VARCHAR hoặc TEXT) để tăng tốc độ truy vấn và thao tác DML trên dữ liệu chứa trong các cột đó. A full-text index is defined as part of a CREATE TABLE statement or added to an existing table using ALTER TABLE or CREATE INDEX .

InnoDB có hỗ trợ đầy đủ không

Chỉ có thể sử dụng chỉ mục toàn văn với các bảng MyISAM, Aria, InnoDB và Mroonga và chỉ có thể được tạo cho các cột CHAR, VARCHAR hoặc TEXT.