公式のpythonドライバでRethinkdb 1.10.1を使用しています。私は1人のユーザーに関連付けられているタグ付けされたもののテーブルを持っている:rethinkdbで複合マルチインデックスを作成するにはどうすればよいですか?
{
"id": "PK",
"user_id": "USER_PK",
"tags": ["list", "of", "strings"],
// Other fields...
}
私はuser_id
とtag
(例えば、タグ「タグ」を持つユーザー「tawmas」ですべてのものを見つけるために)で照会します。 、
res = (r.table('things')
.get_all('TAG', index='tags')
.filter(r.row['user_id'] == 'USER_PK').run(conn))
しかし、このクエリはまだ与えられたタグを持つすべての文書をスキャンする必要があります。
r.table('things').index_create('tags', multi=True).run(conn)
私のクエリは次のようになります。Rethinkdb 1.10以降では、私は、このようなマルチインデックスを作成することができますそこで私はuser_idとtagsフィールドに基づいて複合インデックスを作成したいと思います。このようなインデックスを使用すると、次のクエリを使用できます。
res = r.table('things').get_all(['USER_PK', 'TAG'], index='user_tags').run(conn)
複合マルチインデックスについては、ドキュメントには何もありません。しかし、 は、["USER_PK", "tag"]
ペアのリストを返すことによって、複合インデックスのインデックスとマルチインデックスの要件を組み合わせたカスタムインデックス関数を使用しようとしました。
私の最初の試みは、pythonでいた:
r.table('things').index_create(
'user_tags',
lambda each: [[each['user_id'], tag] for tag in each['tags']],
multi=True).run(conn)
はこれが(私はリストの内包表記は本当にドライバーによってサポートされていないと思います)、インデックス機能を解析しようMemoryError
とPythonのドライバチョークを作ります。
だから、私は私の(確かに、さび)になって、JavaScriptとこれを思い付いた:
r.table('things').index_create(
'user_tags',
r.js(
"""(function (each) {
var result = [];
var user_id = each["user_id"];
var tags = each["tags"];
for (var i = 0; i < tags.length; i++) {
result.push([user_id, tags[i]]);
}
return result;
})
"""),
multi=True).run(conn)
これは、好奇心旺盛な例外を除いて、サーバーによって拒否されていますrethinkdb.errors.RqlRuntimeError: Could not prove function deterministic. Index functions must be deterministic.
だから、何です複雑なマルチインデックスを定義する正しい方法は?それとも今のところサポートされていない何か ですか?
ところで。 Rethink pythonドライバの最新バージョンでは、これを実行すると、私が間違っていることを説明するエラーメッセージが表示されます。古いバージョンのドライバがインストールされている可能性はありますか? –
私は先週インストールされたバージョン1.10.0-0を持っています。 PyPIで公開されている新しいバージョンはないようです。あなたは開発版を指していますか? – tawmas