Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Relevansi pencarian teks lengkap Mysql di beberapa tabel

Ya, Anda dapat menyatukannya dengan sangat baik menggunakan mesin telusur seperti Apache Lucene dan Solr.

http://lucene.apache.org/solr/

Jika Anda perlu melakukannya hanya di MySQL, Anda dapat melakukannya dengan UNION. Anda mungkin ingin menyembunyikan hasil yang tidak relevan.

Anda harus memutuskan bagaimana Anda ingin memengaruhi relevansi bergantung pada tabel mana yang cocok.

Misalnya, Anda ingin artikel menjadi yang paling penting, acara menjadi penting sedang, dan halaman menjadi kurang penting. Anda dapat menggunakan pengganda seperti ini:

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

Berikut adalah contoh kerja yang dapat Anda coba yang menunjukkan beberapa teknik ini:

Buat contoh data:

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.");

Buat agar dapat ditelusuri:

ALTER TABLE articles ADD FULLTEXT(content);
ALTER TABLE events ADD FULLTEXT(content);
ALTER TABLE pages ADD FULLTEXT(content);

Gunakan UNION untuk mencari semua tabel ini:

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;

Hasilnya:

+------------+----+------------------+
| 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. Gabung tabel tergantung pada nilai kolom di tabel utama

  2. Indeks terakhir dari substring yang diberikan di MySQL

  3. SQL Database dengan variabel jumlah kolom

  4. kueri sangat lambat setelah migrasi ke mysql 5.7

  5. Cara memperbarui MySQL secara OTOMATIS setelah bidang stempel waktu berakhir