Mysql全文搜索跨多个表的相关性

标签 mysql search full-text-search relevance

我的任务是创建一个站点范围内的搜索功能。搜索需要看文章、事件和页面内容

我以前在 MySQL 中使用过 MATCH()/AGAINST() 并且知道如何获得结果的相关性,但据我所知,相关性对于搜索(内容、行数等)是唯一的文章表中结果的相关性与事件表中结果的相关性不匹配。

有没有办法统一相关性,使所有三个表的结果具有可比的相关性?

最佳答案

是的,您可以使用 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 |
+------------+----+------------------+

关于Mysql全文搜索跨多个表的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018577/

相关文章:

mysql - 如何在 MySQL 中编写此查询?

java - 将数据插入mysql数据库-java eclipse

java - 在 eclipse 中执行查找和插入

php - 使用ajax搜索,数组中的 "like"

php - 如何 "keep"codeigniter activerecord状态

php - 如何在 InnoDB 中实现全文搜索?

search - 如果我再次将同一文档放到ElasticSearch中,它将重新编制索引吗?

sql-server - TSQL - 使用全文 CONTAINS 的连接

android - Android 上的 SQLite 是否使用为 FTS 启用的 ICU 分词器构建?

java - 将 LinkedList 值插入数据库