sql >> Database teknologi >  >> RDS >> Mysql

mySQL MATCH på tværs af flere borde

  • Du kan ikke definere fuldtekstindekser (eller nogen form for indeks) på tværs af flere tabeller i MySQL. Hver indeksdefinition refererer til nøjagtig én tabel. Alle kolonner i et givet fuldtekstindeks skal være fra samme tabel.

  • Kolonnerne navngivet som argumenter til MATCH() funktion skal være en del af et enkelt fuldtekstindeks. Du kan ikke bruge et enkelt kald til MATCH() for at søge i alle kolonner, der er en del af alle fuldtekstindekser i din database.

  • Fuldtekst indekserer kun indekskolonner defineret med CHAR , VARCHAR og TEXT datatyper.

  • Du kan definere et fuldtekstindeks i hver tabel.

Eksempel:

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

Og så kan du skrive en forespørgsel, der bruger hvert respektive fuldtekstindeks:

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;


  1. Henter dato med tidszoneforskydning

  2. Hvordan kan jeg indsætte 10 millioner poster på kortest mulig tid?

  3. Rammen for et Apache Spark Job Run!

  4. Introduktion af ny funktion - Spotlight Cloud Replication