2014-12-18 43 views
9

kullanarak benzersiz belgelerin sayısını nasıl döndüreceğimi elasticsearch'in, iç içe geçmiş bir alandaki terimler kümelenmesini kullanarak benzersiz belge sayısını iade edememesiyle ilgili bir sorunla karşılaştım. İşte elasticsearch aggregation

bizim modelin bir örnek:

{ 
    ..., 
    "location" : [ 
     {"city" : "new york", "state" : "ny"}, 
     {"city" : "woodbury", "state" : "ny"}, 
     ... 
    ], 
    ... 
} 

Ben devlet sahada toplanmasına yapmak istiyorum, ama 'ny' iki kez göründüğü için bu belge 'ny' kovada iki defa sayılır belgesi.

Farklı belgelerin sayımını yapmanın bir yolu olup olmadığını merak ediyorum.

haritalama:

people = { 
    :properties => { 
    :location => { 
     :type => 'nested', 
     :properties => { 
     :city => { 
      :type => 'string', 
      :index => 'not_analyzed', 
     }, 
     :state => { 
      :type => 'string', 
      :index => 'not_analyzed', 
     }, 
     } 
    }, 
    :last_name => { 
     :type => 'string', 
     :index => 'not_analyzed' 
    } 
    } 
} 

sorgu oldukça basittir:

curl -XGET 'http://localhost:9200/people/_search?pretty&search_type=count' -d '{ 
    "query" : { 
    "bool" : { 
     "must" : [ 
     {"term" : {"last_name" : "smith"}} 
     ] 
    } 
    }, 
    "aggs" : { 
    "location" : { 
     "nested" : { 
     "path" : "location" 
     }, 
     "aggs" : { 
     "state" : { 
      "terms" : {"field" : "location.state", "size" : 10} 
     } 
     } 
    } 
    } 
}' 

cevabı:

{ 
    "took" : 104, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1248513, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "location" : { 
     "doc_count" : 2107012, 
     "state" : { 
     "buckets" : [ { 
      "key" : 6, 
      "key_as_string" : "6", 
      "doc_count" : 214754 
     }, { 
      "key" : 12, 
      "key_as_string" : "12", 
      "doc_count" : 168887 
     }, { 
      "key" : 48, 
      "key_as_string" : "48", 
      "doc_count" : 101333 
     } ] 
     } 
    } 
    } 
} 

doc_count isabet toplam çok daha büyüktür. Yani çiftler olmalı.

Teşekkürler!

+0

Bu dizininizi ve kullandığınız sorguyu eşleştirin, aksi takdirde size yardımcı olamam. –

+0

@AndreiStefan Haritalamayı ve sorguyu güncelledim. Teşekkürler! – milodky

cevap

12

Sana bir iç içe değerine dayalı toplanmasını istiyorum, çünkü bir reverse_nested toplanmasına gerek, ama aslında KÖK belgeleri değil, iç içe geçmiş olanları

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "last_name": "smith" 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "location": { 
     "nested": { 
     "path": "location" 
     }, 
     "aggs": { 
     "state": { 
      "terms": { 
      "field": "location.state", 
      "size": 10 
      }, 
      "aggs": { 
      "top_reverse_nested": { 
       "reverse_nested": {} 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Ve sonuç olarak, bir şey görecekti sayma

"aggregations": { 
     "location": { 
     "doc_count": 6, 
     "state": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
        "key": "ny", 
        "doc_count": 4, 
        "top_reverse_nested": { 
        "doc_count": 2 
        } 
       }, 
       { 
        "key": "ca", 
        "doc_count": 2, 
        "top_reverse_nested": { 
        "doc_count": 2 
        } 
       } 
      ] 
     } 
     } 
    } 

Ve ne arıyorsun top_reverse_nested parçası altındadır: Bu gibi. Bir nokta burada: "doc_count": 6 hata bildirmiyor, NESTED belge sayısıdır, bu nedenle, kök numaraları saydığını düşündüğünüz bu sayılarla karıştırmayın, sayım yuvalanmış olanlarda. Yani, üç iç içe geçmiş olan bir belge için, sayı 3 değil, 3 olur.