Manual:Searchindex table/ja

searchindex テーブルは全文検索を提供するために使用されます. それらは MyISAM テーブルタイプと、並列化を改善するために InnoDB タイプを使用する Text テーブル ( 1.4 以前での Cur テーブル) でのみ実行が出来るため、そのためコピーが必要とされます. Postgres を使用する場合、このテーブルは存在しません. : 全文情報は直接 Page テーブルと pagecontent テーブルにカラムとして保管されます.

si_page
Key to page_id

si_title
Munged version of title

si_text
Munged version of body text

バージョン
mysql> 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    |       |

"DESCRIBE searchindex" により、MediaWiki 1.8 においては下記の内容を示します:

+--+--+--+-+-+---+ +--+--+--+-+-+---+ +--+--+--+-+-+---+
 * Field   | Type             | Null | Key | Default | Extra |
 * si_page | int(10) unsigned | NO   | PRI | NULL    |       |
 * si_title | varbinary(255)  | NO   | MUL | NULL    |       |
 * si_text | mediumblob       | NO   | MUL | NULL    |       |

mysql> describe mw_searchindex; +--+-+--+-+-+---+ +--+-+--+-+-+---+ +--+-+--+-+-+---+ 3 rows in set (0.02 sec)
 * 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    |       |

フィールドの内容としては:
 * si_page: cur からの ページ ID.
 * si_title: cur からの ページタイトル.
 * si_text: cur からの 索引作成済みテキスト.

カーディナリティのために、en wikipedia はインデックスにこれを使用します: +-++--+--+-+---+-+--++--++-+ +-++--+--+-+---+-+--++--++-+ +-++--+--+-+---+-+--++--++-+
 * 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   |         |

一般的な検索クエリの形式:

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

MediaWiki バージョン 1.4 以下において:

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;

Explain が下記の内容を表示します: +-++---+---+-+++-+ +-++---+---+-+++-+ +-++---+---+-+++-+
 * 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 |

既知の問題
多数のレコードを含んでいる名前空間のレンジスキャンは、cur table から RAM に大きな容量をロードすることを要求します. これは非常にコストのかかる事であり、一つには cur table が記事の全文を含んでいるためです. 長期的な計画では cur table からテキストを取り除きます. 一時的措置としては、searchindex にフィールドを加え、それらにインデックスを付けるか (そして、そのインデックスと fulltext インデックス両方が使われることを可能にするために自己結合を使います)、クエリーと一致させるために読みこまなくてはならない全ての cur のレコード数を減少させるために cur_namespace と cur_is_redirect へインデックスを加える必要があるかもしれません.