sql >> Database teknologi >  >> RDS >> Mysql

Mysql fuldtekst søgerelevans på tværs af flere tabeller

Ja, du kan forene dem meget godt ved at bruge en søgemaskine som Apache Lucene og Solr.

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

Hvis du kun skal gøre det i MySQL, kan du gøre dette med en UNION. Du vil sikkert gerne undertrykke alle nul-relevante resultater.

Du skal beslutte, hvordan du vil påvirke relevansen, afhængigt af hvilket bord der matcher.

Antag for eksempel, at du ønsker, at artikler skal være vigtigst, begivenheder skal være medium vigtige, og sider skal være mindst vigtige. Du kan bruge multiplikatorer som denne:

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

Her er et fungerende eksempel, du kan prøve, som demonstrerer nogle af disse teknikker:

Opret eksempeldata:

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

Gør det søgbart:

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

Brug en UNION til at søge i alle disse tabeller:

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;
 

Resultatet:

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

  1. ListView Kontrol Træk-Drop Sorter begivenheder

  2. Tager backup eksternt ved hjælp af innobackupex

  3. Hvordan fuzzy matcher e-mail eller telefon af Elasticsearch?

  4. JDBC VS Hibernate