2015-11-16 12 views
7

Wie kann ich eine ElasticSearch-Aggregation schreiben, die die Buckets durch den gesamten Begriff statt einzelne Token teilt? Zum Beispiel würde Ich mag von Staat aggregieren, aber der folgende Code gibt neu, york, Jersey und Kalifornien als einzelne Eimer, nicht New Yorker und New Jersey und Kalifornien wie die Eimer wie erwartet:Elasticsearch Begriffe Aggregation von Strings in einem Array

curl -XPOST "http://localhost:9200/my_index/_search" -d' 
{ 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states", 
       "size": 10 
      } 
     } 
    } 
}' 

Mein Anwendungsfall ist wie der hier beschriebene https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html mit nur einem Unterschied: das Stadtfeld ist ein Array in meinem Fall.

Beispiel Objekt:

{ 
    "states": ["New York", "New Jersey", "California"] 
} 

Es scheint, dass die vorgeschlagene Lösung (die Feldzuordnung als not_analyzed) nicht für Arrays funktioniert.

Mein Mapping:

{ 
    "properties": { 
     "states": { 
      "type":"object", 
      "fields": { 
       "raw": { 
        "type":"object", 
        "index":"not_analyzed" 
       } 
      } 
     } 
    } 
} 

Ich habe versucht, "Objekt" zu ersetzen durch "string", aber das funktioniert nicht.

Antwort

4

denke ich, alles, was Sie fehlt "states.raw" in Ihrer Aggregation ist (beachten Sie, dass, da kein Analysator angegeben, das "states" Feld mit dem standard analyzer analysiert wird, das Unterfeld "raw" ist "not_analyzed"). Auch wenn Ihr Mapping sich sehen lassen könnte. Als ich versuchte, Ihre Mapping gegen 2.0 ES habe ich einige Fehler, aber das funktionierte:

PUT /test_index 
{ 
    "mappings": { 
     "doc": { 
     "properties": { 
      "states": { 
       "type": "string", 
       "fields": { 
        "raw": { 
        "type": "string", 
        "index": "not_analyzed" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Dann habe ich ein paar docs hinzugefügt:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"states":["New York","New Jersey","California"]} 
{"index":{"_id":2}} 
{"states":["New York","North Carolina","North Dakota"]} 

Und diese Abfrage scheint zu tun, was Sie wollen:

POST /test_index/_search 
{ 
    "size": 0, 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states.raw", 
       "size": 10 
      } 
     } 
    } 
} 

Rückkehr:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "states": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "New York", 
       "doc_count": 2 
      }, 
      { 
       "key": "California", 
       "doc_count": 1 
      }, 
      { 
       "key": "New Jersey", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Carolina", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Dakota", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

Hier ist der Code ich es testen zu:

http://sense.qbox.io/gist/31851c3cfee8c1896eb4b53bc1ddd39ae87b173e

+0

Ihnen so sehr für Ihre Antwort danken, du hast recht, meine Frage ist in der Tat fehlt das '.raw'. Das liegt daran, dass ich so viele verschiedene Kombinationen von Mappings und Suchanfragen ausprobiert habe und diese hochgeladen habe. Ihre Antwort führte mich zu erkennen, dass mein echtes Problem ist, dass ich das elasticsearch-transport-couchbase-Plugin verwende, um meine Dokumente in Elasticsearch zu importieren, und das Plugin ändert meine Dokumentstruktur mit einem Attribut "doc". Dank Ihrer Antwort habe ich ein Dokument manuell hinzugefügt, und es hat funktioniert, und so habe ich das umgebende Attribut "doc" in den anderen Dokumenten entdeckt. – Marieke