2014-12-18 21 views
9

Ho riscontrato un problema che elasticsearch non è riuscito a restituire il conteggio dei documenti univoci semplicemente utilizzando l'aggregazione dei termini in un campo nidificato.come restituire il conteggio dei documenti univoci utilizzando l'aggregazione elasticsearch

Ecco un esempio del nostro modello:

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

voglio fare aggregazione sul campo dello stato, ma questo documento saranno contati due volte nel secchio 'ny' poiche 'ny' compare due volte nel documento.

Quindi mi chiedo se dov'è un modo per prendere il conteggio di documenti distinti.

mappatura:

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' 
    } 
    } 
} 

la query è piuttosto semplice:

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} 
     } 
     } 
    } 
    } 
}' 

La risposta:

{ 
    "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 
     } ] 
     } 
    } 
    } 
} 

Il doc_count è molto più grande del totale nel colpo. Quindi ci devono essere dei duplicati.

Grazie!

+0

Pubblica la tua mappatura di quell'indice e la query che stai utilizzando, altrimenti non posso aiutarti. –

+0

@AndreiStefan Ho aggiornato la mappatura e la query. Grazie! – milodky

risposta

12

Credo che hai bisogno di un'aggregazione reverse_nested, perché si vuole l'aggregazione sulla base di un valore nidificato, ma in realtà contando i documenti radice, non quelli annidati

{ 
    "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": {} 
      } 
      } 
     } 
     } 
    } 
    } 
} 

E, di conseguenza, si dovrebbe vedere qualcosa in questo modo:

"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 
        } 
       } 
      ] 
     } 
     } 
    } 

E quello che stai cercando è sotto top_reverse_nested parte. Un punto qui: se non sto sbagliando "doc_count": 6 è il numero di documenti NESTED, quindi non essere confuso su questi numeri pensando di contare i documenti root, il conteggio è su quelli nidificati. Quindi, per un documento con tre nidificati che corrispondono, il conteggio sarà 3, non 1.

Problemi correlati