ファセット計算のスペースでArangoDBのパフォーマンスを評価しています。 同じことを行うことのできる他の製品の数はいずれかの特殊なAPIやクエリ言語を経由して、ありますArangoDBファセット検索パフォーマンス
- MarkLogicファセット
- ElasticSearch集計
- Solrのファセットが我々が理解など
、ファクトを明示的に計算するためのArangoの特別なAPIはありません。 しかし、現実には、それは、包括的なAQLのためのおかげで必要とされていない、簡単のように、単純なクエリを介して達成することができる:
:このクエリは、の形でattribute1と利回り周波数上のファセットを計算FOR a in Asset
COLLECT attr = a.attribute1 INTO g
RETURN { value: attr, count: length(g) }
私のコレクション全体で、属性1は3つの形式(test-attr1-1、test-attr1-2およびtest-attr1-3)を持ち、関連するカウントが提供されています。 ほとんどの場合、DISTINCTクエリと集計カウントが実行されます。
シンプルできれいに見えます。ただ1つ、しかし本当に大きな問題 - パフォーマンス。
上記のクエリは、31秒間実行されます。テストコレクションの上にはわずか8Mのドキュメントしかありません。 私たちはさまざまなインデックスタイプ、ストレージエンジン(rocksdbとwithout)を試して、説明計画を無駄に調査しました。 このテストで使用するテスト文書は、3つの短い属性で非常に簡潔です。
この時点では、どんな入力をいただければ幸いですか? 私たちは何か間違っている。あるいは、ArangoDBは、この特定の分野で単に実行するようには設計されていません。
ところで、究極の目標は、下秒の時間で、次のようなものを実行するために、次のようになります。
LET docs = (FOR a IN Asset
FILTER a.name like 'test-asset-%'
SORT a.name
RETURN a)
LET attribute1 = (
FOR a in docs
COLLECT attr = a.attribute1 INTO g
RETURN { value: attr, count: length(g[*])}
)
LET attribute2 = (
FOR a in docs
COLLECT attr = a.attribute2 INTO g
RETURN { value: attr, count: length(g[*])}
)
LET attribute3 = (
FOR a in docs
COLLECT attr = a.attribute3 INTO g
RETURN { value: attr, count: length(g[*])}
)
LET attribute4 = (
FOR a in docs
COLLECT attr = a.attribute4 INTO g
RETURN { value: attr, count: length(g[*])}
)
RETURN {
counts: (RETURN {
total: LENGTH(docs),
offset: 2,
to: 4,
facets: {
attribute1: {
from: 0,
to: 5,
total: LENGTH(attribute1)
},
attribute2: {
from: 5,
to: 10,
total: LENGTH(attribute2)
},
attribute3: {
from: 0,
to: 1000,
total: LENGTH(attribute3)
},
attribute4: {
from: 0,
to: 1000,
total: LENGTH(attribute4)
}
}
}),
items: (FOR a IN docs LIMIT 2, 4 RETURN {id: a._id, name: a.name}),
facets: {
attribute1: (FOR a in attribute1 SORT a.count LIMIT 0, 5 return a),
attribute2: (FOR a in attribute2 SORT a.value LIMIT 5, 10 return a),
attribute3: (FOR a in attribute3 LIMIT 0, 1000 return a),
attribute4: (FOR a in attribute4 SORT a.count, a.value LIMIT 0, 1000 return a)
}
}
ありがとう!