Changer le mapping d'un type via Sense


#1

Bonjour,

Je suis ce qu'on peut appeler un "newbie" dans le monde Elasticsearch/kibana/Logstash.
Je m'essaie avec ces outils à partir d'un exemple qui me semble basique : importer les lignes d'un fichier csv.

L'ETL est Logstash
Le moteur de recherche est elasticsearch
La présentation se fait via Kibana

Rien d'exceptionnel.

Ma config logstash est la suivante :

input {
  file {
	path => ["C:\my_file.csv"]
	start_position => "beginning"
  }
}

filter {
  csv {
    columns => [
		"DepId",
		"DepNumber",
		"DepName",
		"CompanyId",
		"CompanyNumber",
		"CompanyName",
		"RoomId",
		"RoomCode",
		"RoomName",
		"RoomCity",
		"RoomNumber",
		"RoomDay",
		"RoomTime",
	]
    separator => ";"
    remove_field => ["message","host","path"]
  }
}
 
output {
    elasticsearch {
		hosts => ["localhost:9200"]
		index => "my_index"
		document_type => "dep"
  }
  stdout {}
}

L'import se fait très bien ... mais lorsque j'utilise Kibana pour présenter différentes statistiques, je constate que les champs ont été indexées avec la notion "analyzed". C'est-à-dire, par exemple, que pour le champ RoomCity, une valeur comme Boulogne-Sur-Mer est considéré en 3 termes "Boulogne" "Sur" "Mer".

J'aimerais forcer l'index à not_analyzed sur différents champs. Quelle requête dois-je effectuer via la webapp Sense pour modifier ce mapping (je n'ai pas curl).

Pour information, lorsque j'exécute GET /my_index/dep/_mapping, j'obtiens :

{
  "my_index": {
    "mappings": {
      "dep": {
        "properties": {
          "@timestamp": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "@version": {
            "type": "string"
          },
          "CompanyId": {
            "type": "string"
          },
          "CompanyName": {
            "type": "string"
          },
          "CompanyNumber": {
            "type": "string"
          },
          "RoomDay": {
            "type": "string"
          },
          "RoomId": {
            "type": "string"
          },
          "RoomTime": {
            "type": "string"
          },
          "RoomCity": {
            "type": "string"
          },
          "RoomCode": {
            "type": "string"
          },
          "RoomName": {
            "type": "string"
          },
          "RoomNumber": {
            "type": "string"
          },
          "DepId": {
            "type": "string"
          },
          "DepName": {
            "type": "string"
          },
          "DepNumber": {
            "type": "string"
          }
        }
      }
    }
  }
}

Merci d'avance.


(David Pilato) #2

Le template par défaut de logstash fait ça. Il ajoute des sous-champs raw qui sont non analysés. Cela permet de répondre typiquement au problème des noms des villes.

Mais il ne fonctionne que si ton index se nomme logstash-*.

Du coup, là, je te conseille de copier le template et le modifier puis d'utiliser les champs template et template_name de l'output elasticsearch.

https://github.com/logstash-plugins/logstash-output-elasticsearch/blob/master/lib/logstash/outputs/elasticsearch/elasticsearch-template.json

J'ai rédigé un blog post qui à un moment décrit l'usage d'un template propre à son besoin: http://david.pilato.fr/blog/2015/12/10/building-a-directory-map-with-elk/


#3

Merci David.
J'ai relancé un import avec logstash en utilisant un index de type logstash-*.

Dans l'onglet "Discover" de Kibana, lorsque je clique sur le field RoomCity, je pré-visualise (top 5 des valeurs) correctement les valeurs de type "Boulogne-sur-Mer" ... mais lorsque je veux visualiser (clique sur Visualize) ce field spécifique, j'obtiens le pop-up d'erreur suivant :

Error: Request to Elasticsearch failed: {"error":{"root_cause":[{"type":"exception","reason":"java.lang.IllegalStateException: Field data loading is forbidden on RoomCity"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"logstash-2016.02.26","node":"TLrvWCWhQrC2jfPka280MQ","reason":{"type":"exception","reason":"java.lang.IllegalStateException: Field data loading is forbidden on RoomCity","caused_by":{"type":"unchecked_execution_exception","reason":"java.lang.IllegalStateException: Field data loading is forbidden on RoomCity","caused_by":{"type":"illegal_state_exception","reason":"Field data loading is forbidden on RoomCity"}}}}]}}
    at http://localhost:5601/bundles/kibana.bundle.js?v=9693:80074:39
    at Function.Promise.try (http://localhost:5601/bundles/commons.bundle.js?v=9693:61110:23)
    at http://localhost:5601/bundles/commons.bundle.js?v=9693:61079:31
    at Array.map (native)
    at Function.Promise.map (http://localhost:5601/bundles/commons.bundle.js?v=9693:61078:31)
    at callResponseHandlers (http://localhost:5601/bundles/kibana.bundle.js?v=9693:80046:23)
    at http://localhost:5601/bundles/kibana.bundle.js?v=9693:79553:17
    at processQueue (http://localhost:5601/bundles/commons.bundle.js?v=9693:42356:29)
    at http://localhost:5601/bundles/commons.bundle.js?v=9693:42372:28
    at Scope.$eval (http://localhost:5601/bundles/commons.bundle.js?v=9693:43600:29)

Et donc rien ne s'affiche de manière graphique.


(David Pilato) #4

Je pense que ça vient de ça: https://github.com/elastic/elasticsearch/issues/15267#issuecomment-163657397


(system) #5