-
W MySQL nie można definiować indeksów pełnotekstowych (ani żadnego rodzaju indeksów) w wielu tabelach. Każda definicja indeksu odwołuje się dokładnie do jednej tabeli. Wszystkie kolumny w danym indeksie pełnotekstowym muszą pochodzić z tej samej tabeli.
-
Kolumny nazwane jako argumenty funkcji
MATCH()
funkcja musi być częścią pojedynczego indeksu pełnotekstowego. Nie możesz użyć pojedynczego wywołaniaMATCH()
aby przeszukać wszystkie kolumny, które są częścią wszystkich indeksów pełnotekstowych w Twojej bazie danych. -
Indeksy pełnotekstowe tylko indeksują kolumny zdefiniowane za pomocą
CHAR
,VARCHAR
iTEXT
typy danych. -
Możesz zdefiniować indeks pełnotekstowy w każdej tabeli.
Przykład:
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)
);
Następnie możesz napisać zapytanie, które używa każdego odpowiedniego indeksu pełnotekstowego:
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;