Chúng tôi đang đánh giá hiệu suất ArangoDB trong không gian tính toán các khía cạnh. Có số sản phẩm khác có khả năng làm như vậy, hoặc thông qua đặc biệt API hoặc truy vấn ngôn ngữ:Hiệu suất tìm kiếm mặt ArangoDB
- MarkLogic khía cạnh
- ElasticSearch tính gộp
- Solr faceting vv
Chúng tôi hiểu, có không có API đặc biệt nào trong Arango để tính toán thực tế một cách rõ ràng. Nhưng trong thực tế, nó không phải là cần thiết, nhờ một AQL toàn diện có thể dễ dàng đạt được thông qua truy vấn đơn giản, như:
FOR a in Asset
COLLECT attr = a.attribute1 INTO g
RETURN { value: attr, count: length(g) }
Truy vấn này tính toán một thuộc tính trên attribute1 và sản lượng tần số trong các hình thức:
[
{
"value": "test-attr1-1",
"count": 2000000
},
{
"value": "test-attr1-2",
"count": 2000000
},
{
"value": "test-attr1-3",
"count": 3000000
}
]
Có nghĩa là, trên toàn bộ thuộc tính bộ sưu tập của tôi, tôi đã lấy ba biểu mẫu (test-attr1-1, test-attr1-2 và test-attr1-3) với số lượng liên quan được cung cấp. Khá nhiều, chúng tôi chạy truy vấn DISTINCT và số lượng tổng hợp.
Trông đơn giản và sạch sẽ. Chỉ với một, nhưng vấn đề thực sự lớn - hiệu suất.
Truy vấn được cung cấp ở trên chạy trong 31 giây! ở đầu bộ sưu tập thử nghiệm với chỉ 8 triệu tài liệu. Chúng tôi đã thử nghiệm với các loại chỉ mục khác nhau, công cụ lưu trữ (với rocksdb và không có), điều tra các kế hoạch giải thích không có kết quả. Tài liệu kiểm tra mà chúng tôi sử dụng trong thử nghiệm này rất ngắn gọn chỉ với ba thuộc tính ngắn.
Chúng tôi đánh giá cao bất kỳ đầu vào nào vào thời điểm này. Hoặc là chúng tôi làm sai điều gì đó. Hoặc ArangoDB đơn giản là không được thiết kế để thực hiện trong lĩnh vực cụ thể này.
btw, mục tiêu cuối cùng sẽ chạy một cái gì đó giống như thời gian sau ở những cơ sở thứ hai:
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)
}
}
Cảm ơn!