-
MySQLの複数のテーブルにフルテキストインデックス(または任意の種類のインデックス)を定義することはできません。各インデックス定義は、正確に1つのテーブルを参照します。特定のフルテキストインデックスのすべての列は、同じテーブルからのものである必要があります。
-
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;