マルチスレッドでインデックスの作成と検索

Lucene入門に書いてあったけど、マルチスレッドで作成すると10倍ほど早いことがあるらしい、土曜日で作成と検索を完成させたい
インデックスの作成では今回の環境においてあまり意味がないので辞めた
インデックスの検索では意味があるけど難しくてわからないw

Luceneスコアの表示

Hitsクラスを使わないでTopDocsクラスとScoreDocクラスを使った場合

System.out.println("Searching for: " + query.toString("contents"));
		TopDocs docs = searcher.search(query, 10);
		for (ScoreDoc scoreDoc : docs.scoreDocs) {
			int docId = scoreDoc.doc;
			Document doc = searcher.doc(docId);
			System.out.println("user   : " + doc.get("user"));
			System.out.println("Score  : "+scoreDoc.score);
		}

Luceneのインデックスをバックアップ

よくわからない
普通にコピーでバックアップでいいかな
週1くらいで十分

インデックスの作成方法

その1

  1. 日本語のPublicTimeLineをいろいろな情報と共にDBに追加
  2. その中のTweetをSenで形態素解析して、またDBに追加
  3. そのDBからDataImportHandlerを使いインデックスに追加

その2

  1. 日本語のPublicTimeLineをいろいろな情報と共にDBに追加
  2. その中のTweetをSenで形態素解析して、そのままインデックスに追加

その3

  1. 日本語のPublicTimeLineをいろいろな情報と共にDBに追加
  2. その中のTweetをSenで形態素解析して、そのままインデックスに追加ついでにDBにも追加

DataImportHandlerを使わないでその3でいい気がしてきた
けどDBに形態素解析した結果を保持するとTweetと冗長か
けどもしインデックスが消えたら、すべてのTweet形態素解析し直さなきゃいけなくて恐ろしく時間がかかる。インデックスを毎日バックアップしておけばその心配もないか。ということでその2に決定

Lucene本を読みながらインデックスの作成を作り直す。

  • クローラ、index作成クラスの仕事
    1. 日本語のPublicTimeLineをいろいろな情報と共にDBに追加
    2. 取得したTweetをSenで形態素解析
    3. その解析した文字と取得したユーザー名からから、そのままインデックスに追加

まだDBのファイルDL終わらないから,先に2,3を実装しよう

予定変更
DB必要なし!
その4

[ { "url": "http://twitter.com/wata308/status/000000000", "image": "http://s3.amazonaws.com/twitter_production/profile_images/000000000/a.jpg", "time2": "2009-06-25T16:14:51+09:00", "content": "TWEEEEEEEEEET", "user": "snkken", "time": "2009-06-25 16:14:51", "id": 000000000 }, 
  1. 日本語のPublicTimeLineをいろいろな情報取得(取得できる情報は上記の通り
  2. contentをJapaneseAnalyzerで形態素解析
  3. 形態素解析した文字列とuserからオリジナルのアナライザを使ってインデックスを作成

やっぱりDB必要だ。検索結果としてアイコンを表示しようと思うと、DBにそれらの除法を残しておいた方がいい。ユーザー名からshowStatus()で情報取得してると、すぐにAPI制限だ
本当は自分で日本語PublicTimelineのクローラを作れば色々できるんだけど、そのスキルがないために色々制限されちゃう
firehose使えれば簡単なのになー


だいたいできたと思うけど、analyzer-sen.xmlで指定している以外のものも形態素解析の結果として帰って来ちゃう


日本語のクロールとインデックスを1分ごとに自動的にやるもの完成
あとは他の情報をDBに追加する作業

MySQLのバックアップ

mysqldump --user=root -x -F --all-databases > db.dmp

利用者がアクセスする事できる状態のままバックアップって難しいみたい

最初はサーバ2台用意するつもりはないからレプリケーションできないし、どうしたものか

よく考えたら利用者はMySQLに兆ksetuアクセスするわけじゃないのだから、自分が好きなときにMySQLロックしても何の問題もなかったんだ
解決

あとはDBにアクセスするプログラムが止まっているときにdumpすればOK
そのタイミングが問題か
基本的にプログラムはずっと一定間隔で動かす予定だからなー
バックアップ時間になったら2分ぐらい止めるっていうの単純でいいかな

Apache Lucne入門を買った

Apache Lucne入門を買った
買って良かった
Index周りだいぶ適当にやってたからそこらへんを綺麗に書けば速度上げられそう
ただところどころ古いのが残念
Hitsクラスとか使ってたりしちゃう