web-dev-qa-db-fra.com

Changer le mappage par défaut de la chaîne en "non analysé" dans Elasticsearch

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

35
Sagnik Sinha

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).

20
Banjer

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"
                        }
                    }
                }
            }
        }
    }
}'
28
Sagnik Sinha

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.

13
Magnus Bäck

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.

enter image description here

1
Arslan Mehboob