Příručka:Databázová tabulka searchindex
↑ Manuál:Obsah | MediaWiki schéma databáze | Tabulka searchindex |
S tabulkou searchindex se pracuje při fulltextovém vyhledávání (viz ll|search).
U MySQL nižších verzí než 5.6, bylo možné fulltextové indexování jen pokud byla tabulka typu MyISAM, ale ne InnoDB.
Jenže tabulka text
je však typu InnoDB, protože je výhodnější z hlediska výkonu při souběžném přístupu k datům, takže aby bylo možné využít indexování na straně databáze, bylo nutné pro každou stránku vytvořit kopii.
A to je důvod proč existuje tato tabulka.
Pokud používáte Postgres, tato tabulka neexistuje: Úplné textové informace jsou uloženy přímo v tabulkách page a pagecontent jako sloupce titlevector a textvector.
Tato tabulka se vyplní při uložení úprav na stránkách, pokud není $wgDisableSearchUpdate
nastaveno na true
nebo není nainstalováno rozšíření, které implementuje svůj vlastní index vyhledávání (např. rozšíření CirrusSearch ).
Skript údržby rebuildtextindex.php lze použít k naplnění od začátku nebo updateSearchIndex.php k aktualizaci pro nedávno změněné stránky.
Pole
si_page
Klíč k page_id .
si_title
Potlačená verze názvu stránky.
si_text
Změněná verze aktuálního textu stránky.
Podrobnosti
Používané indexy využívající anglickou Wikipedii pro mohutnost:
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | 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 | | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Běžný vyhledávací dotaz má tvar:
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
V MediaWiki verze 1.4 a starší:
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;
Vysvětlení ukazuje následující:
+-------------+--------+-------------------------------------------+---------------+---------+------------+--------+-------------+ | 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 | +-------------+--------+-------------------------------------------+---------------+---------+------------+--------+-------------+
Známé problémy
Skenování rozsahu s jmennými prostory obsahujícími velký počet záznamů vyžaduje, aby byla velká část tabulky searchindex
načtena do paměti RAM.
To je velmi nákladné, částečně proto, že tabulka searchindex
obsahuje celý text článku.
Dlouhodobým plánem je odstranit text z tabulky searchindex
.
Dočasná opatření mohou zahrnovat přidání polí do searchindex
a jejich indexování (a použití vlastního spojení, aby bylo možné použít tento index i fulltextový index) nebo přidání indexu searchindex
ke snížení počtu úplných záznamů searchindex
, které je třeba přečíst, aby odpovídaly dotazu.
Přehled změn ve schématu tabulky
Verze MediaWiki: | ≥ 1.43 |
DESCRIBE searchindex;
+----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | si_page | int(10) unsigned | NO | PRI | NULL | | | si_title | mediumtext | NO | MUL | NULL | | | si_text | mediumtext | NO | MUL | NULL | | +----------+------------------+------+-----+---------+-------+
Verze MediaWiki: | 1.10 – 1.42 |
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 | | +----------+------------------+------+-----+---------+-------+
Verze 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 | | +----------+-----------------+------+-----+---------+-------+
Indexy
Verze MediaWiki: | ≥ 1.43 |
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 | PRIMARY | 1 | si_page | A | 0 | NULL | NULL | | BTREE | | | | searchindex | 1 | si_title | 1 | si_title | NULL | NULL | NULL | NULL | | FULLTEXT | | | | searchindex | 1 | si_text | 1 | si_text | NULL | NULL | NULL | NULL | | FULLTEXT | | | +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+