Index de recherche en texte intégral MySQL

Aperçu

Scénarios d'utilisation de l'indexation de texte intégral :

  1. Par exemple, la requête de champ JSON est trop lente
  2. Les moteurs de recherche plus avancés tels que ES, Solr et Lucene ont des coûts d'apprentissage et d'utilisation plus élevés, mais leurs exigences en matière de volume d'affaires n'ont pas atteint ce niveau.

L'index de texte intégral fait rapidement correspondre les documents en créant un index inversé. Cette fonctionnalité a été introduite dans MySQL 5.6+. L'index de texte intégral traite les lettres, les chiffres et les traits de soulignement consécutifs comme un seul mot. Les espaces, les virgules et les points sont généralement utilisés pour mots séparés.

Introduction:

  • L'index de texte intégral dans MySQL est un index de type FultLeXT
  • Les index de texte intégral ne peuvent être utilisés que pour les tables InnoDB ou MyISAM et ne peuvent être créés que pour les colonnes CHAR, VARCHAR et TEXT.
  • MATCH (champ) CONTRE (mot clé) doit être accompagné du champ lors de sa création. Par exemple, le nom du champ utilisé par MATCH (light,weight, baby) est cohérent avec le nom du champ défini par le muscle d'index de texte intégral (light, poids, bébé). Si vous interrogez uniquement un seul champ, vous devez créer un index de recherche en texte intégral séparément.
  • L'index de texte intégral est basé sur les mots. innodb_ft_min_token_size et innodb_ft_max_token_size sont utilisés pour définir la longueur maximale et minimale des mots. Ceux en dehors de cette plage de longueur seront ignorés.
  • Les mots vides dans les mots vides seront ignorés
  • MySQL 5.7.6, fournit une prise en charge intégrée de l'analyseur ngram de texte intégral pour le chinois, le japonais et le coréen (CJK), ainsi qu'un plug-in d'analyseur de texte intégral MeCab installable pour le japonais.
  • CREATE TABLEUne définition d'index FULLTEXT peut être donnée dans l'instruction lors de la création de la table , ou ajoutée ultérieurement en utilisant ALTER TABLE ou CREATE INDEX.
  • Pour les ensembles de données volumineux, charger les données dans une table sans index FULLTEXT, puis créer l'index est beaucoup plus rapide que charger les données dans une table avec un index FULLTEXT existant.

taper

Trois types d'index de texte intégral

  • Langage naturel : IN NATURAL LANGUAGE MODE, MATCH AGAINSTrécupéré en passant une chaîne spécifique
  • Texte intégral booléen : IN BOOLEAN MODE, prend en charge les opérateurs, tels +qu'indiquer l'inclusion, -indiquer de ne pas inclure
  • Expansion de requête : WITH QUERY EXPANSION, équivalent à une expansion en mode langage naturel, effectue deux récupérations, la première récupération à partir d'une phrase donnée et la deuxième récupération basée sur la première ligne avec une corrélation plus élevée

créer

Trois façons de créer un index de texte intégral

  1. A préciser lors de la création du tableauFULLTEXT(column1, column2, ...)
  2. Modifier le tableau :ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1, column2, ...);
  3. Ajoutez un index à la table :CREATE FULLTEXT INDEX index_name ON table_name (column1, column2, ...);

Configuration
Modifiez my.inile fichier de configuration et ajoutez :

# MySQL全文索引查询关键词最小长度限制
[mysqld]
ft_min_word_len = 1

Méthode de stockage

  • full inverted index: prendra plus de place car il stocke non seulement le mot et l'ID du document où se trouve le mot, mais stocke également la position spécifique dans l'ID du document où se trouve le mot.
  • inverted file index: Seuls le mot et le document où se trouve le mot correspondant sont stockés. Économisez de l'espace, mais lors de la recherche, vous ne pouvez obtenir le document correspondant qu'en fonction des mots-clés, puis effectuer une recherche

mot vide

InnoDB divisera les mots pour le stockage. Lors de la recherche, ils seront mis en correspondance en fonction des mots (la valeur par défaut est les symboles anglais). Certains mots ne peuvent pas être indexés et interrogés, c'est pourquoi ils sont appelés mots vides. Interrogez les mots vides par défaut du système :

SELECT * FROM information_schema.INNODB_FT_DEFAULT_STOPWORD;

Ajoutez des mots vides personnalisés :

Tableaux associés

information_schema.INNODB_FT_INDEX_TABLE

information_schema.INNODB_FT_INDEX_CACHE
information_schema.INNODB_FT_DEFAULT_STOPWORD

Corrélation

Principe de calcul :

  • Si le mot (mot-clé de requête) apparaît dans le document
  • Le nombre de fois où le mot apparaît dans le document
  • Le nombre de mots dans la colonne d'index
  • Combien de documents contiennent ce mot

Tri : le classement est calculé par MySQL en fonction du nombre de mots dans la ligne, du nombre de mots uniques, du nombre total de mots dans l'index entier et du nombre de lignes contenant le mot.

Combat réel

Déclaration de création de table :

CREATE TABLE full_text_test (
    title VARCHAR(80),
    FULLTEXT (title)
);

Insérer les données préparées :

INSERT INTO full_text_test
VALUES
('It''s a beautiful night we''re looking for something dumb to do'),
('Hey baby I think I wanna marry you'),
('Is it the look in your eyes or is it this dancing juice'),
('Who cares baby I think I wanna marry you'),
('Well I know this little chapel on the boulevard'),
('We can go ooooo'),
('No one will know ooo'),
('Oh come on girl'),
('Who cares if we''re trashed'),
('Got a pocket full of cash we can blow whoa whoa'),
('Shots of patrol whoa whoa'),
('And it''s on girl'),
('Don''t say no no no no no'),
('Just say yeah yeah yeah yeah yeah'),
('If you''re ready like I''m ready'),
('I''ll go get the ring'),
('Let the choir bell sing like ooh ooh ooh'),
('So what you wanna do ooh ooh'),
('Let''s just run girl'),
('If we wake up and you want to break up'),
('That''s cool ooh ooh'),
('No I won''t blame you ooh ooh'),
('It was fun girl'),
('And we''ll go go go go go'),
('Just say I do ooh ooh ooh'),
('Tell me right now baby'),
('Tell me right now baby baby');

langage naturel

Le langage naturel, qui est également le mode de recherche par défaut, consiste à interroger les documents avec le mot spécifié. Les deux méthodes suivantes sont équivalentes :

SELECT title, MATCH(title) AGAINST('baby') AS relevance FROM full_text_test order by relevance desc;
SELECT title, MATCH(title) AGAINST('baby' in NATURAL LANGUAGE MODE) AS relevance FROM full_text_test order by relevance desc;

Match()Spécifiez la colonne dans laquelle rechercher, Against()spécifiez l'expression de recherche à utiliser et Match()la valeur transmise doit FULLTEXT()être la même que dans la définition. Si vous spécifiez plusieurs colonnes, elles doivent être répertoriées (et dans le bon ordre). Les recherches en texte intégral ne sont pas sensibles à la casse, sauf si le mode BINAIRE est utilisé.

Booléen

Indique que les caractères avant et après la chaîne ont une signification particulière. +Indique l'existence, -le symbole indique l'absence. Par exemple, pour rechercher des enregistrements contenant "marier" mais "ne s'en soucie pas" :

SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry' in BOOLEAN MODE);-- 返回2条记录
SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry -cares' in BOOLEAN MODE);-- 返回1条记录

Explication du symbole :

  • +: Doit apparaître
  • -: Ne doit pas apparaître, utilisé pour exclure les résultats des autres opérateurs. Si seulement cela est précisé, rien ne sera renvoyé.
  • 无符号: Par défaut, il représente ou, recherche automatique de segmentation de mots. Le même résultat que si IN BOOLEAN MODE n’était pas spécifié.
  • @distance : Utilisé pour tester si deux mots ou plus se trouvent dans une distance spécifiée. Spécifiez le terme de recherche entre guillemets doubles avant la distance @, tel que MATCH(col1) AGAINST('"word1 word2 word3" @8' IN BOOLEAN MODE
  • >: Augmente la valeur de poids des données correspondantes
  • <: Réduire la valeur de poids des données correspondantes
  • (): Équivalent au regroupement d'expressions, le même que les expressions en mathématiques
  • ~ : Changez sa corrélation de positive à négative, indiquant que la présence de ce mot réduira la corrélation. Par exemple, +apple ~macintoshapple est mis en correspondance en premier, mais si macintosh est également inclus, le classement sera inférieur.
  • *: caractère générique, ne peut être utilisé qu'après une chaîne
  • ": Correspondance exacte, le mot entre guillemets doit correspondre dans son intégralité

Exemple :
apple banana
Contient une pomme ou une banane.
+apple +juice
Doit contenir à la fois de la pomme et du jus
+apple macintosh
. Contient de la pomme, mais s'il contient les deux Macintosh, il sera classé plus haut. Contient de la
+apple -macintosh
pomme mais ne contient pas de Macintosh.
+apple ~macintosh
Contient de la pomme. S'il contient les deux Macintosh, le le poids sera réduit.
apple*
Les lignes contenant le mot pomme, applesauceetc. seront mises en correspondance avec
"some words"
les lignes qui correspondent exactement à certains mots.
+apple +(>turnover <strudel)

  1. Contient des pommes et du chausson, ou contient des pommes et du strudel
  2. Les enregistrements contenant des pommes et du chiffre d'affaires ont des poids plus élevés que les enregistrements contenant des pommes et du strudel.

extension de requête

Ajouté WITH QUERY EXPANSIONou IN NATURAL LANGUAGE MODE WITH QUERY EXPANSIONactivé, il effectuera deux recherches, la première recherche utilisant la phrase donnée et la deuxième recherche combinée avec les premières lignes les plus pertinentes.

L'instruction de requête suivante :

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' WITH QUERY EXPANSION);

Lors de l'exécution, une requête de base, c'est-à-dire une requête en langage naturel, sera exécutée en premier :

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' IN NATURAL LANGUAGE MODE);

Ensuite, la deuxième requête utilisera les résultats de la première requête comme phrase d'entrée et obtiendra enfin les résultats de la requête par ordre décroissant en fonction de leur pertinence.

En d’autres termes, si une certaine chaîne ne contient pas d’expression-clé, elle peut également apparaître dans l’ensemble de résultats de l’expansion de la requête fruitsi elle contient des mots-clés.apple

référence

Je suppose que tu aimes

Origine blog.csdn.net/lonelymanontheway/article/details/129373098
conseillé
Classement