2016-07-19 8 views
0

I unten Mapping in meinem Index haben:Sortieren Muttertyp, basierend auf einem Feld innerhalb einer Reihe von verschachtelten Objekt in Elasticsearch

{ 
"testIndex": { 
    "mappings": { 
     "type1": { 
      "properties": { 
       "text": { 
        "type": "string" 
       }, 
       "time_views": { 
        "properties": { 
         "timestamp": { 
          "type": "long" 
         }, 
         "views": { 
          "type": "integer" 
         } 
        } 
       } 
      } 
     } 
    } 
} 
} 

"time_views" ist eigentlich ein Array, aber inneren Attribute nicht-Array.

Ich möchte meine Typ1-Datensätze basierend auf dem maximalen Wert des "views" -Attributs für jeden Typ1-Datensatz sortieren. Ich lese elasticsearch Sortier-Dokumentation, es hat Lösung für Anwendungsfälle, die Sortierung auf Feld (Single oder Array) von einzelnen verschachtelten Objekt basiert. aber was ich will ist anders. Ich möchte für jedes Dokument Maximalwert von „Ansichten“ wählen und die Dokumente auf der Grundlage dieser Werte sortieren

ich diese json Abfrage

gemacht
{ 
"size": 10, 
"query": { 
    "range": { 
    "timeStamp": { 
     "gte": 1468852617347, 
     "lte": 1468939017347 
    } 
    } 
}, 
"from": 0, 
"sort": [ 
    { 
     "time_views.views": { 
     "mode": "max", 
     "nested_path": "time_views", 
     "order": "desc" 
     } 
    } 
] 
} 

aber ich habe diesen Fehler

{ 
    "error": { 
    "phase": "query", 
    "failed_shards": [ 
    { 
    "node": "n4rxRCOuSBaGT5xZoa0bHQ", 
    "reason": { 
     "reason": "[nested] nested object under path [time_views] is not of nested type", 
     "col": 136, 
     "line": 1, 
     "index": "data", 
     "type": "query_parsing_exception" 
    }, 
    "index": "data", 
    "shard": 0 
    } 
], 
"reason": "all shards failed", 
"grouped": true, 
"type": "search_phase_execution_exception", 
"root_cause": [ 
    { 
    "reason": "[nested] nested object under path [time_views] is not of nested type", 
    "col": 136, 
    "line": 1, 
    "index": "data", 
    "type": "query_parsing_exception" 
    } 
] 
}, 
"status": 400 
} 

als ich Wie oben erwähnt time_views ist ein Array und ich denke, dass dieser Fehler deswegen ist. sogar ich kann die Sortierung nicht basierend auf Array-Feld-Funktion verwenden, weil "time_views" kein primitiver Typ ist. Ich denke, meine letzte Chance ist eine benutzerdefinierte Sortierung durch Skripting schreiben, aber ich weiß nicht wie. Bitte sagen Sie mir meinen Fehler, wenn es möglich ist zu erreichen, was ich will, ansonsten geben Sie mir ein einfaches Skript Beispiel.

tnx :)

Antwort

3

Die Fehlermeldung tut viel zu erklären, was mit der Abfrage nicht stimmt. Eigentlich ist das Problem mit dem Mapping. Und ich denke, Sie wollten nested Felder verwenden, da Sie verschachtelte Abfragen verwenden.

Sie müssen nur Ihre time_views Feld als nested machen:

"mappings": { 
    "type1": { 
     "properties": { 
     "text": { 
      "type": "string" 
     }, 
     "time_views": { 
      "type": "nested", 
      "properties": { 
      "timestamp": { 
       "type": "long" 
      }, 
      "views": { 
       "type": "integer" 
      } 
      } 
     } 
     } 
    } 
    } 
Verwandte Themen