webentwicklung-frage-antwort-db.com.de

Elasticsearch nur bestimmte Felder zurückgeben lassen?

Ich benutze elasticsearch, um meine Dokumente zu indizieren.

Kann es angewiesen werden, nur bestimmte Felder anstelle des gesamten gespeicherten json-Dokuments zurückzugeben?

360
user1199438

Ja! Verwenden Sie einen Quellfilter . Wenn Sie mit JSON suchen, sieht es ungefähr so ​​aus:

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

In ES 2.4 und früheren Versionen können Sie auch die Feldoption für die Such-API verwenden :

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

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

498
kevingessner

Ich fand die Dokumentation für den get api hilfreich - insbesondere die beiden Abschnitte Quellfilterung und Felder : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering

Sie geben über Quellfilterung an:

Wenn Sie nur ein oder zwei Felder aus der vollständigen _Quelle benötigen, können Sie mit den Parametern _source_include & _source_exclude die von Ihnen benötigten Teile einschließen oder herausfiltern. Dies kann insbesondere bei großen Dokumenten hilfreich sein, bei denen durch teilweises Abrufen der Netzwerkaufwand verringert werden kann

Was perfekt zu meinem Anwendungsfall passte. Am Ende habe ich einfach die Quelle wie folgt gefiltert (mit der Kurzform):

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

Zu Ihrer Information, sie geben in den Dokumenten über die Felder Parameter an:

Die get-Operation ermöglicht die Angabe einer Reihe gespeicherter Felder, die durch Übergabe des fields-Parameters zurückgegeben werden.

Es scheint für speziell gespeicherte Felder zu sorgen, bei denen jedes Feld in einem Array platziert wird. Wenn die angegebenen Felder nicht gespeichert wurden, werden sie jeweils aus der _Source abgerufen, was zu langsameren Abrufen führen kann. Ich hatte auch Probleme damit, Felder vom Typ object zurückzugeben.

Zusammenfassend haben Sie also zwei Möglichkeiten, entweder durch Quellenfilterung oder durch [gespeicherte] Felder.

79
Markus Coetzee
For the ES versions 5.X and above you can a ES query something like this

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

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

In diesem Fall würden Sie Folgendes 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":{  

   }
}

Informationen zum Indizieren gespeicherter Felder finden Sie in der Dokumentation. Freue mich immer über ein Upvote!

10
woltob

response_filtering

Alle REST APIs akzeptieren einen filter_path-Parameter, mit dem die von elasticsearch zurückgegebene Antwort reduziert werden kann. Dieser Parameter verwendet eine durch Kommas getrennte Liste von Filtern, die mit der Punktnotation ausgedrückt werden.

https://stackoverflow.com/a/35647027/8447

7
The Demz

Hier eine andere Lösung, die jetzt einen Match Ausdruck verwendet

Quellfilterung
Ermöglicht die Steuerung, wie das Feld _source bei jedem Treffer zurückgegeben wird.

Getestet mit Elastiscsearch Version 5.5

Das Schlüsselwort "includes" definiert die spezifischen Felder.

GET /my_indice/my_indice_type/_search
{
    "_source": {
        "includes": [ "my_especific_field"]
        },
        "query": {
        "bool": {
                "must": [
                {"match": {
                    "_id": "%my_id_here_without_percent%"
                    }
                }
            ]
        }
    }
}
6
Fabricio
here you can specify whichever field you want in your output and also which you don't.

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

Eine REST API-GET-Anforderung kann mit dem Parameter '_source' erfolgen.

Beispielanfrage

http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE

Antwort

{
"took": 59,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 104,
    "max_score": 7.3908954,
    "hits": [
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLc",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 160
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLh",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 185
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLi",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 190
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLm",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 210
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLp",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 225
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLr",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 235
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLw",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 260
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uL5",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 305
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLd",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 165
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLy",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 270
            }
        }
    ]
}

}

4
Ironluca

In Java können Sie setFetchSource folgendermaßen verwenden:

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)
2
user1693371

Ja, mit dem Quellfilter können Sie dies erreichen. Hier ist das Dokument Quellfilter

Beispielanfrage

POST index_name/_search
 {
   "_source":["field1","filed2".....] 
 }

Ausgabe wird sein

{
  "took": 57,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "index_name",
        "_type": "index1",
        "_id": "1",
        "_score": 1,
        "_source": {
          "field1": "a",
          "field2": "b"
        },
        {
          "field1": "c",
          "field2": "d"
        },....
      }
    ]
  }
}
2
RCP

Zum Beispiel haben Sie ein Dokument mit drei Feldern:

PUT moive/_doc/1
{
  "name":"The Lion King",
  "language":"English",
  "score":"9.3"
}

wenn Sie name und score zurückgeben möchten, können Sie den folgenden Befehl verwenden:

GET moive/_doc/1?_source_includes=name,score

Wenn Sie ein Feld mit Muster erhalten möchten:

GET moive/_doc/1?_source_includes=*re

Vielleicht mit Ausnahme einiger Felder:

GET moive/_doc/1?_source_excludes=score
0
Yao Pan