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
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.
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"
}
}
}
}
}
}
}'
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.
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.