wake-up-neo.com

Ändern Sie die Standardzuordnung der Zeichenfolge in Elasticsearch in "Nicht analysiert"

In meinem System erfolgt das Einfügen von Daten immer über CSV-Dateien über Logstash. Ich definiere das Mapping nie im Voraus. Aber wenn ich eine Zeichenkette eingebe, wird sie immer als analyzed angenommen, was zu einem Eintrag wie hello I am Sinha ist aufgeteilt in hello, I, am, Sinha. Gibt es sowieso ich könnte die Standard/dynamische Zuordnung von elasticsearch ändern, so dass alle Zeichenfolgen, unabhängig vom Index, unabhängig vom Typ, als not analyzed? Oder gibt es eine Möglichkeit, es im .conf Datei? Angenommen, meine conf -Datei sieht aus wie

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
    }
}

Ich möchte, dass alle Saiten not analyzed und es macht mir nichts aus, wenn alle zukünftigen Daten standardmäßig in elasticsearch eingefügt werden

35
Sagnik Sinha

Sie können die .raw - Version Ihres Feldes abfragen. Dies wurde hinzugefügt in Logstash 1.3.1 :

Die von uns bereitgestellte Logstash-Indexvorlage fügt jedem Feld, das Sie indizieren, ein ".raw" -Feld hinzu. Diese ".raw" -Felder werden von logstash als "not_analyzed" gesetzt, damit keine Analyse oder Tokenisierung stattfindet - unser ursprünglicher Wert wird unverändert verwendet!

Wenn Ihr Feld also foo heißt, fragen Sie foo.raw Ab, um die Version not_analyzed (Nicht auf Trennzeichen aufgeteilt) zurückzugeben.

20
Banjer

Erstellen Sie einfach eine Vorlage. Lauf

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

Erstellen Sie eine Kopie der Datei lib/logstash/output/elasticsearch/elasticsearch-template.json aus Ihrer Logstash-Distribution (möglicherweise installiert als /opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json) und ändern Sie sie durch Ersetzen

"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}
      }
    }
  }
} ],

mit

"dynamic_templates" : [ {
  "string_fields" : {
    "match" : "*",
    "match_mapping_type" : "string",
    "mapping" : {
      "type" : "string", "index" : "not_analyzed", "omit_norms" : true
    }
  }
} ],

und zeige template für das Ausgabe-Plugin in deine geänderte Datei:

output {
  elasticsearch {
    ...
    template => "/path/to/my-elasticsearch-template.json"
  }
}

Sie können diese Standardeinstellung weiterhin für bestimmte Felder überschreiben.

13
Magnus Bäck

Ich denke, die Aktualisierung der Zuordnung ist ein falscher Ansatz, nur um ein Feld für Berichtszwecke zu behandeln. Früher oder später möchten Sie möglicherweise das Feld nach Token durchsuchen können. Wenn Sie das Feld auf "not_analyzed" aktualisieren und von einem Wert "foo bar" nach foo suchen möchten, können Sie dies nicht tun.

Eine elegantere Lösung ist die Verwendung von Kibana-Aggregationsfiltern anstelle von Begriffen. So etwas wie unten wird nach den Begriffen ivr04 und ivr02 suchen. In deinem Fall kannst du also einen Filter "Hallo, ich bin Sinha" haben. Hoffe das hilft.

enter image description here

1
Arslan Mehboob