Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Relevanz der MySQL-Volltextsuche über mehrere Tabellen hinweg

Ja, Sie können sie sehr gut mit einer Suchmaschine wie Apache Lucene und Solr vereinheitlichen.

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

Wenn Sie dies nur in MySQL tun müssen, können Sie dies mit einer UNION tun. Wahrscheinlich möchten Sie alle nullrelevanten Ergebnisse unterdrücken.

Sie müssen entscheiden, wie Sie die Relevanz beeinflussen möchten, je nachdem, welche Tabelle übereinstimmt.

Angenommen, Sie möchten, dass Artikel am wichtigsten sind, Ereignisse mittel wichtig und Seiten am wenigsten wichtig sind. Sie können Multiplikatoren wie folgt verwenden:

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

Hier ist ein funktionierendes Beispiel, das Sie ausprobieren können und das einige dieser Techniken demonstriert:

Beispieldaten erstellen:

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

Durchsuchbar machen:

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

Verwenden Sie eine UNION, um alle diese Tabellen zu durchsuchen:

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;

Das Ergebnis:

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