-
Non è possibile definire indici fulltext (o qualsiasi tipo di indice) su più tabelle in MySQL. Ogni definizione di indice fa riferimento esattamente a una tabella. Tutte le colonne in un determinato indice fulltext devono appartenere alla stessa tabella.
-
Le colonne denominate come argomenti per
MATCH()
la funzione deve far parte di un singolo indice fulltext. Non puoi utilizzare una singola chiamata aMATCH()
per cercare tutte le colonne che fanno parte di tutti gli indici fulltext nel database. -
Il testo completo indicizza solo le colonne di indice definite con
CHAR
,VARCHAR
eTEXT
tipi di dati. -
Puoi definire un indice fulltext in ogni tabella.
Esempio:
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)
);
E poi puoi scrivere una query che utilizzi ogni rispettivo indice fulltext:
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;