Un index de recherche permet d'interroger n'importe quelle colonne d'une table large LindormTable, et pas uniquement les colonnes de clé primaire. Par défaut, LindormTable ne prend en charge que les recherches par clé primaire. L'ajout d'un index de recherche active les requêtes en texte intégral, la correspondance floue et les filtres de plage sur les colonnes non clés, sans modifier le schéma de votre table.
Cette rubrique couvre l'intégralité du cycle de vie : création d'un index de recherche, vérification de son état, interrogation des données via l'index et suppression de l'index. Elle aborde également les colonnes dynamiques, les colonnes génériques (wildcard) et l'optimisation de l'intervalle d'actualisation.
Prérequis
Avant de commencer, assurez-vous d'avoir :
-
Activé la fonctionnalité d'index de recherche
La fonctionnalité d'index de recherche dépend de LindormSearch et de Lindorm Tunnel Service (LTS). Pour activer cette fonctionnalité, vous devez également activer LindormSearch et LTS .
Établi une connexion à LindormTable via Lindorm-cli
Limites
Les index de recherche comportent des limites d'utilisation. Consultez la page Limites avant de les utiliser en production.
Configurer les données de test
Les exemples présentés dans cette rubrique utilisent une table nommée search_table. Exécutez les instructions suivantes pour créer la table et insérer les données de test.
-
Créez la base de données et la table.
CREATE DATABASE searchindex_db; USE searchindex_db; CREATE TABLE IF NOT EXISTS search_table ( user_id BIGINT, name VARCHAR, age SMALLINT, gender VARCHAR, address VARCHAR, email VARCHAR, city VARCHAR, PRIMARY KEY (user_id) ); -
Insérez quatre lignes de données de test.
UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen'); -
Vérifiez les données.
SELECT * FROM search_table LIMIT 10;Sortie attendue :
+---------+--------+-----+--------+-----------------------------+------------------+----------+ | user_id | name | age | gender | address | email | city | +---------+--------+-----+--------+-----------------------------+------------------+----------+ | 1 | Zhang | 18 | M | Chaoyang District, Beijing | a***@example.net | Beijing | | 6 | Li | 32 | M | Yuhang District, Hangzhou | a***@example.net | Hangzhou | | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | | 28 | Chen | 36 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | +---------+--------+-----+--------+-----------------------------+------------------+----------+
Créer un index de recherche
Objectifs de cet index d'exemple :
Rechercher dans n'importe quelle colonne de la table
Exécuter des requêtes tokenisées (texte intégral) sur la colonne
addressà l'aide de l'analyseur IKExécuter des requêtes floues sur la colonne
email
-
CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table ( name, age, gender, address(type=text, analyzer=ik), email, city ) WITH (numShards=4);- numShards contrôle le nombre de shards dans lesquels l'index est divisé. Dans cet exemple,
numShards=4crée quatre shards. La valeur par défaut correspond au double du nombre de nœuds LindormSearch. Planifiez le nombre de shards avant de créer un index pour la production afin d'éviter de surcharger des shards individuels. Pour obtenir des conseils, consultez la description du paramètre numShards . - Le champaddressest configuré avectype=text, analyzer=ikafin que la tokenisation par l'analyseur IK s'applique aux requêtes en texte intégral sur cette colonne. - Par défaut, Lindorm construit l'index de recherche de manière asynchrone en arrière-plan. Plus la table contient de données historiques, plus la construction prend du temps. Pour construire l'index de manière synchrone, ajoutez le mot-cléSYNCà l'instruction. - Pour connaître les erreurs courantes lors de l'exécution deCREATE INDEX, consultez la FAQ . -
Vérifiez l'état de l'index.
SHOW INDEX FROM search_table;Sortie attendue :
+----------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +----------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | searchindex_db | search_table | idx | BUILDING | SEARCH | NA | address,city,age,gender,name,email | 0 | | +----------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+Le champ
INDEX_STATEindique l'état actuel de la construction. Les états valides sont les suivants :État Signification BUILDINGL'index est en cours de construction. Les requêtes qui dépendent de l'index ne sont pas encore disponibles. ACTIVEL'index est prêt. Toutes les colonnes indexées peuvent faire l'objet de requêtes. DISABLEDL'index a été désactivé manuellement et n'est pas utilisé pour les requêtes. Attendez que l'état passe à
ACTIVEavant d'exécuter des requêtes s'appuyant sur l'index. Pour les définitions des champs, consultez SHOW INDEX. Pour suivre la progression complète de la construction, connectez-vous à la console LTS, puis choisissez Lindorm Search > Full Sync dans le volet de navigation de gauche. -
Interrogez les données via l'index.
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND city='Hangzhou';Sortie attendue :
+---------+------+-----+--------+-----------------------------+------------------+----------+ | user_id | name | age | gender | address | email | city | +---------+------+-----+--------+-----------------------------+------------------+----------+ | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | +---------+------+-----+--------+-----------------------------+------------------+----------+Pour davantage d'exemples de requêtes, consultez Interroger les données d'une table large à l'aide d'un index de recherche. Pour confirmer le moteur utilisé par une requête, exécutez une instruction EXPLAIN.
Supprimer un index de recherche
Exécutez l'instruction suivante pour supprimer l'index de recherche.
DROP INDEX IF EXISTS idx ON search_table;
Pour les versions de LindormTable antérieures à la 2.7.7, désactivez l'index avant de le supprimer :
ALTER INDEX IF EXISTS idx ON search_table DISABLED;
Une fois que l'état est passé à DISABLED, supprimez l'index avec DROP INDEX IF EXISTS idx ON search_table;. Pour réactiver un index désactivé, exécutez ALTER INDEX IF EXISTS idx ON search_table REBUILD;.
Utiliser les colonnes dynamiques
Les colonnes dynamiques permettent d'écrire des données dans des colonnes qui n'étaient pas définies lors de la création de la table. Pour rendre les colonnes dynamiques consultables, ajoutez-les explicitement à un index de recherche.
-
Activez les colonnes dynamiques sur la table.
ALTER TABLE search_table SET 'DYNAMIC_COLUMNS' = 'true'; -
Ajoutez la colonne dynamique à un index de recherche. Dans cet exemple,
passwordest une colonne dynamique qui n'était pas incluse dans le schéma de table d'origine.-
Lors de la création d'un nouvel index, incluez la colonne dynamique dans la liste des colonnes :
CREATE INDEX idx USING SEARCH ON search_table(user_id,name,age,gender,password); -
Pour ajouter la colonne à un index existant, utilisez
ALTER INDEX:ALTER INDEX idx ON search_table ADD COLUMNS(password);
-
-
Écrivez des données dans la colonne dynamique. Vous ne pouvez écrire des données dans la colonne
passwordqu'au format HexString.UPSERT INTO search_table (user_id,name,age,gender,address,email,city,password) VALUES (30, 'Wang', 38, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen', 'ef0011'); -
Interrogez la colonne dynamique. Vous ne pouvez interroger la colonne
passwordque lorsque les données sont stockées au format HexString.SELECT * FROM search_table WHERE password='ef0011' LIMIT 1;Sortie attendue :
+---------+------+-----+--------+----------------------------+------------------+----------+----------+ | user_id | name | age | gender | address | email | city | password | +---------+------+-----+--------+----------------------------+------------------+----------+----------+ | 30 | Wang | 38 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | 0xef0011 | +---------+------+-----+--------+----------------------------+------------------+----------+----------+
Utiliser les colonnes génériques (wildcard)
Une colonne générique (wildcard) est une colonne dont le nom contient un caractère générique (*). Toute colonne écrite dans la table dont le nom correspond au modèle générique est automatiquement traitée comme faisant partie de cette colonne générique, héritant de son type de données et des paramètres de l'analyseur, sans nécessiter de prédéfinition. Cette approche est utile lorsque vous devez écrire des données dans de nombreuses colonnes suivant un modèle de nommage cohérent. Pour plus d'informations, consultez Colonnes génériques (Wildcard).
-
Créez une table avec des colonnes génériques. Cet exemple définit
info_*etaddress_*comme colonnes génériques.CREATE TABLE search_table ( user_id BIGINT, name VARCHAR, age SMALLINT, `info_*` VARCHAR, `address_*` VARCHAR, PRIMARY KEY (user_id) ) WITH (wildcard_column='info_*,address_*'); -
Ajoutez les colonnes génériques à un index de recherche. La colonne générique
address_*est configurée avec l'analyseur IK pour les requêtes tokenisées.CREATE INDEX idx USING SEARCH ON search_table ( name, age, `info_*`, `address_*`(type=text, analyzer=ik) ); -
Écrivez les données. Les colonnes telles que
info_gender,info_emailetinfo_citycorrespondent àinfo_*;address_detailcorrespond àaddress_*. Ces colonnes sont créées automatiquement lors de l'écriture.UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen'); -
Interrogez les colonnes génériques.
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;Sortie attendue :
+---------+------+-----+-----------------------------+-----------+------------------+-------------+ | user_id | name | age | address_detail | info_city | info_email | info_gender | +---------+------+-----+-----------------------------+-----------+------------------+-------------+ | 20 | Wang | 28 | Binjiang District, Hangzhou | Hangzhou | a***@example.net | M | +---------+------+-----+-----------------------------+-----------+------------------+-------------+Pour vérifier que la requête est routée vers l'index de recherche, exécutez :
EXPLAIN SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;
Configurer l'intervalle d'actualisation
Les index de recherche offrent une cohérence à terme. Les données écrites dans la table large ne deviennent consultables qu'après la fin du prochain cycle d'actualisation.
LindormSearch actualise les données de l'index à intervalle fixe, soit 15 secondes par défaut. Réduire l'intervalle diminue le décalage entre les écritures et la disponibilité pour la recherche, mais augmente la charge sur LindormSearch. Ajustez le paramètre en fonction de vos exigences en matière de latence et de la capacité de votre cluster.
Si votre charge de travail nécessite que les données soient consultables immédiatement après une écriture, définissez l'intervalle sur
1s.Si le débit d'écriture est élevé et qu'une fraîcheur stricte des données n'est pas requise, conservez la valeur par défaut
15sou augmentez-la.
L'ajustement de l'intervalle d'actualisation nécessite la version 2.8.6.1 ou ultérieure de LindormTable. Pour vérifier ou mettre à niveau votre version, consultez le guide des versions de LindormTable et la mise à jour des versions mineures .
L'intervalle d'actualisation est contrôlé par la propriété SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL.
-
Définissez l'intervalle sur un index existant :
ALTER INDEX idx ON search_table SET SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s'; -
Définissez l'intervalle lors de la création d'un nouvel index :
CREATE INDEX idx USING SEARCH ON search_table (name) WITH (SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s'); -
Vérifiez l'intervalle actuel :
SHOW INDEX FROM search_table;