有没有一种方法可以使用MySQL全文搜索相关表?

时间:2020-08-29 18:35:48

标签: mysql sql indexing full-text-search full-text-indexing

我有一个名为persons的表,其中包含有关人员的数据。它还包含指向另一个表的外键。我想创建一个全文索引,以便能够在相关表中搜索全文。

以下是一些示例数据:(请参见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');

因此,我希望能够搜索“ Jersey”中的人,例如:

SELECT * FROM persons WHERE MATCH(first_name, last_name, state_id) AGAINST('Jersey');

但是,当然,文本“ Jersey”仅存在于states表中,而不存在于persons表中。制定物化/生成索引是否有意义?有没有更简单的方法?

2 个答案:

答案 0 :(得分:0)

您需要在states表上放置一个单独的全文本索引,并与之联接。

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')

答案 1 :(得分:0)

在MySQL中,没有索引类型跨越多个表。不是全文索引,不是空间索引,不是btree索引,不是哈希索引。

您可以定义的每种索引类型都完全属于一个表,并且只能索引该表中的值。