ラベル Google App Engine の投稿を表示しています。 すべての投稿を表示
ラベル Google App Engine の投稿を表示しています。 すべての投稿を表示

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月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