-
Не можете да дефинирате пълнотекстови индекси (или какъвто и да е вид индекс) в множество таблици в MySQL. Всяка дефиниция на индекс препраща точно към една таблица. Всички колони в даден индекс на пълен текст трябва да са от една и съща таблица.
-
Колоните, наречени като аргументи на
MATCH()
функцията трябва да бъде част от един пълен текстов индекс. Не можете да използвате едно извикване наMATCH()
за търсене във всички колони, които са част от всички пълнотекстови индекси във вашата база данни. -
Пълният текст индексира само индексни колони, дефинирани с
CHAR
,VARCHAR
иTEXT
типове данни. -
Можете да дефинирате индекс на пълен текст във всяка таблица.
Пример:
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
FULLTEXT INDEX ftcat (name)
);
CREATE TABLE host_types (
id SERIAL PRIMARY KEY,
category_id BIGINT UNSIGNED,
name VARCHAR(100),
FULLTEXT INDEX ftht (name)
);
CREATE TABLE hosts (
id SERIAL PRIMARY KEY,
host_id BIGINT UNSIGNED,
category_id BIGINT UNSIGNED,
name VARCHAR(100),
FULLTEXT INDEX fthost (name)
);
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
keywords VARCHAR(100),
uid VARCHAR(100),
description VARCHAR(100),
quantity INTEGER,
price NUMERIC(9,2),
host_id BIGINT UNSIGNED,
FULLTEXT INDEX ftprod (name, keywords, description, uid)
);
И тогава можете да напишете заявка, която използва всеки съответен пълнотекстов индекс:
SELECT ...
MATCH(categories.name) AGAINST('search term') as cscore,
MATCH(host_types.name) AGAINST('search term') as htscore,
MATCH(hosts.name) AGAINST('search term') as hscore,
MATCH(products.name, products.keywords, products.description, products.uid)
AGAINST('search term') as score
FROM products
LEFT JOIN hosts ON products.host_id = hosts.id
LEFT JOIN host_types ON hosts.host_id = host_types.id
LEFT JOIN categories ON host_types.category_id = categories.id
WHERE
MATCH(categories.name) AGAINST('search term') OR
MATCH(host_types.name) AGAINST('search term') OR
MATCH(hosts.name) AGAINST('search term') OR
MATCH(products.name, products.keywords, products.description, products.uid)
AGAINST('search term')
ORDER BY score DESC;