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

Mức độ liên quan của tìm kiếm toàn văn bản Mysql trên nhiều bảng

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn và truy xuất hình ảnh vào mysql thông qua python

  2. Sửa lỗi Quyền truy cập bị từ chối cho người dùng 'root' @ 'localhost' cho phpMyAdmin

  3. Làm cách nào để hợp nhất hai bảng MySQL?

  4. Làm cách nào để lưu dữ liệu phiên PHP vào cơ sở dữ liệu thay vì trong hệ thống tệp?

  5. Dễ dàng thiết lập máy chủ web với XAMPP