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

Posted

技术标签:

【中文标题】Mysql全文搜索跨多个表的相关性【英文标题】:Mysql fulltext search relevance across multiple tables 【发布时间】:2012-02-19 13:45:51 【问题描述】:

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

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

是否有统一相关性以使所有三个表的结果具有可比较的相关性?

【问题讨论】:

从逻辑上讲,这似乎是一个使用联合和子选择匹配的好地方;但我从来没有用这种方式搜索过;所以我怀疑这是最好的方法。 您有什么方法可以衡量相关性吗?只是一个简单的乘法 我想知道将最高相关性标准化为 1,但这仍然会在多个表中抛出结果 你能把结构和预期的结果?这将有助于更好地理解。 【参考方案1】:

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

【讨论】:

这太棒了!我的问题非常相似,但我需要相关匹配。你也可以看看吗? ***.com/q/9953922/633513【参考方案2】:

(对不起,我想将此作为对上述答案的评论,但我没有足够的声誉来评论)

请注意,子查询中的 UNION 优化得很差。一种常见的情况是,当您想在父查询中使用“LIMIT @page * 10, 10”对结果进行分页时,MySQL 必须从子查询中获取 all 结果以评估父查询.

【讨论】:

以上是关于Mysql全文搜索跨多个表的相关性的主要内容,如果未能解决你的问题,请参考以下文章

mysql全文搜索相关性得分不正确

MySQL 全文搜索以布尔模式按相关性排序

mysql全文搜索,多个关键词权重排序

如何优化具有多个结果的 MySQL/MyISAM 全文搜索

如何按相关性对MYSQL全文搜索结果进行排序

如何使用 QuerySets 和 MySql“全文搜索”在多个字段中进行 Django 搜索?