テーブル構造
Mediawikiのテーブル構造について少し調べたのでメモ。
pageテーブル
- auto_incrementなpage_idが主キー。これが各ページのIDとなる。
- page_titleにページ名が文字列ではいる。
- page_latestにページ最新版のIDが入る。
textテーブル
- 全てのバージョンのテキストデータを格納しているテーブル
- auto_incrementなold_idが主キー。page.page_latestに相当するっぽい。
searchindexテーブル
- native2ascii + lowercaseされたデータを格納しているテーブル
- これによりマルチバイト文字に対する検索もOKにしているのかな
- si_pageカラムがpage.page_idに相当するっぽい。
revisionテーブル
- auto_incrementなrev_idが主キー。ページグローバルなrevision番号っぽい。
- rev_pageがpage.page_idに相当するっぽい。
- rev_text_idがpage.page_idに相当するっぽい。
というわけでtextテーブルを検索してヒットしたレコードからURLを作るにはこんな感じ?
- 最新版のみなら、検索後にtext.old_id=page.page_latestで絞り込んで、page_titleからURL生成
- アーカイブも対象なら、検索後にtext.old_id=revision.rev_text_idかつrevision.rev_page=page.page_idで絞り込んで、page_titleとold_idからURL生成
年月日絞り込みも加えたいならさらにrevision.rev_timestampを条件に加える感じかな。
index追加
- text.old_textにFULLTEXT INDEX
- page.page_latestにUNIQUE INDEX
- revision.rev_text_idにINDEX
検索用SQL例
最新版のみを対象に検索。
SELECT MATCH(old_text) AGAINST("MySQL") AS score, page_title, KWIC(old_text, 120, 3, 0, "", "... ", "MySQL", "[", "]") AS snippet FROM text,page WHERE old_id=page_latest AND MATCH(old_text) AGAINST("MySQL") ORDER BY score DESC LIMIT 10 \G
アーカイブも含めて検索。
SELECT MATCH(old_text) AGAINST("MySQL") AS score, page_title, KWIC(old_text, 120, 3, 0, "", "... ", "MySQL", "[", "]") AS snippet from text,page,revision WHERE old_id=rev_text_id AND rev_page=page_id AND MATCH(old_text) AGAINST("MySQL") ORDER BY score DESC LIMIT 10 \G
修正:20080512
最新版のみを対象に検索。revisionテーブルもかまさないと駄目。あと添付ファイル(.docとか)を除外するのにpage_len>0を追加。
SELECT MATCH(old_text) AGAINST('*D+ interop' IN BOOLEAN MODE) AS score, page_title,KWIC(old_text, 120, 3, 1, '', '... ', 'interop', '', '') AS snippet FROM text,page,revision WHERE old_id=rev_text_id AND rev_id=page_latest AND MATCH(old_text) AGAINST('*D+ interop' IN BOOLEAN MODE) AND page_len > 0 ORDER BY score DESC LIMIT 10\G