2012年1月16日月曜日

Google App Engine で動く全文検索ライブラリのデモをアップしました

以前の記事で紹介したGoogle App Engine で動く全文検索ライブラリのデモをアップしました。
http://beryl-demo.appspot.com/search/
できることはコメントの登録とそれに対する検索、インデックスの閲覧となります。
ちなみに、カテゴリーは指定した場合、完全一致による検索、
通常の検索条件はテキストとタイトルに対する全文検索を行います。
また、全文検索の方はAND OR NOT の演算子と括弧()による評価順の指定ができます。

デモサイトの使用は常識的な範囲で使用してもらって大丈夫です。
むしろコメントはデータ収集のためにじゃんじゃか登録して欲しいくらい。
課金はしていないので、オーバークォータになったらゴメンナサイ。

近いうちに解説の文書をアップロードする予定です。

ちなみに、転置インデックスを作成する際のソースコードは次のような感じ。
protected void commentIndexUpdate(Long id, boolean isDeleteOnly) {
    // 保存先ディレクトリとアナライザの取得
    Directory directory = DatastoreDirectory.getInstance();
    Analyzer analyzer = GomokuAnalyzer.getInstance();
    IndexReader reader = new IndexReader(directory);
    IndexWriter writer = new IndexWriter(directory, analyzer);

    // インデックスに登録する情報を取得
    Key key = Datastore.createKey(CommentModel.class, id);

    // 既存のインデックス情報を削除
    List oldDocumentKeys = reader.getDocumentIds(key);
    for (long oldDocumentKey : oldDocumentKeys) {
        writer.deleteDocument(oldDocumentKey);
    }

    // ドキュメント生成・登録
    if (!isDeleteOnly) {
        CommentModel comment = Datastore.get(CommentModel.class, key);
        DocumentModel document = new DocumentModel();
        document.setOriginalKey(comment.getKey());
        Field keyField = new Field(
                "key", id.toString(), Store.YES, Index.NO);
        Field titletField = new Field(
                "title", comment.getTitle(), 
                Store.YES, Index.TOKENIZED);
        Field readingtField = new Field(
                "category", comment.getCategory(), 
                Store.YES, Index.UN_TOKENIZED);
        Field textField = new Field(
                "text", comment.getText(), Store.NO, Index.TOKENIZED);
        document.add(keyField, titletField, readingtField, textField);
        writer.addDocument(document);
    }
}

2011年12月9日金曜日

集合知プログラミングの勉強会に参加してきた

「集合知プログラミング」の勉強会に参加してきた。
人生初の勉強会、しかも初参加なのに最終回というw
内容は全体のおさらいということで、
いろいろなアルゴリズムをざっくり見て特徴を知ることができた。
ただ、きちんと自分のものにするには、しっかり本を熟読する必要を改めて実感。

でも、その前にPythonを勉強したいと思った。
「集合知プログラミング」はPythonでコードが書かれていて、
今のところ雰囲気で読んでるけど、アルゴリズムを相手にしている以上
きちんと理解して読まないと、穴や抜けが出てしまう。
善は急げでAmazonでPythonの入門書と「入門 ソーシャルデータ」を購入。
……また”積ん読”が増えてしまったような気がするw

次回以降は「入門 ソーシャルデータ」の方を扱っていくようで、
そちらにもなるべく参加したいと思っている。
集合知しかり、DHWしかりで「データを有効活用する」って
考え方は昔からあるし、その恩恵を日々受けているわけだけど、
そこから情報として価値を引き出すのは、なかなか難しい。
でも、情報処理の醍醐味って結局はそこだから、
ソーシャルとかビッグデータといったはやりに囚われず、
しっかりとみにつけていきたいところ。

2011年12月7日水曜日

Google App Engine で動く全文検索ライブラリを作成

Google App Engine上で全文検索はいろんな人が試しているようだが、
汎用的なライブラリとかを作っているひとがいないので、
自分でライブラリを実装してみた。
目指したのは、シンプルなインターフェース、メンテナンスフリー、そして高速性。

主な特徴は以下のとおり。
  • 全コードフルスクラッチで作成(だいたい2週間くらい)
  • Luceneライクなクラス・インターフェース
    ※あくまでライクなだけ、クラス名とか概要を参考にしただけなので、実際別物
  • 基本機能部分は抽象化されているので、継承させることで簡単にカスタマイズ可能
  • 内部でSlim3を使用している。(使わなくても実装できたと思う)
  • 形態素解析器にGomokuを使用。
    N-Gramはアナライザ作ってないけど、作ればN-Gramでもインデックス作成が可能
  • コンポジットインデックスを使わない。(インデックス爆発しない)
    エンティティグループとシングルプロパティインデックスだけ使用
  • インデックスの作成・削除は任意のタイミングででき、最適化とかは不要
  • 動作は結構早いっぽい。まだ10KB程度しか試してないけど。大体20ミリ秒くらい。
  • GAEのキーを内部に持つので、インデックス自体が大きめ
  • インデックス作成時にDatastoreに書き込みまくりでコスト高め
  • 読み込みは然程でもない。(エンティティグループが効いてる?)
  • 検索には AND OR NOT と ( ) が使用可能。
    ぐちゃぐちゃな条件でもそれなりに解釈する
もうちょっとコードがまとまったらサンプルサイトをアップする予定。
…Luceneライクといってるけど、実はLucene使ったことがない……w