有没有办法使用MySQL全文搜索相关表?
Is there a way to use MySQL fulltext to search related tables?
我有一个名为 persons
的 table,其中包含有关人员的数据。它还包含另一个 table 的外键。我想制作一个能够搜索相关 table 的全文索引。
这是一些示例数据:(参见 http://sqlfiddle.com/#!9/036fc5/2)
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `states` (`id`, `name`) VALUES
('NY', 'New York'),
('NJ', 'New Jersey'),
('CT', 'Connecticut'),
('PA', 'Pennsylvania');
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`state_id` char(2) not null,
PRIMARY KEY (`id`),
FULLTEXT (first_name, last_name, state_id)
);
INSERT INTO `persons` (`first_name`, `last_name`, `state_id`) VALUES
('Arnold', 'Asher', 'NY'),
('Bert', 'Bertold', 'NJ'),
('Charlie', 'Chan', 'NJ'),
('Darrin', 'Darcy', 'CT');
所以,我希望能够搜索来自“泽西岛”的人,例如:
SELECT * FROM persons WHERE MATCH(first_name, last_name, state_id) AGAINST('Jersey');
但是,当然,文本“Jersey”仅存在于 states
table 中,而不存在于 persons
table 中。做一个 materialized/generated 索引有意义吗?有没有更简单的方法?
您需要在 states
table 上放置一个单独的 full-text 索引,然后加入它。
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT (name)
);
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`state_id` char(2) not null,
PRIMARY KEY (`id`),
FULLTEXT (first_name, last_name);
SELECT p.*
FROM persons p
JOIN states s ON s.id = p.state_id
WHERE MATCH(s.name) AGAINST ('Jersey')
UNION
SELECT *
FROM persons
WHERE MATCH(first_name, last_name) AGAINST ('Jersey')
在 MySQL 中,没有类型的索引跨越多个 table。不是全文索引,不是空间索引,不是 btree 索引,不是哈希索引。
您可以定义的每种类型的索引都属于一个 table,并且只能索引 table 中的值。
我有一个名为 persons
的 table,其中包含有关人员的数据。它还包含另一个 table 的外键。我想制作一个能够搜索相关 table 的全文索引。
这是一些示例数据:(参见 http://sqlfiddle.com/#!9/036fc5/2)
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `states` (`id`, `name`) VALUES
('NY', 'New York'),
('NJ', 'New Jersey'),
('CT', 'Connecticut'),
('PA', 'Pennsylvania');
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`state_id` char(2) not null,
PRIMARY KEY (`id`),
FULLTEXT (first_name, last_name, state_id)
);
INSERT INTO `persons` (`first_name`, `last_name`, `state_id`) VALUES
('Arnold', 'Asher', 'NY'),
('Bert', 'Bertold', 'NJ'),
('Charlie', 'Chan', 'NJ'),
('Darrin', 'Darcy', 'CT');
所以,我希望能够搜索来自“泽西岛”的人,例如:
SELECT * FROM persons WHERE MATCH(first_name, last_name, state_id) AGAINST('Jersey');
但是,当然,文本“Jersey”仅存在于 states
table 中,而不存在于 persons
table 中。做一个 materialized/generated 索引有意义吗?有没有更简单的方法?
您需要在 states
table 上放置一个单独的 full-text 索引,然后加入它。
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT (name)
);
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`state_id` char(2) not null,
PRIMARY KEY (`id`),
FULLTEXT (first_name, last_name);
SELECT p.*
FROM persons p
JOIN states s ON s.id = p.state_id
WHERE MATCH(s.name) AGAINST ('Jersey')
UNION
SELECT *
FROM persons
WHERE MATCH(first_name, last_name) AGAINST ('Jersey')
在 MySQL 中,没有类型的索引跨越多个 table。不是全文索引,不是空间索引,不是 btree 索引,不是哈希索引。
您可以定义的每种类型的索引都属于一个 table,并且只能索引 table 中的值。