2016-10-03 4 views
0

ich diese Abfrage zu erhalten, um bin mit, die in einer einzelnen Feldwerte sind (SQLfying wäre ein SELECT field, count(field) GROUP BY field seinElasticsearch Aggregation: String mit Leerzeichen behandeln, als zwei Strings

Um das zu tun, dass ich bin. dieses Gesuch ES Senden:

{ 
    "query" : { 
    "bool" : { 
     "must" : { 
     "exists" : { 
      "field" : "metainfos.ceeaacceaeaaccebeaacceceaaccedeaac" 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "followUpActivity.metainfo.metainfos.ceeaacceaeaaccebeaacceceaaccedeaac" : { 
     "terms" : { 
     "field" : "metainfos.ceeaacceaeaaccebeaacceceaaccedeaac", 
     "missing" : "null" 
     } 
    } 
    } 
} 

Es auf diese Sammlung nur ein Dokument ist:

{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "living_v1", 
     "_type" : "fuas", 
     "_id" : "a2cb0ba1-8955-11e6-8a00-0242ac110007", 
     "_score" : 1.0, 
     "_routing" : "user2", 
     "_source" : { 
     "user" : "user2", 
     "timestamp" : "2016-10-03T11:08:30.074Z", 
     "startTimestamp" : "2016-10-03T11:08:30.074Z", 
     "dueTimestamp" : null, 
     "closingTimestamp" : null, 
     "matter" : "Fua 1", 
     "comment" : null, 
     "status" : 0, 
     "backlogStatus" : 20, 
     "metainfos" : { 
      "ceeaacceaeaaccebeaacceceaaccedeaac" : [ "Living Digital" ] 
     }, 
     "resources" : [ ], 
     "notes" : null 
     } 
    } ] 
    } 
} 

Wie Sie doc.metainfos.ceeaacc... = ["Living Digital"]

sehen
{ 
    "took" : 3, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "living_v1", 
     "_type" : "fuas", 
     "_id" : "a2cb0ba1-8955-11e6-8a00-0242ac110007", 
     "_score" : 1.0, 
     "_routing" : "user2", 
     "_source":{"user":"user2","timestamp":"2016-10-03T11:08:30.074Z","startTimestamp":"2016-10-03T11:08:30.074Z","dueTimestamp":null,"closingTimestamp":null,"matter":"Fua 1","comment":null,"status":0,"backlogStatus":20,"metainfos":{"ceeaacceaeaaccebeaacceceaaccedeaac":["Living Digital"]},"resources":[],"notes":null} 
    } ] 
    }, 
    "aggregations" : { 
    "followUpActivity.metainfo.metainfos.ceeaacceaeaaccebeaacceceaaccedeaac" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : "digital", 
     "doc_count" : 1 
     }, { 
     "key" : "living", 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 

ES wird immer mir zwei Werte: einen für "living" und ein anderes für "digital". Ich möchte Aggregation mit den Shole-Werten "Living Digital" bekommen.

Das Zuordnungsschema ist:

{ 
    "living_v1" : { 
    "mappings" : { 
     "fuas" : { 
     "properties" : { 
      "backlogStatus" : { 
      "type" : "long" 
      }, 
      "comment" : { 
      "type" : "string" 
      }, 
      "matter" : { 
      "type" : "string" 
      }, 
      "metainfos" : { 
      "properties" : { 
       "ceeaacceaeaaccebeaacceceaaccedeaac" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "startTimestamp" : { 
      "type" : "date", 
      "format" : "strict_date_optional_time||epoch_millis" 
      }, 
      "status" : { 
      "type" : "long" 
      }, 
      "timestamp" : { 
      "type" : "date", 
      "format" : "strict_date_optional_time||epoch_millis" 
      }, 
      "user" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
} 

Wie Sie sehen können:

"metainfos" : { 
    "properties" : { 
     "ceeaacceaeaaccebeaacceceaaccedeaac" : { 
      "type" : "string" 
     } 
    } 
} 

Das Problem für mich ist "ceeaacceaeaaccebeaacceceaaccedeaac" ist ein Benutzer on-Demand-Eigenschaft erstellt und ich weiß nicht, Wie könnte ich ein not-analyzed auf ein metainfos.* Feld setzen.

#curl -XPUT 'http://localhost:9200/living_v1/' -d ' 
{ 
    "mappings": { 
    "fuas": { 
     "dynamic_templates": [ 
     { 
      "metainfos": { 
      "path_match": "metainfos.*", 
      "match_mapping_type": "string", 
      "mapping": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
' 

mich ist es zu sagen, dass living_v1 Index bereits vorhanden sind:

EDIT

Ich habe mit getestet. Was habe ich in der Lage gewesen, auf here, um herauszufinden, ich brauche eine PUT gegen index senden:

{ 
    "error":{ 
    "root_cause":[ 
     { 
      "type":"index_already_exists_exception", 
      "reason":"already exists", 
      "index":"living_v1" 
     } 
    ], 
    "type":"index_already_exists_exception", 
    "reason":"already exists", 
    "index":"living_v1" 
}, 
"status":400 
} 
+0

Ich glaube, Sie suchen nach dynamischen Indexvorlagen: http://StackOverflow.com/a/23370138/693546 – mblaettermann

Antwort

1

Wie Sie vielleicht schon bemerkt haben, wird das Suchverhalten durch die Abbildung verursacht, die standardmäßig angewendet. Diese Zuordnung analysiert alle Felder mit Zeichenfolgenwert, die nicht unterschiedlich definiert sind.

Also, wenn Sie noch nicht wissen, welche Eigenschaften (= Schlüssel) in dem metainfos Objekt sein wird, können Sie die dynamischen Vorlagen-Funktion verwenden, wie here und here beschrieben zu definieren, welches Mapping für diese Felder angewandt werden soll und so überschreibt das Standardverhalten der Analyse eines String-Feldes.

Sie könnten eine Zuordnung anwenden, die ein bisschen wie folgt aussieht (nicht getestet):

{ 
    "mappings": { 
    "fuas": { 
     "dynamic_templates": [ 
     { 
      "metainfos": { 
      "path_match": "metainfos.*", 
      "match_mapping_type": "string", 
      "mapping": { 
       "type": "string", 
       "index": "not_analyzed", 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Vielen Dank @Andreas . Ich habe es versucht, aber es hat sich einige Probleme ergeben. Was ist der Unterschied zwischen Vorlagen und Ihrem Ansatz? Sind sie gleich? – Jordi

1

Wie andere Leute haben darauf hingewiesen, dynamische Vorlagen ist der Weg zu gehen. Das einzige Problem besteht darin, dass Sie die Indexvorlage nicht ändern können, nachdem einige Dokumente indiziert wurden. Sie müssen den Index neu erstellen (Index löschen, Mapping erstellen, neue Dokumente einziehen)

+0

Ok @oldbam, ich habe es. Gibt es eine einfache Möglichkeit, den Index von "index_v1" nach "index_v2" neu zu erstellen? – Jordi

+1

können Sie in Betracht ziehen, Antworten auf http://stackoverflow.com/questions/28626803/how-to-rename-an-index-in-a-cluster zu betrachten. Ich habe immer einen Index gelöscht und Dokumente neu eingezogen, als ich die Indexvorlage änderte – oldbam

Verwandte Themen