Manuel:table searchindex
↑ Manuel:Contenu | Schéma de base de données MédiaWiki | table searchindex |
La table searchindex est utilisée pour fournir les recherches dans le texte complet.
Avant MySQL 5.6, les index du texte complet n'étaient fournis que par le moteur de la table MyISAM, et non pas par InnoDB.
La table text
utilise néanmoins le type InnoDB pour améliorer la concurrence, et une copie du texte actuel de la page était donc nécessaire pour pouvoir utiliser ces indexes.
C'est la raison pour laquelle cette table existe.
Si vous utilisez Postgres, cette table n'existe pas : l'information du texte complet est stockée directement dans les tables page et pagecontent dans les colonnes titlevector et textvector.
Cette table est remplie lorsque des modifications sont enregistrées sur les pages, à moins que $wgDisableSearchUpdate
ne vaille true
, ou qu'une extension qui implémentera son propre index de recherche ne soit installée (comme l'extension CirrusSearch ).
Le script de maintenance rebuildtextindex.php peut être utilisé pour la remplir à partir de rien, ou updateSearchIndex.php pour la mettre à jour pour les pages récemment modifiées.
Champs
si_page
Clés vers page_id .
si_title
Version modifiée du titre de page.
si_text
Version modifiée du texte actuel de la page.
Détails
Les index pour cela sont, si on utilise la Wikipedia anglophone avec sa cardinalité :
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | searchindex | 0 | si_page | 1 | si_page | A | 797275 | NULL | NULL | | BTREE | | | searchindex | 1 | si_title | 1 | si_title | A | 265758 | NULL | NULL | | FULLTEXT | | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Une requête search standard a la forme suivante :
SELECT page_id, page_namespace, page_title FROM `page`,`searchindex`
WHERE page_id=si_page
AND MATCH(si_text) AGAINST('+''searchterm''' IN BOOLEAN MODE)
AND page_is_redirect=0
AND page_namespace IN (0)
LIMIT 20
Dans les versions MediaWiki 1.4 et plus anciennes :
SELECT cur_id,cur_namespace,cur_title,cur_text FROM cur,searchindex
WHERE cur_id=si_page
AND (
MATCH(si_text) AGAINST('+''searchterm''' IN BOOLEAN MODE)
AND cur_is_redirect=0
)
AND cur_namespace IN (0,9,11)
LIMIT 0, 20;
L'explication montre ceci :
+-------------+--------+-------------------------------------------+---------------+---------+------------+--------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+--------+-------------------------------------------+---------------+---------+------------+--------+-------------+ | cur | range | cur_id,cur_namespace,name_title_timestamp | cur_namespace | 1 | NULL | 317499 | Using where | | searchindex | eq_ref | si_page | si_page | 4 | cur.cur_id | 1 | Using where | +-------------+--------+-------------------------------------------+---------------+---------+------------+--------+-------------+
Problèmes connus
Le balayage de l'intervalle avec des espaces de noms contenant un grand nombre d'enregistrements nécessite qu'une portion conséquente de la table searchindex
soit chargée en RAM.
C'est extrêmement coûteux, en particulier à cause du texte entier de l'article que l'on retrouve dans la table searchindex
.
La suppression du texte dans la table searchindex
est une tâche à long terme.
Les mesures temporaires peuvent impliquer l'ajout de champs à searchindex
et leur indexation (et l'utilisation d'un auto-join pour permettre l'utilisation de cet index et de l'index de texte complet) ou l'ajout d'un index searchindex
pour diminuer le nombre de searchindex
enregistrements complets qui doivent être lus pour correspondre à la requête.
Résumé du schéma
Version de MediaWiki : | ≥ 1.10 |
DESCRIBE searchindex;
+----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | si_page | int(10) unsigned | NO | PRI | NULL | | | si_title | varchar(255) | NO | MUL | | | | si_text | mediumtext | NO | MUL | NULL | | +----------+------------------+------+-----+---------+-------+
Versions de MediaWiki : | 1.1 – 1.9 |
DESCRIBE searchindex;
+----------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-----------------+------+-----+---------+-------+ | si_page | int(8) unsigned | NO | PRI | NULL | | | si_title | varchar(255) | NO | MUL | NULL | | | si_text | mediumtext | NO | MUL | NULL | | +----------+-----------------+------+-----+---------+-------+
Les index
Version de MediaWiki : | ≥ 1.4 |
SHOW INDEX IN searchindex;
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | searchindex | 0 | si_page | 1 | si_page | A | 0 | NULL | NULL | | BTREE | | | | searchindex | 1 | si_title | 1 | si_title | NULL | 0 | NULL | NULL | | FULLTEXT | | | | searchindex | 1 | si_text | 1 | si_text | NULL | 0 | NULL | NULL | | FULLTEXT | | | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+