2015-06-04 1 views
0

Я знаю, что это не должно работать таким образом, но есть ли способ заставить агрегировать суммы для ограничения суммы на основе размера, заданного в запросе?Elasticsearch - ограничение количества документов, используемых для суммирования сумм

Как и в этом запросе:

{ 
    "size" : 10, 
    "query":{ 
     "filtered":{ 
      "query":{ 
       "match_all":{} 
      }, 
      "filter": { 
       // some filter  
      } 
     } 
    }, 
    "aggs": { 
     "value" : { 
      "sum" :{ 
       "field":"value" 
      } 
     } 
    } 
} 

Если у меня есть 100 докторов, я хотел бы получить только 10 докторов и сумму этих 10 докторов.

Вкратце: мне нужен ВЫБОР SUM (значение) FROM table LIMIT 10, независимо от оценки.

Вы, ребята, знаете, могу ли я сделать это с помощью ES?

ответ

0

limit filter похоже делает, что вы хотите. Вот простой пример.

Я создал простой индекс и дал ему некоторые документы:

PUT /test_index 
{ 
    "settings": { 
     "number_of_shards": 1 
    } 
} 

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"name":"a a", "val": 1} 
{"index":{"_id":2}} 
{"name":"a b", "val": 2} 
{"index":{"_id":3}} 
{"name":"a c", "val": 3} 
{"index":{"_id":4}} 
{"name":"b a", "val": 4} 
{"index":{"_id":5}} 
{"name":"b b", "val": 5} 
{"index":{"_id":6}} 
{"name":"b c", "val": 6} 

Тогда я могу получить сумму "val" области первых двух документов с "name", содержащим слово "a" следующим образом:

POST /test_index/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "term": { 
       "name": { 
        "value": "b" 
       } 
      } 
     }, 
     "filter": { 
      "limit": { 
       "value": 2 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "val_sum": { 
     "sum": { 
      "field": "val" 
     } 
     } 
    } 
} 
... 
{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0.73895097, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "2", 
      "_score": 0.73895097, 
      "_source": { 
       "name": "a b", 
       "val": 2 
      } 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "4", 
      "_score": 0.73895097, 
      "_source": { 
       "name": "b a", 
       "val": 4 
      } 
     } 
     ] 
    }, 
    "aggregations": { 
     "val_sum": { 
     "value": 6, 
     "value_as_string": "6.0" 
     } 
    } 
} 

Вот код, который я использовал:

http://sense.qbox.io/gist/6be3fc75db339fa3810521dbcb61429cd885d1bf

+0

Спасибо, Слоан. Предельный фильтр действительно хороший подход, но поскольку предел применяется _per_ _shard_, он все еще не ограничивает документы так, как я хотел. Облом. Вы знаете, есть ли способ ограничить количество документов, возвращаемых на индекс? – AFMeirelles

+0

О, да, я пропустил это. Извините, я ничего не могу придумать. –

+0

Спасибо в любом случае, Слоан. Для знаю, единственные решения, которые я мог придумать, либо установили один осколок, либо (ужасно, я знаю) «limit»/«shards_number». Однако я не буду использовать ни того, ни другого. – AFMeirelles

Смежные вопросы