Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tốt nhất để triển khai tìm kiếm chuỗi con trong SQL là gì?

Xem bản trình bày của tôi Tìm kiếm toàn văn bản thực tế trong MySQL .

Tôi đã so sánh:

Hôm nay những gì tôi sẽ sử dụng là Apache Solr , đưa Lucene trở thành một dịch vụ với nhiều tính năng và công cụ bổ sung.

Lại nhận xét của bạn:Aha, được rồi, không. Không có khả năng tìm kiếm toàn văn bản nào mà tôi đã đề cập sẽ giúp ích được, vì tất cả chúng đều giả định một số loại ranh giới từ

Một cách khác để tìm các chuỗi con tùy ý một cách hiệu quả là N-gram cách tiếp cận. Về cơ bản, hãy tạo một chỉ mục của tất cả các chuỗi N chữ cái có thể có và trỏ đến các chuỗi mà mỗi chuỗi tương ứng xảy ra. Thông thường, điều này được thực hiện với N =3 hoặc bát quái , bởi vì đó là điểm thỏa hiệp giữa việc so khớp các chuỗi con dài hơn và giữ chỉ mục ở kích thước có thể quản lý được.

Tôi không biết bất kỳ cơ sở dữ liệu SQL nào hỗ trợ lập chỉ mục N-gram một cách minh bạch, nhưng bạn có thể tự thiết lập nó bằng cách sử dụng chỉ mục đảo ngược :

create table trigrams (
  trigram char(3) primary key
);

create table trigram_matches (
  trigram char(3),
  document_id int,
  primary key (trigram, document_id),
  foreign key (trigram) references trigrams(trigram),
  foreign key (document_id) references mytable(document_id)
);

Bây giờ điền nó một cách khó khăn:

insert into trigram_matches
  select t.trigram, d.document_id
  from trigrams t join mytable d
    on d.textcolumn like concat('%', t.trigram, '%');

Tất nhiên điều này sẽ mất khá nhiều thời gian! Nhưng sau khi hoàn tất, bạn có thể tìm kiếm nhanh hơn nhiều:

select d.*
from mytable d join trigram_matches t
  on t.document_id = d.document_id
where t.trigram = 'abc'

Tất nhiên, bạn có thể tìm kiếm các mẫu dài hơn ba ký tự, nhưng chỉ mục đảo ngược vẫn giúp thu hẹp tìm kiếm của bạn rất nhiều:

select d.*
from mytable d join trigram_matches t
  on t.document_id = d.document_id
where t.trigram = 'abc'
  and d.textcolumn like '%abcdef%';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mảng trong truy vấn SQL?

  2. Đọc email imap php

  3. Làm thế nào để cập nhật cùng một bảng khi xóa trong MYSQL?

  4. Ví dụ về MySQL REGEXP

  5. Nhân bản giao dịch PHP PDO