583 Stimmen

Elasticsearch soll nur bestimmte Felder zurückgeben?

Ich verwende elasticsearch, um meine Dokumente zu indizieren.

Ist es möglich, es anzuweisen, nur bestimmte Felder anstelle des gesamten gespeicherten json-Dokuments zurückzugeben?

811voto

kevingessner Punkte 17749

Ja, verwenden Sie eine bessere Option Quellfilter . Wenn Sie mit JSON suchen, sieht das in etwa so aus:

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

In ES 2.4 und früher konnten Sie auch die Felder Option für die Such-API :

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

Dies ist in ES 5+ veraltet. Und Quellfilter sind ohnehin leistungsfähiger!

103voto

Markus Coetzee Punkte 3344

Ich habe die Dokumente für das get api hilfreich zu sein - insbesondere die beiden Abschnitte, Quelle: Filterung y Felder : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering

Sie geben an, dass die Quelle gefiltert wird:

Wenn Sie nur ein oder zwei Felder aus der vollständigen _Quelle benötigen, können Sie die Parameter _source_include & _source_exclude verwenden, um die Teile, die Sie benötigen, einzuschließen oder herauszufiltern. Dies kann besonders hilfreich sein bei großen Dokumenten, bei denen ein teilweiser Abruf den Netzwerk-Overhead einsparen kann

Das passte perfekt zu meinem Anwendungsfall. Ich endete einfach Filtern der Quelle wie so (unter Verwendung der Kurzschrift):

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

Zu Ihrer Information: In den Dokumenten steht, dass die Felder Parameter:

Die get-Operation ermöglicht die Angabe eines Satzes von gespeicherten Feldern, die zurückgegeben werden, indem der Parameter fields übergeben wird.

Es scheint für Felder zu sorgen, die speziell gespeichert wurden, wobei es jedes Feld in einem Array ablegt. Wenn die angegebenen Felder nicht gespeichert wurden, wird jedes einzelne aus der _Quelle geholt, was zu "langsameren" Abrufen führen kann. Ich hatte auch Probleme damit, Felder vom Typ Objekt zurückzugeben.

Zusammenfassend lässt sich sagen, dass Sie zwei Möglichkeiten haben, entweder durch Quellenfilterung oder durch [gespeicherte] Felder.

32voto

Pinkesh Sharma Punkte 2288

Für die ES-Versionen 5.X und höher können Sie eine ES-Abfrage etwa wie folgt erstellen:

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }

24voto

Gaurav Punkte 459

Hier können Sie angeben, welches Feld Sie in Ihrer Ausgabe haben möchten und welches nicht:

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }

15voto

woltob Punkte 370

In Elasticsearch 5.x ist der oben genannte Ansatz veraltet. Sie können den _source-Ansatz verwenden, aber in bestimmten Situationen kann es sinnvoll sein, ein Feld zu speichern. Wenn Sie zum Beispiel ein Dokument mit einem Titel, einem Datum und einem sehr großen Inhaltsfeld haben, möchten Sie vielleicht nur den Titel und das Datum abrufen, ohne diese Felder aus einem großen _source-Feld extrahieren zu müssen:

In diesem Fall würden Sie verwenden:

{  
   "size": $INT_NUM_OF_DOCS_TO_RETURN,
   "stored_fields":[  
      "doc.headline",
      "doc.text",
      "doc.timestamp_utc"
   ],
   "query":{  
      "bool":{  
         "must":{  
            "term":{  
               "doc.topic":"news_on_things"
            }
         },
         "filter":{  
            "range":{  
               "doc.timestamp_utc":{  
                  "gte":1451606400000,
                  "lt":1483228800000,
                  "format":"epoch_millis"
               }
            }
         }
      }
   },
   "aggs":{  

   }
}

Lesen Sie in der Dokumentation nach, wie Sie gespeicherte Felder indizieren können. Ich freue mich immer über ein Upvote!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X