2017-09-14 15 views
5

ファセット計算のスペースで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) 

    } 

} 

ありがとう!

答えて

3

ArangoDB Google Groupでメインスレッドが発生しました。ここ はここlink to a full discussion

ある現在のソリューションの概要です:

  • アランゴの実行カスタムビルドパフォーマンスの改善の数が行われている特定の機能ブランチからは、(彼らはそれを行う必要があります願っています)すぐにメインリリースに
  • なしインデックスがファセット計算
  • MMFilesのために必要とされない好適なストレージエンジンである
  • AQLは、WRであるべきです使用するitten "COLLECT attr = a。
  • AQLを分割して並列に実行する必要があります(Java8のFork/Joinを実行してファセットAQLを分散し、最終結果に結合する必要があります) )
  • つAQL必要に応じて並べ替え/フィルタリングはskiplistインデックスを対応する追加する。(/ソートをフィルタリングし、メインエンティティを取得する)
  • 残り各ファセット値/周波数ペアで

ための小さなAQLsあります上記で提供された元のAQLと比較して、> 10xのパフォーマンスが得られました。

関連する問題