2017-09-14 12 views
5

우리는 패싯 계산 공간에서 ArangoDB 성능을 평가 중입니다. 같은 일을 할 수있는 다른 제품 중 특별한 API 또는 쿼리 언어를 통해 수 있습니다ArangoDB 측면 검색 성능

  • MarkLogic 패싯
  • ElasticSearch 집계
  • SOLR 패 시팅 등

우리는 이해하고, 거기를 사실을 명시 적으로 계산하는 Arango의 특별한 API는 없습니다. 의 형태로 속성 1 및 수율 주파수에면을 계산

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

이 쿼리 : 현실에서 필요하지 않은 그러나 는 포괄적 인 AQL에 대한 감사 쉽게 같은 간단한 쿼리를 통해 달성 될 수있다

전체 컬렉션 속성 1은 관련 카운트가 제공된 3 가지 형식 (test-attr1-1, test-attr1-2 및 test-attr1-3)을 사용했습니다. 거의 DISTINCT 쿼리를 실행하고 집계 된 수입니다.

간단하고 깨끗하게 보입니다. 하나지만, 실제로는 큰 문제 - 성능.

위의 검색어는 31 초 동안 실행됩니다! 단 8M 문서로 테스트 컬렉션 상단에 있습니다. 우리는 다른 인덱스 유형, 스토리지 엔진 (rocksdb와 함께)을 사용해 실험 계획을 세우고 설명 계획을 조사했습니다. 이 테스트에서 사용하는 테스트 문서는 세 가지의 짧은 특성으로 매우 간결합니다.

이 시점에서 입력 사항을 알려 주시면 감사하겠습니다. 우리는 뭔가 잘못하고 있습니다. 또는 ArangoDB는 단순히이 특정 영역에서 수행하도록 설계되지 않았습니다.

BTW, 궁극적 인 목표는 아래 초에 다음과 같은 시간 같은 것을 실행하는 것입니다 :

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 그룹에서 주 스레드가 발생했습니다. 여기 는 현재 솔루션의 요약 여기 link to a full discussion

입니다 : 성능 향상의 번호가 완료되었습니다 특정 기능 지점에서 아란의

  • 실행 사용자 지정 빌드 (그들은 그것을해야 희망 곧 주요 자료)에
  • 없음 인덱스는
  • MMFiles는면 계산을 위해 선호하는 스토리지 엔진
  • 에게 AQL은 WR해야입니다 필요하지 않습니다 사용하는 itten "COLLECT attr = a.
  • AQL을 작은 조각으로 분할하고 병렬로 실행해야합니다 (Java8의 Fork/Join을 실행하여 패싯 AQL을 확산 한 다음 최종 결과에 결합해야 함).)
  • 하나 AQL 필요한 경우 분류있다./필터링은에서는 skiplist 인덱스)
  • 나머지 각 패싯 값 작은 AQLs하고/주파수 쌍

대응하는 추가 (주요 엔터티/일종의 필터링하고 검색 할 위에서 제공된 원본 AQL과 비교하여 > 10x의 성능 향상을 얻었습니다 ..