Có, bạn có thể hợp nhất chúng rất tốt bằng cách sử dụng công cụ tìm kiếm như Apache Lucene và Solr.
http://lucene.apache.org/solr/
Nếu bạn chỉ cần làm điều đó trong MySQL, bạn có thể thực hiện việc này với UNION. Có thể bạn sẽ muốn loại bỏ mọi kết quả không liên quan.
Bạn sẽ cần phải quyết định cách bạn muốn ảnh hưởng đến mức độ liên quan tùy thuộc vào bảng nào phù hợp.
Ví dụ:giả sử bạn muốn các bài báo là quan trọng nhất, các sự kiện là quan trọng trung bình và các trang là ít quan trọng nhất. Bạn có thể sử dụng các hệ số như sau:
set @articles_multiplier=3;
set @events_multiplier=2;
set @pages_multiplier=1;
Dưới đây là một ví dụ hoạt động mà bạn có thể thử thể hiện một số kỹ thuật sau:
Tạo dữ liệu mẫu:
create database d;
use d;
create table articles (id int primary key, content text) ENGINE = MYISAM;
create table events (id int primary key, content text) ENGINE = MYISAM;
create table pages (id int primary key, content text) ENGINE = MYISAM;
insert into articles values
(1, "Lorem ipsum dolor sit amet"),
(2, "consectetur adipisicing elit"),
(3, "sed do eiusmod tempor incididunt");
insert into events values
(1, "Ut enim ad minim veniam"),
(2, "quis nostrud exercitation ullamco"),
(3, "laboris nisi ut aliquip");
insert into pages values
(1, "Duis aute irure dolor in reprehenderit"),
(2, "in voluptate velit esse cillum"),
(3, "dolore eu fugiat nulla pariatur.");
Làm cho nó có thể tìm kiếm được:
ALTER TABLE articles ADD FULLTEXT(content);
ALTER TABLE events ADD FULLTEXT(content);
ALTER TABLE pages ADD FULLTEXT(content);
Sử dụng UNION để tìm kiếm tất cả các bảng sau:
set @target='dolor';
SELECT * from (
SELECT
'articles' as 'table_name', id,
@articles_multiplier * (MATCH(content) AGAINST (@target)) as relevance
from articles
UNION
SELECT
'events' as 'table_name',
id,
@events_multiplier * (MATCH(content) AGAINST (@target)) as relevance
from events
UNION
SELECT
'pages' as 'table_name',
id,
@pages_multiplier * (MATCH(content) AGAINST (@target)) as relevance
from pages
)
as sitewide WHERE relevance > 0;
Kết quả:
+------------+----+------------------+
| table_name | id | relevance |
+------------+----+------------------+
| articles | 1 | 1.98799377679825 |
| pages | 3 | 0.65545331108093 |
+------------+----+------------------+