2012-01-26 31 views
11

Tôi đã được giao nhiệm vụ tạo tính năng tìm kiếm trên toàn trang web. Tìm kiếm cần xem xét các bài viết, sự kiện và nội dung trangMức độ liên quan tìm kiếm toàn bộ Mysql trên nhiều bảng

Tôi đã sử dụng MATCH()/AGAINST() trong MySQL trước và biết cách nhận được mức độ liên quan của kết quả nhưng theo tôi biết mức độ liên quan là duy nhất để tìm kiếm (nội dung, số hàng vv) mức độ liên quan của kết quả từ bảng bài viết không phù hợp với mức độ phù hợp của kết quả từ bảng sự kiện.

Có cách nào để thống nhất mức độ liên quan để kết quả từ cả ba bảng có liên quan tương đương?

+0

Về mặt logic, đây có vẻ là một nơi tốt để sử dụng công đoàn và các lựa chọn phụ phù hợp với; nhưng tôi chưa bao giờ sử dụng nó để tìm kiếm theo cách này; vì vậy tôi nghi ngờ đây là cách tốt nhất. – xQbert

+0

sẽ có cách nào để bạn cân nhắc mức độ phù hợp? chỉ đơn giản là nhân – bowlerae

+0

Tôi băn khoăn về việc chuẩn hóa mức độ liên quan cao nhất đến 1 nhưng vẫn ném kết quả trên nhiều bảng – michael

Trả lời

20

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 cần phải làm điều đó chỉ trong MySQL, bạn có thể làm điều này với một UNION. Có thể bạn sẽ muốn chặn mọi kết quả không liên quan.

Bạn cần 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 viết quan trọng nhất, các sự kiện trở nên quan trọng và các trang ít quan trọng nhất. Bạn có thể sử dụng số nhân như thế này:

set @articles_multiplier=3; 
set @events_multiplier=2; 
set @pages_multiplier=1; 

Dưới đây là một ví dụ làm việc bạn có thể thử thể hiện một số kỹ thuật:

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ó tìm kiếm:

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 | 
+------------+----+------------------+ 
+0

Điều này thật tuyệt vời! Tôi có câu hỏi rất giống nhau, nhưng tôi cần các trận đấu liên quan. bạn có thể xem nó không? http://stackoverflow.com/q/9953922/633513 – LordZardeck

+0

Bạn TUYỆT VỜI !! – Cogicero

+0

Cảm ơn rất nhiều vì câu trả lời này !!!! – Marcky

2

(Xin lỗi, tôi muốn để lại điều này như bình luận cho câu trả lời ở trên, nhưng tôi không có đủ uy tín để bình luận)

Hãy nhận biết rằng UNION trong truy vấn con được tối ưu hóa rất kém. Trường hợp thường xuyên là khi bạn muốn phân trang kết quả của mình bằng cách sử dụng "LIMIT @page * 10, 10" trong truy vấn chính, thì MySQL phải nhận được tất cả kết quả từ các truy vấn con để đánh giá truy vấn gốc.

Các vấn đề liên quan