Exclure des champs d'une source et de l'indexation

Bonjour,

Petite question pour confirmer, j'ai un elasticsearch 2.3.1 et 7.9.2, en 2.3.1

j'envoi un json via un PUT /macollection/1

{
    "a" : "1" ,
    b ,  : "2",
    c    : "3"
    d   : { 
             "aa" : "11",             
             "bb" : "12"
            }
     e  :{ 
             "aa" : "11",             
             "bb" : "12"
            }
     f  : "9"
}

Comment je peux exclure les champs b, c et d, comme si ils n'existaient pas, car ce sont des données inutiles à injecter dans une collection, je ne prends que les champs utiles pour les statistiques. je reprend un record json qui a été déjà poussé dans une autre base de données pour son cycle de vie, elastic ne sert que pour les statistiques,

Au niveau mapping, j'utiliserai

     "_source" : {
      
           excludes  : [
              "b",
              "c",
              "d"
           ]     
    }

je suis obligé aussi de mettre dans les properties du mapping, pour éviter l'indexation
comme pour enabled : false, ce qui me gene, ce que je dois les décrire aussi dans mon mapping ?

   "a" : {             
        ""type":  "string",
   
        },         
          "b" : {
            "type":  "string",
            "enabled" : false
          }
       "c" : {
            "type":  "string",
            "enabled" : false
          },
        "d" : {
             "type":  "obj",
             "enabled" : false
           }
          ..etc

Y a t'il un autre moyen de faire autre que le mapping direct ou le template ?

Merci pour vos infos

Y a peut être la possibilité de faire simple avec un petit ingest pipeline qui supprime les champs inutiles

1 Like

En fait il faut clarifier quels champs tu veux stoquer dans elasticsearch. Souhaites tu mettre les champs b, c, d dans elasticsearch ou non?
Si la reponse est non, dans ton mapping tu ne mets pas ces champs b, c, d. Ils seront dans ton json mais seront absents de la bdd elasticsearch.
Avec logstash tu peux exclure des champs au niveau de la section filtre. Si tu fais un ingest via tes propres applications, tu supprimes ces champs dans ton appli, voire tu crées un second json qui ne contient pzs les champs b, c et d, et apres tu supprimes le second json. Ou alors tu crées dans ton code ton json dans une longue chaine de carractères sans les champs b, c et dwSi la reponse est oui, tu dois mettre dans ton lapping les champs b, c et d. Apres tu décris dans tin mapping si ces champs doivent être indexés (c’est à dire optimisés pour les recherches) mais également si ces champs doivent etre aggrégés pour les dashboards par exemple.

1 Like

bon, merci beaucoup, vos réponses m'ont données plein d'idées.

Il m'est pas possible de faire cela avant d'être dans elasticsearch, cela a trop d'impact et trop de sources possibles.

voici ma solution, après quelques doutes et quelques test

  1. je met dynamic = false pour ignorer les nouveaux champs
  2. je fais les includes et exclude des données des sources
  3. je fais mon mapping que sur les champs que je veux dans elastic

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/dynamic.html

curl -X PUT http://localhost:9200/bidule -H 'Content-Type: application/json' -H 'Accept: application/json' -d'
{
  "bidule" : {
    "mappings" : {
      "ftype" : {
        "dynamic" : "false",
        "_source" : {
          "includes" : [ "a", "g" ],
          "excludes" : [ "c", "d", "e" ]
        },
        "properties" : {
          "a" : {
            "type" : "string"
          },
          "g" : {
            "type" : "string"
          }
        }
      }
    }
  }
}
je fais mon PUT DATA
curl -X PUT http://localhost:9200/bidule/ftype/1 -H 'Content-Type: application/json' -H 'Accept: application/json' -d'
{
   "a": "cdcwc",
   "b": 1,
   "c": {
   "6": 22,
   "322": [
        "aa",
        "ew",
        "fwefwe."
    ]
},
"d": null,
"e": "svgerbgerb",
"f": false,
"g": "rethrt",
"h": null,
"i": 55,
"j": null,
"k": null,
"l": null,
"m": "dasd",
"n": 88,
"o": "1",
"p": "asas"
}'

je fais mon GET DATA
'
resultat :) je suis content
curl -X GET http://localhost:9200/bidule/ftype/_search?pretty -H 'Content-Type: application/json' -H 'Accept: application/json' -d'
{
  "query": { "match_all": {} }
}
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "bidule",
      "_type" : "ftype",
      "_id" : "2",
      "_score" : 1.0,
      "_source" : {
        "a" : "cdcwc",
        "g" : "rethrt"
      }
    }, {
      "_index" : "bidule",
      "_type" : "ftype",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "a" : "cdcwc",
        "g" : "rethrt"
      }
    } ]
  }
}



Je regarderai l'ingest pipeline en 7.9, ca m'a l'air intéressant.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.