テーブル構造

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