2017-03-10 1 views
3

product_skus의 인덱스에서 주어진 공급 업체의 제품 skus를 조회하는 판매 지수와 비교하여 주어진 공급 업체 ID에 대해 상위 100 개의 판매자를 생성하는 다음과 같은 쿼리가 있습니다. 이것은 잘 작동합니다.탄력 쿼리 필터 챌린지

query = { 
    size: 0, 
    query: { 
    bool: { 
     filter: [ 
     { 
      constant_score: { 
      filter: { 
       terms: { 
       sku: { 
        index: "product_skus", 
        type: "product", 
        id: supplier_id, 
        path: "skus" 
       } 
       } 
      } 
      } 
     } 
     ], 
     must_not: [] 
    } 
    }, 
    aggs: { 
    unit_sum: { 
     terms: { 
     field: "sku", 
     size: 100, 
     order: { 
      one: "desc" 
     } 
     }, 
     aggs: { 
     one: { 
      sum: { 
      field: "units" 
      } 
     } 
     } 
    } 
    } 
} 

이제 특정 사용자가 공급자 skus의 하위 집합에 대한 액세스 권한을 제한해야하는 시나리오가 있습니다. 나는이 문제를 해결할 수있는 최선의 방법을 모색하고있다. 사용자가 Skus에 액세스하여 두 번째 조회를 수행 할 수있는 다른 색인이있는쪽으로 향하고 있지만 쿼리 논리를 머리에 쓰지는 못합니다.

예를 들어, 위의 쿼리에서 공급자 1에 대해 [A, B, C, D, E] 제품을 반환하고 John은 제품 [A, C, E]을 기반으로 한 결과 만 볼 수 있습니다. 이 쿼리? bool 내부의 필터 다음에 should 절을 추가하는 것만 큼 간단합니까?

미리 감사드립니다.

+0

정말 소수의 사용자가 액세스 할 수있는 SKU의 수에 따라 달라질 것입니다. 추가 조항을 사용하여 벗어날 수 있다고 생각합니다. 수백 개라면 다른 솔루션이 필요할 것입니다. –

+0

네, 수천이 아니라해도 수백 명이되는 것이 좋습니다. – Raoot

+0

라우팅 사용에 대해 생각해 보셨습니까? https://www.elastic.co/blog/customizing-your-document-routing – Adonis

답변

0

시나리오는 사용자가 라우팅을 사용할 수 있도록하기 때문에 상황에 따라 라우팅이 필요할 수 있습니다. 데이터를 별도의 조각으로 구성하는 추가 보너스로 쿼리에서 라우팅을 사용할 때 성능을 향상시킬 수 있습니다. 왜? 라우팅을 사용할 때 요청은 클러스터의 모든 노드 대신 관련된 데이터가 들어있는 샤드에만 전달되기 때문에

귀하의 경우에는 어떻게됩니까?

product_skus의 매핑 (필요에 따라 수정) :

PUT product_skus 
{ 
    "settings": { 
    "index": { 
     "number_of_shards": "5", 
     "number_of_replicas": "1" 
    } 

    }, 
    "mappings": { 
    "product": { 
     "_routing": { 
     "required": true 
     }, 
     "properties": { 
     "supplierId":{ 
      "type": "integer" 
     }, "path":{ 
      "type": "string" 
     } 
     } 
    } 
    } 
} 
이제

의가에 제품을 넣어 보자의 간단한 매핑을보고, 유일한 id를 123으로 액세스해야 제품을 보자 인덱스 유형 (라우팅 통지) :

POST product_skus/product?routing=123 
{ 
    "supplierId": 123, 
    "path": "some/path" 
} 

그리고 마지막으로 두 요청 및 라우팅 사용하여 출력 :

GET product_skus/_search?routing=123 
{ 
    "query": { 
    "match_all": {} 
    } 
} 
,536을

출력 :

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 1, 
    "successful": 1, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "product_skus", 
     "_type": "product", 
     "_id": "AVrMHzgx28yun46LEMYm", 
     "_score": 1, 
     "_routing": "123", 
     "_source": { 
      "supplierId": 123, 
      "path": "some/path" 
     } 
     } 
    ] 
    } 
} 

두 번째 쿼리

GET product_skus/_search?routing=124 
{ 
    "query": { 
    "match_all": {} 
    } 
} 

출력 :

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
    "total": 1, 
    "successful": 1, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 0, 
    "max_score": null, 
    "hits": [] 
    } 
} 

당신은 자세한 내용은 문서를 확인 만 간단한 예제 할 수도있다 :

하나의 파편 라우팅에 사용되는 다음 쇼 :

GET product_skus/_search_shards?routing=123 

출력 :

{ 
    "nodes": { 
    "1sMKtN6aQ9yyOsTjknWyQA": { 
     "name": "1sMKtN6", 
     "ephemeral_id": "X-V2QGTwTmqUFQb1B6KIUw", 
     "transport_address": "127.0.0.1:9300", 
     "attributes": {} 
    } 
    }, 
    "shards": [ 
    [ 
     { 
     "state": "STARTED", 
     "primary": true, 
     "node": "1sMKtN6aQ9yyOsTjknWyQA", 
     "relocating_node": null, 
     "shard": 0, 
     "index": "product_skus", 
     "allocation_id": { 
      "id": "1MMkFaALRxm1N-x8J8AGhg" 
     } 
     } 
    ] 
    ] 
} 

더의 search shards API를 참조하십시오 세부.