Mysql
 sql >> база данни >  >> RDS >> Mysql

Уместност на пълнотекстово търсене на Mysql в множество таблици

Да, можете да ги обедините много добре, като използвате търсачка като Apache Lucene и Solr.

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

Ако трябва да го направите само в MySQL, можете да направите това с UNION. Вероятно ще искате да потиснете всички нулеви резултати.

Ще трябва да решите как искате да повлияете на уместността в зависимост от това коя таблица съвпада.

Например, да предположим, че искате статиите да са най-важни, събитията да са средно важни и страниците да са най-малко важни. Можете да използвате множители като този:

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

Ето работещ пример, който можете да опитате, който демонстрира някои от тези техники:

Създайте примерни данни:

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

Направете го с възможност за търсене:

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

Използвайте UNION, за да търсите във всички тези таблици:

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;

Резултатът:

+------------+----+------------------+
| 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. Най-добри практики за меко изтриване (PHP/MySQL)

  2. Динамична опора MySQL

  3. MySQL Prepare Statement - Максимална дължина 1000 знака

  4. Методът за удостоверяване „caching_sha2_password“ не се поддържа от нито един от наличните плъгини

  5. Как да актуализирам, ако съществува, да вмъкна, ако не (AKA upsert или merge) в MySQL?