Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pertinence de la recherche en texte intégral MySQL sur plusieurs tables

Oui, vous pouvez très bien les unifier en utilisant un moteur de recherche comme Apache Lucene et Solr.

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

Si vous avez besoin de le faire uniquement dans MySQL, vous pouvez le faire avec un UNION. Vous souhaiterez probablement supprimer tous les résultats sans pertinence.

Vous devrez décider comment vous souhaitez affecter la pertinence en fonction du tableau qui correspond.

Par exemple, supposons que vous souhaitiez que les articles soient les plus importants, les événements moyennement importants et les pages les moins importantes. Vous pouvez utiliser des multiplicateurs comme celui-ci :

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

Voici un exemple concret que vous pouvez essayer et qui illustre certaines de ces techniques :

Créer des exemples de données :

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

Rendez-le consultable :

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

Utilisez une UNION pour rechercher dans toutes ces tables :

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;

Le résultat :

+------------+----+------------------+
| table_name | id | relevance        |
+------------+----+------------------+
| articles   |  1 | 1.98799377679825 |
| pages      |  3 | 0.65545331108093 |
+------------+----+------------------+