首页 > 解决方案 > 带有全文搜索的 MySQL 触发器

问题描述

我在 mysql 上有一个 innodb 表,如下所示:

create table person (
    id int not null auto_increment primary key,
    name varchar(512),
    birthdate date,
    ...
    id_most_relevant int,
    fulltext(name)
);

我想创建一个触发器,每当更新一个人时,触发器将搜索具有最相关名称的其他人(通过使用全文搜索)并将他的 id 放在更新人员的 id_most_relevant 字段上,但只有如果此相关性超过 95%。因此,为了获得百分比相关性,我将每个人的相关性与更新的人的新名称的相关性分开。就像是:

SELECT id FROM PERSON
INTO _id_most_relevant
WHERE
    MATCH (name) AGAINST (_new_name) / 
    MATCH (new.name) AGAINST (_new_name) > 0.95

变量 _id_most_relevant 和 _new_name 先前已在触发器上声明,变量 _id_most_relevant 将用于更新 id=NEW.id 上的人员表。

任何人都知道如何触发该触发器?

我使用的是 Mysql 5.6,无法更新,但如有必要,我可以创建一个辅助表。

标签: mysqltriggersfull-text-search

解决方案


CREATE TRIGGER tr_bu_person
BEFORE UPDATE
ON person
FOR EACH ROW 
SET NEW.id_most_relevant = ( SELECT id
                             FROM person
                             WHERE id <> NEW.id
                             ORDER BY MATCH (name) AGAINST (new.name) DESC
                             LIMIT 1 );

但我会避免在触发器中使用 FTS - 我更愿意将此列设置为 NULL(或完全删除它)并将其更新为id行检索查询中最相关的行值(或者,也许,通过事件过程)。


推荐阅读