Sponsored Link


傀儡師のプログラミング日記

IndexedCatalog について (2003/09/18)

IndexedCatalog 0.6 RC1 がリリースされたので、ちょっと IndexedCatalog に ついてまとめてみることにしました。詳しくは、IndexedCatalog のオリジナルページを参照してください このページは、IndexedCatalog のページから主として情報を取り出したものです。

IndexCatalog とは何か

IndexCatalog は、Zope のオブジェクトデータベース(Zope Object Database (ZODB)) を使用することを前提としたもので、ZODB に格納されたオブジェクトの一覧を作成し (カタログ化)し、このカタログに格納されたオブジェクトを、属性値などを検索キー として高速に検索できるように索引(インデックス)をつける仕組みです。
つまり、ZODB を拡張し、オブジェクトの属性値などのすべてのフィールドの値を string/integer/float のいずれかの型の値をキーとした取り出しやすい形式で ZODB 内に格納し(つまり索引を作成し)、これに対して検索うインターフェイスを 備えたものということになるでしょう。まだ、こなれた説明になっていませんが、 気にしないことにして、先に進みます。
ZODB のカタログとはいっても、Zope ではこのパッケージは使用できません。 IndexCatalog は、ZODB を使ったスタンドアロンのその他のパッケージ用に 現状で開発されているものです。ライセンスは Lesser GNU Public Licence (LGPL)です。

IndexCatalog を機能から見ると次のようになります
  • オブジェクトを格納するクラスとしてCatalog クラスがあり、この Catalog クラスは クエリインターフェイスを備えています。
  • インデックス化できるのは、文字列、浮動小数点数、整数、日付、およびインスタンスです。
  • オブジェクトをカタログ化しインデックスを付与するためには、格納するオブジェクトを若干 変更する必要があります。基本的には、from IndexedCatalog.IndexedObject を継承したクラス を作成し、そのクラスにいくつか特別の属性を追加するだけです。そして、オブジェクトの インスタンスをカタログに追加するには catalog.insert() を使います。
  • 複合オブジェクト(composite object) にも対応しており、サブオブジェクトの初期化と インデックス生成は、自動的に行われます。
  • 型による検索(クエリ)に対応し、サブオブジェクトや参照されている オブジェクト(referenced object)の属性値に対してクエリを発行することも可能です。
  • 検索結果の並び順は、フィールドの値によって昇順にも降順にも整列することが可能です。
  • 100% pure python で作成されており、インストールには Distutils を使用しています。 このため非常に簡単にインストールできます。
以上、IndexedCatalog のアバウトに訳したもの

例として、まず IndexedCatalog の例を参考にし、これをちょっと変形して 単語を登録できるようなものを作成してみました。

#!/usr/bin/env python

from IndexedCatalog import Catalog, IndexedObject

# 最初にオブジェクトを定義します。
# このオブジェクトは (IndexedCatalog.)IndexedObject を
# 継承したものにしなければなりません。
# また、
# 整数型(IntType) の属性(フィールド)と
# 文字列型(StringType) の属性(フィールド)を追加しておきます。
class WordObject(IndexedObject):
    length = int
    word = str

    def __init__(self, word):
        IndexedObject.__init__(self)
        self.word = word
        self.length = len(word)


wordlist = ['zero','one','two','three','four','five','six','seven','eight','nine','ten']

# カタログを作成しますが、このときコンストラクタに
# 引数として、上記のクラスを渡します。
catalog = Catalog(WordObject)

# サンプルとして、11個のオブジェクトを作成してみます。
for s in wordlist:
    # カタログオブジェクトを作成し
    obj = catalog.new(s)
    # ここは入れるとエラーになってしまう...
    # catalog.insert(obj)


# すべてのオブジェクトに対して、
# length が 4 以上のもの(4文字以上の単語) を検索してみます
print "length が 4 以上のもの"
results = catalog.query('length >= 4')
for result in results.sort('length'):
    print result, result.word, result.length

# すべてのオブジェクトに対して
# word のうち three を含むものを検索してみます。
print "word が three のもの"
results = catalog.query('word == "three"')
for result in results.sort('length'):
    print result, result.word, result.length

print "word が eight のもの"
results = catalog.query('word == "eight"')
for result in results.sort('length'):
    print result, result.word, result.length

# 実行してみると

$ python a.py
length が 4 以上のもの
<__main__.WordObject ( 145760928) at 0x137197648> nine 4
<__main__.WordObject ( 643557441) at 0x137063272> zero 4
<__main__.WordObject ( 897793739) at 0x137194448> five 4
<__main__.WordObject (1027051739) at 0x137193648> four 4
<__main__.WordObject (-873929443) at 0x137196048> seven 5
<__main__.WordObject (-183619027) at 0x137196848> eight 5
<__main__.WordObject ( 697292769) at 0x137192712> three 5
word が three のもの
<__main__.WordObject ( 697292769) at 0x137192712> three 5
word が eight のもの
<__main__.WordObject (-183619027) at 0x137196848> eight 5


とりあえずは、なんとなく、動いているような感じなので、 次は、もう少し実用的なものにチャレンジしてみることにしよう。
Blog

TinyBlog について

傀儡師の館(楽天)

pyblosxom テスト中

自然言語処理について

人工無能について

Python について

Copyright (c) 2003, Kugutsushi