2017-09-14 2 views
5

Wir bewerten ArangoDB Leistung im Raum der Facetten Berechnungen. Es gibt eine Reihe von anderen Produkten der Lage, das gleiche zu tun, entweder über spezielle API oder Abfragesprache:ArangoDB Facettierte Suchleistung

  • Marklogic Facets
  • Elasticsearch Aggregationen
  • Solr Facettierungsfaktor etc

Wir verstehen, da ist keine spezielle API in Arango, um factes explizit zu berechnen. Aber in Wirklichkeit ist es nicht erforderlich ist, dank einem umfassenden AQL kann es leicht über einfache Abfrage erreicht werden, wie zB:

FOR a in Asset 
    COLLECT attr = a.attribute1 INTO g 
RETURN { value: attr, count: length(g) } 

Diese Abfrage eine Facette auf attribute1 und Ausbeuten Frequenz in Form berechnen:

[ 
    { 
    "value": "test-attr1-1", 
    "count": 2000000 
    }, 
    { 
    "value": "test-attr1-2", 
    "count": 2000000 
    }, 
    { 
    "value": "test-attr1-3", 
    "count": 3000000 
    } 
] 

Es heißt, dass über mein gesamtes Kollektionsattribut1 drei Formen (test-attr1-1, test-attr1-2 und test-attr1-3) mit zugehörigen Zählungen erhalten. So ziemlich führen wir eine DISTINCT-Abfrage und aggregierte Zählungen aus.

Sieht einfach und sauber aus. Mit nur einem, aber wirklich großen Problem - Leistung.

Vorausgesetzte Abfrage läuft für! 31 Sekunden! oben auf der Testsammlung mit nur 8M Dokumenten. Wir haben mit verschiedenen Indextypen, Speicher-Engines (mit rocksdb und ohne) experimentiert, Erkundungspläne vergeblich untersucht. Testdokumente, die wir in diesem Test verwenden, sind sehr knapp mit nur drei kurzen Attributen.

Wir würden uns über jede Eingabe an dieser Stelle freuen. Entweder machen wir etwas falsch. Oder ArangoDB ist einfach nicht dafür ausgelegt, in diesem speziellen Bereich zu funktionieren.

btw, würde ultimative Ziel sein, etwas wie folgt in Unter zweiten Mal ausgeführt wird:

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) 

    } 

} 

Dank!

Antwort

3

Es stellte sich heraus, dass Hauptthread auf ArangoDB Google Group passiert ist. ist hier ein link to a full discussion

Hier ist eine Zusammenfassung der aktuellen Lösung:

  • Run Maßarbeit des Arango aus einem bestimmten Funktionszweig, wo Anzahl von Leistungsverbesserungen vorgenommen wurde (hoffen, dass sie es machen sollten zu einem Haupt-Release in Kürze)
  • werden keine Indizes für eine Facetten Berechnungen erforderlich
  • MMFiles eine bevorzugte Speicher-Engine ist
  • AQL wr sein sollte "COLLECT attr = a.attributeX MIT COUNT INTO Länge "statt" count: length (g) "
  • AQL sollte in kleinere Teile aufgeteilt und parallel ausgeführt werden (wir führen Java8's Fork/Join aus, um Facetten-AQLs zu verteilen und sie dann zu einem Endergebnis zusammenzufügen
  • )
  • One AQL/Art zu filtern, und die Haupteinheit abzurufen (falls erforderlich. beim Sortieren/Filtering skiplist index)
  • der Rest sind kleine AQLs für jede Facette Wert/Frequenzpaare

in der Add entspricht Ende haben wir gewonnen > 10x Leistungssteigerung im Vergleich zu einem Original AQL oben