東京内閣の資料から引用します...
ハッシュテーブルのデータベースは、各キーがデータベース内で一意でなければならないため、キーが重複する複数のレコードを格納することはできません。
または tokyocabinet はタプルベースのキーを許可しますか?
1 対多のストアを設定する最良の方法は何ですか (クローラー 1 kw<->many docids など)
~B
東京内閣の資料から引用します...
ハッシュテーブルのデータベースは、各キーがデータベース内で一意でなければならないため、キーが重複する複数のレコードを格納することはできません。
または tokyocabinet はタプルベースのキーを許可しますか?
1 対多のストアを設定する最良の方法は何ですか (クローラー 1 kw<->many docids など)
~B
テーブルデータベース(TDB)を使用すると、キーのリストを1つの値にトークンとして簡単に格納できます。キーが有効な「トークン」である限り、この方法で1つのフィールドに簡単にリストできます。
Pyrantの低レベルインターフェイスを使用した例を次に示します。
>>> from pyrant import Tyrant
>>> t = Tyrant()
>>> includes = 5 # code for operation TDBQCSTROR
>>> t['test'] = {'foo': 'abc,def', 'bar': 'abc def', 'quux': 'abcdef'}
>>> t.proto.search([('foo',includes,'abc')])
[u'test']
>>> t.proto.search([('bar',includes,'abc')])
[u'test']
>>> t.proto.search([('quux',includes,'abc')])
[]
>>> t.proto.search([('quux',includes,'abcd')])
[]
>>> t.proto.search([('quux',includes,'abcdef')])
[u'test']
TDBQCSTRORは、「文字列に少なくとも1つのトークンが含まれています...」を表す操作タイプです(東京内閣API仕様の「tctdbqryaddcond」を参照)。
「abc、def」と「abcdef」の両方が「abc」キーワードと一致しましたが、「abc」は実際には「abcdef」のサブセットであるにもかかわらず、「abcdef」は一致しなかったことに注意してください。これは、単一の文字列に格納されているキーを検索するために使用できます。例:
t['tokyocabinet'] = {'title': 'Tokyo Cabinet'}
t['primary-key'] = {'title': 'Primary Key'}
t['question1228313'] = {
'title': 'how to build one to many rows in tokyo cabinet?',
'tags': 'tokyocabinet, primary-key',
}
(タグは参照である必要がないため、おそらく最良の例ではありません。)
別の種類のTCデータベース(TDBではない)を使用している場合、有効な解決策を想像することはできません。関連するディスカッショングループでこの質問をすることをお勧めします。
ハッシュテーブルのデータベースは、データベース内で各キーが一意である必要があるため、キーが重複しているレコードを2つ以上保存することはできません。
B + -Tree Tokyo Cabinetデータベースでは、重複キーが許可されています。
bool tcbdbputdup(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz);
Ruby APIの使用:
TokyoCabinet::BDB.putdup(key, value) -> true|false
TokyoCabinet::BDB.getlist(key) => [value, ...]|nil