sql >> Base de Datos >  >> RDS >> Mysql

Relevancia de búsqueda de texto completo de Mysql en varias tablas

Sí, puedes unificarlos muy bien usando un motor de búsqueda como Apache Lucene y Solr.

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

Si necesita hacerlo solo en MySQL, puede hacerlo con UNION. Probablemente querrá suprimir cualquier resultado relevante para cero.

Deberá decidir cómo desea afectar la relevancia según la tabla que coincida.

Por ejemplo, suponga que desea que los artículos sean los más importantes, los eventos medianamente importantes y las páginas menos importantes. Puedes usar multiplicadores como este:

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

Aquí hay un ejemplo de trabajo que puede probar que demuestra algunas de estas técnicas:

Crear datos de muestra:

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

Haz que se pueda buscar:

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

Utilice UNION para buscar en todas estas tablas:

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;

El resultado:

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