TokyoCabinet::TDB(テーブルデータベース)の検索クエリまとめと参照したページまとめ

作者のmikioさんも推している所ではあるけれど、TDBではkey-value-storeとしてはかなり豊富な検索が行える。まとめたというほどでもないけど、整理してみた。

  • QCSTR*系(string)
    • EQ:コラムの文字列と等しい
    • INC:コラムの文字列に〜が含まれる
    • BW:コラムが〜で始まる
    • EW:コラムが〜で終わる
    • AND:token(タグ)検索
    • OR:token(タグ)検索
    • OREQ:(これまだ理解していない)
    • RX:token(タグ)検索・正規表現で検索
#token検索の例
#TDBを開く
db.put("1",{"lang"=>"ruby,c++,perl,c"})
db.put("2",{"lang"=>"perl,c,python"})
db.put("3",{"lang"=>"c++,perl,python"})
db.put("4",{"lang"=>"c"})
qry = TDBQRY::new(db)
qry.addcond("lang", TDBQRY::QCSTRAND,"c,python")#cとpythonを両方含む
p qry.search() #=> ["2"] c++は一致しないのがミソ
#TDBを閉じる

他の例

#データは上と同じ
qry = TDBQRY::new(db)
qry.addcond("lang", TDBQRY::QCSTRRX,"p.*")#正規表現で検索。pで始まるtokenを含む
p qry.search()#=> ["1", "2", "3"]

否定するときはTDBQRY::QCNEGATEを使う。

#データは上と同じ
qry = TDBQRY::new(db)
qry.addcond("lang", TDBQRY::QCSTROR|TDBQRY::QCNEGATE,"c,python")#(c,pythonをどちらか含む)の補集合
p qry.search()#=>[]
#データは上と同じ
qry = TDBQRY::new(db)
qry.addcond("lang", TDBQRY::QCSTRAND|TDBQRY::QCNEGATE,"c,python")#(c,pythonを両方含む)の補集合
p qry.search()#=> ["1", "4", "3"]
  • QCNUM*系(number)
    • EQ:等しい
    • GT:より大きい
    • GE:以上
    • LT:より小さい
    • LE:以下
    • BT:2数の間
    • OREQ:コラムに含まれるカンマ区切りの数字のどれかに等しい
#ここの例は省略
  • QCFTS*系(Full text search)
    • PH:〜を含む
    • AND:全てを含む
    • OR:どれかを含む
    • EX:複雑な検索表現を使う
#ここの例はもう少し理解してから書きます

(リンク)検索について述べているページ

mixi engineer blog
mixi engineer blog
mixi engineer blog