2013-11-28 5 views
5

ich habe ein bestimmtes Dokument:Mapping für Objekte mit einer beliebigen Menge von Eigenschaften in Elasticsearch

{ 
    "foo": {} 
} 

foo wo eine beliebige Anzahl von Eigenschaften haben kann. Nehmen wir an, ich importiere Millionen von Dokumenten in meinen Index, in denen jede der Eigenschaften von foo andere Werte hat.

das bedeutet meine Mapping, die dynamisch gebaut wird, wird enorm wachsen. gibt es jede Art von Art und Weise, wo ich Elasticsearch so etwas wie

nehmen alles, was Sie haben in foo und akzeptieren es so wie es ist (oder stringify foo), ohne dass ein resultierendes Millionen-Linien-Mapping kann sagen ???

oder muss ich mich vor der Indizierung von Dokumenten selbst kümmern?

wenn ja, gibt es ein 2-Lösungen denken i

  1. JSON.stringifyfoo

  2. Karte jede Eigenschaft in foo in Schlüssel/Wert-Paare, und ein Array von Objekten erstellen:

    // object 
    { 
        "foo": [ 
        {"key": "bar1", "value": "bar1's value"}, 
        {"key": "bar2", "value": "bar2's value"} 
        ] 
    } 
    
    // resulting mapping 
    { 
        "type": { 
        "properties": { 
         "foo": { 
         "properties": { 
          "key": { 
          "type": "string" 
          }, 
          "value": { 
          "type": "string" 
          } 
         } 
         } 
        } 
        } 
    } 
    

würden Sie dann Lösung 1 o bevorzugen r 2, und warum?

schätze deine Hilfe!

Antwort

3

Sie können Elasticsearch nicht für Sie stringifizieren. Sie können es ignorieren, was unter "foo" ist, und es wird ein Teil von "_source" sein, aber dann wird es überhaupt nicht durchsuchbar sein.

Der zweite Ansatz kann sehr sinnvoll sein, je nachdem, wie Sie ihn abfragen und was Sie über die Arten von Werten wissen, die Sie akzeptieren.

Es gibt eine ähnliche Frage an Dynamic Type with Mappings diesen Ansatz beschreiben, mit einem runnable Beispiel hier: https://www.found.no/play/gist/7596633

Die Idee ist, dass Sie ein verschachteltes Dokument per Wert haben werden. Dies funktioniert gut, wenn die Anzahl der Werte pro Dokument nicht groß ist. Wenn Sie keine verschachtelten Dokumente verwenden, wird Ihr Dokument zurückgegeben, wenn Sie nach "key" suchen: "bar1" und "value": "bar2's value".

+0

danke für deine antwort. Wie ignoriere ich es? Wenn ich das tue, kann ich nicht in diesem Feld suchen, aber es wird immer noch Teil des Dokuments sein, wenn ich dieses Recht erhalte? – hereandnow78

+1

es gefunden: {"enabled": "false", "type": "object"}, trotzdem, vielen Dank für Ihre Hilfe! – hereandnow78

Verwandte Themen