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!