2017-09-14 18 views
5

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!

Trả lời

3

Tắt chủ đề chính đã xảy ra trên ArangoDB Google Group. Đây là một link to a full discussion

Dưới đây là một bản tóm tắt các giải pháp hiện tại:

  • Run tùy chỉnh xây dựng của Arango từ một chi nhánh tính năng cụ thể mà số cải tiến hiệu suất đã được thực hiện (hy vọng họ sẽ làm cho nó một thông cáo chính sớm)
  • Không chỉ được yêu cầu cho một tính toán khía cạnh
  • MMFiles là một công cụ lưu trữ ưa thích
  • AQL nên wr itten để sử dụng "COLLECT attr = a.attributeX WITH COUNT INTO length "thay vì" count: length (g) "
  • AQL nên được chia thành các phần nhỏ hơn và chạy song song (chúng tôi đang chạy Fork/Join của Java8 để trải rộng các mặt AQL và sau đó kết hợp chúng thành kết quả cuối cùng)
  • Một AQL để lọc/sắp xếp và lấy thực thể chính (nếu có yêu cầu. trong khi sắp xếp/lọc thêm tương ứng với chỉ số skiplist)
  • phần còn lại là AQLs nhỏ cho mỗi giá trị khía cạnh/cặp tần số

Trong cuối cùng, chúng tôi đã đạt được > 10x hiệu suất đạt được so với AQL gốc được cung cấp ở trên.

Các vấn đề liên quan