2015-04-10 3 views
12

Ich suche nur nach paar Feldern, aber ich möchte in der Lage sein, das gesamte Dokument in ES zu speichern, um nicht zusätzliche DB (MySQL) -Abfragen zu machen.Wie Sie Daten in elasticsearch _source speichern, aber nicht indizieren?

Ich habe versucht, index: no, store: no zu ganzen Objekten/Eigenschaften im Mapping hinzuzufügen, aber ich bin immer noch nicht sicher, ob die Felder indiziert werden und unnötigen Overhead hinzufügen.

Sagen wir, ich habe Bücher und jeder hat einen Autor. Ich möchte nur nach Buchtitel suchen, möchte aber das gesamte Dokument abrufen können.

Ist das in Ordnung:

mappings: 
properties: 
    title: 
     type: string 
     index: analyzed 
    author: 
     type: object 
     index: no 
     store: no 
     properties: 
      first_name: 
       type: string 
      last_name: 
       type: string 

Oder sollte ich lieber tun:

mappings: 
properties: 
    title: 
     type: string 
     index: analyzed 
    author: 
     type: object 
     properties: 
      first_name: 
       index: no 
       store: no 
       type: string 
      last_name: 
       index: no 
       store: no 
       type: string 

Oder vielleicht ist es völlig falsch, ich tue? Und was ist mit nested Eigenschaften, die nicht indiziert werden sollten?

Antwort

6

Standardmäßig wird die _source des Dokuments unabhängig von den Feldern gespeichert, die Sie indizieren möchten. Die _source wird verwendet, um das Dokument in den Suchergebnissen zurückzugeben, während die Felder, die indiziert werden, für die Suche verwendet werden.

Sie können nicht index: no auf ein Objekt gesetzt werden alle Felder in einem Objekt zu verhindern indiziert, aber Sie können tun, was Sie wollen mit Dynamic Templatespath_match Eigenschaft mit der index: no Einstellung zu jedem Feld in einem Objekt anzuwenden. Hier ist ein einfaches Beispiel.

einen Index mit dem Mapping erstellen, die die dynamischen Vorlagen für die author Objekt und das verschachtelte categories Objekt enthält:

POST /shop 
{ 
    "mappings": { 
     "book": { 
      "dynamic_templates": [ 
       { 
        "author_object_template": { 
         "path_match": "author.*", 
         "mapping": { 
          "index": "no" 
         } 
        } 
       }, 
       { 
        "categories_object_template": { 
         "path_match": "categories.*", 
         "mapping": { 
          "index": "no" 
         } 
        } 
       } 
      ], 
      "properties": { 
       "categories": { 
        "type": "nested" 
       } 
      } 
     } 
    } 
} 

Index ein Dokument:

POST /shop/book/1 
{ 
    "title": "book one", 
    "author": { 
     "first_name": "jon", 
     "last_name": "doe" 
    }, 
    "categories": [ 
     { 
      "cat_id": 1, 
      "cat_name": "category one" 
     }, 
     { 
      "cat_id": 2, 
      "cat_name": "category two" 
     } 
    ] 
} 

Wenn Sie suchten auf dem title Feld mit dem Suchbegriff book würde das Dokument zurückgegeben werden. Wenn Sie auf der author.first_name oder author.last_name zu suchen, wird es kein Spiel sein, weil diese Felder nicht indiziert wurden:

POST /shop/book/_search 
{ 
    "query": { 
     "match": { 
      "author.first_name": "jon" 
     } 
    } 
} 

Das gleiche wäre der Fall für eine verschachtelte Abfrage auf die Kategoriefelder sein:

POST /shop/book/_search 
{ 
    "query": { 
     "nested": { 
      "path": "categories", 
      "query": { 
       "match": { 
        "categories.cat_name": "category" 
       } 
      } 
     } 
    } 
} 

Sie können auch das Tool Luke verwenden, um den Lucene-Index zu erwarten und zu sehen, welche Felder indiziert wurden.

+0

Bedeutet '" index ":" no "' impliziere '" store ":" no "'? Ich habe 'store' gelesen, was bedeutet, dass die' _source' der ursprünglichen Eigenschaft in Lucene gespeichert wird, aber ich bin mir nicht sicher, wie es mit 'index' zusammenhängt. Und nur um sicher zu gehen - muss ich nicht Mappings für die nicht indizierten Felder bereitstellen? ES wirft keine Fehler, wenn ich ein Dokument mit der Eigenschaft X, die ein int ist und dann ein Dokument mit der gleichen Eigenschaft, aber mit Zeichenfolge? – pinkeen

+0

Nein, die Einstellung für den Index bestimmt nicht die Einstellung für den Speicher. Der Standardwert für store ist no, was in Ihrem Anwendungsfall gut ist, da die _source aktiviert ist. Wenn Sie das Feld _source deaktiviert haben und die Felder auswählen, die Sie speichern möchten, werden die gespeicherten Felder nur in den Suchergebnissen zurückgegeben, wenn eine Übereinstimmung besteht.Sie müssen eine Zuordnung für nicht indizierte Felder angeben, um Elasticsearch zu veranlassen, sie nicht zu indizieren, andernfalls verwendet Elasticsearch den Standardanalysator (Standard Analyzer), um das Feld zu indizieren. –

+1

Im obigen Beispiel werden die dynamischen Vorlagen jedoch für die Zuordnung nicht indizierter Felder verwendet. Wenn Sie kein Mapping für ein Feld haben, wird kein Fehler zurückgegeben, wenn Sie den Typ einer Eigenschaft ändern. –

Verwandte Themen