Dans mon système, l'insertion des données se fait toujours via des fichiers csv via logstash. Je n'ai jamais prédéfini le mappage. Mais chaque fois que j'entre une chaîne, elle est toujours considérée comme analyzed
, par conséquent une entrée comme hello I am Sinha
est divisé en hello
, I
, am
, Sinha
. Existe-t-il de toute façon que je pourrais modifier le mappage par défaut/dynamique d'Elasticsearch de sorte que toutes les chaînes, quel que soit leur index, quel que soit leur type, soient prises pour être not analyzed
? Ou existe-t-il un moyen de le définir dans le .conf
fichier? Dis que mon fichier conf
ressemble à
input {
file {
path => "/home/sagnik/work/logstash-1.4.2/bin/promosms_dec15.csv"
type => "promosms_dec15"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
columns => ["Comm_Plan","Queue_Booking","Order_Reference","Multi_Ordertype"]
separator => ","
}
Ruby {
code => "event['Generation_Date'] = Date.parse(event['Generation_Date']);"
}
}
output {
elasticsearch {
action => "index"
Host => "localhost"
index => "promosms-%{+dd.MM.YYYY}"
workers => 1
}
}
Je veux que toutes les chaînes soient not analyzed
et cela ne me dérange pas que ce soit le paramètre par défaut pour toutes les futures données à insérer dans elasticsearch
Vous pouvez interroger la version .raw
De votre champ. Cela a été ajouté dans Logstash 1.3.1 :
Le modèle d'index de logstash que nous fournissons ajoute un champ ".raw" à chaque champ que vous indexez. Ces champs ".raw" sont définis par logstash comme "not_analyzed" afin qu'aucune analyse ou tokenisation n'ait lieu - notre valeur d'origine est utilisée telle quelle!
Donc, si votre champ s'appelle foo
, vous demanderez à foo.raw
De renvoyer la version not_analyzed
(Non divisée sur les délimiteurs).
Créez simplement un modèle. courir
curl -XPUT localhost:9200/_template/template_1 -d '{
"template": "*",
"settings": {
"index.refresh_interval": "5s"
},
"mappings": {
"_default_": {
"_all": {
"enabled": true
},
"dynamic_templates": [
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"index": "not_analyzed",
"omit_norms": true,
"type": "string"
}
}
}
],
"properties": {
"@version": {
"type": "string",
"index": "not_analyzed"
},
"geoip": {
"type": "object",
"dynamic": true,
"path": "full",
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
}'
Faites une copie de lib/logstash/outputs/elasticsearch/elasticsearch-template.json à partir de votre distribution Logstash (éventuellement installée sous /opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json), modifiez-la en remplaçant
"dynamic_templates" : [ {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "string", "index" : "analyzed", "omit_norms" : true,
"fields" : {
"raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
}
}
}
} ],
avec
"dynamic_templates" : [ {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "string", "index" : "not_analyzed", "omit_norms" : true
}
}
} ],
et pointez template
pour votre plugin de sortie vers votre fichier modifié:
output {
elasticsearch {
...
template => "/path/to/my-elasticsearch-template.json"
}
}
Vous pouvez toujours remplacer cette valeur par défaut pour des champs particuliers.
Je pense que la mise à jour du mappage est une mauvaise approche juste pour gérer un champ à des fins de rapport. Tôt ou tard, vous souhaiterez peut-être rechercher des jetons dans le champ. Si vous mettez à jour le champ en "not_analyzed" et que vous souhaitez rechercher foo à partir d'une valeur "foo bar", vous ne pourrez pas le faire.
Une solution plus gracieuse consiste à utiliser des filtres d'agrégation kibana au lieu de termes. Quelque chose comme ci-dessous recherchera les termes ivr04 et ivr02. Donc, dans votre cas, vous pouvez avoir un filtre "Bonjour, je suis Sinha". J'espère que cela t'aides.