mySQL MATCH across multiple tables

后端 未结 2 488
死守一世寂寞
死守一世寂寞 2020-12-01 13:27

I have a set of 4 tables that I want to search across. Each has a full text index. Can a query make use of every index?

CREATE TABLE `categories` (
  `id` in         


        
2条回答
  •  离开以前
    2020-12-01 13:48

    • You can't define fulltext indexes (or any kind of index) across multiple tables in MySQL. Each index definition references exactly one table. All columns in a given fulltext index must be from the same table.

    • The columns named as arguments to the MATCH() function must be part of a single fulltext index. You can't use a single call to MATCH() to search all columns that are part of all fulltext indexes in your database.

    • Fulltext indexes only index columns defined with CHAR, VARCHAR, and TEXT datatypes.

    • You can define a fulltext index in each table.

    Example:

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

    And then you can write a query that uses each respective fulltext index:

    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;
    

提交回复
热议问题