35

В моей системе вставка данных всегда выполняется через файлы csv через logstash. Я никогда не предопределял отображение. Но всякий раз, когда я вводил строку, всегда принималось значение analyzed, в результате запись типа hello I am Sinha делится на hello, I, am, Sinha. В любом случае я могу изменить стандартное/динамическое отображение elasticsearch так, чтобы все строки, независимо от индекса, независимо от типа принимались равными not analyzed? Или есть способ установить его в файле .conf? Скажем, мой conf файл выглядитИзменить соответствие по умолчанию для строки «не проанализировать» в Elasticsearch

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

Я хочу, чтобы все строки, чтобы быть not analyzed и я не против того, чтобы быть настройки для всех будущих данных по умолчанию, которые будут вставлены в elasticsearch либо

ответ

20

Вы можете запросить версию вашего поля .raw. Это было добавлено в Logstash 1.3.1:

Введенный нами индексный шаблон статиста содержит поле «.raw» для каждого поля, которое вы индексируете. Эти поля «.raw» устанавливаются logstash как «not_analyzed», так что анализ или токенизация не происходит - наше исходное значение используется как есть!

Так что, если ваше поле называется foo, вы бы запросить foo.raw вернуть not_analyzed (не расщепляется на разделителей) версии.

+3

поля foo.raw пусты, а поля foo заполнены. Я не понимаю –

+1

@ Roland Kofler Вы выяснили, почему они были пусты ?. У меня такая же проблема –

+1

@AviArro все, что я помню, это так. Вид взлома. Больше я не могу вспомнить –

13

Сделайте копию lib/logstash/results/elasticsearch/elasticsearch-template.json из вашего дистрибутива Logstash (возможно, установленного как /opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json), измените его, заменив

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

с

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

и точки template для вас выходной плагин для вашего измененного файла:

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

Вы все еще можете изменить это значение по умолчанию для определенных полей.

+0

Это, кажется, не дают мне желаемые результаты ... У меня есть поле с именем 'State', который имеет экземпляр с именем' West Bengal'. Когда я рисую гистограмму, я получаю две разные легенды: «запад» и «бенгаль», что неправильно. Эта проблема все еще существует –

+0

Это новый индекс?Имейте в виду, что изменение шаблона индекса не повлияет на существующие данные. –

+0

Я удалил предыдущий индекс, обновил его и снова вставил. Да, его в новом указателе –

28

Просто создайте шаблон. пробег

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" 
         } 
        } 
       } 
      } 
     } 
    } 
}' 
+9

Что именно это делает * *? Как это работает*? Можете ли вы подробнее рассказать о том, что такое этот шаблон и как он относится к вопросу? – Brad

+0

@Brad, как вы можете видеть здесь, внутри 'dynamic templates' и' properties', 'index' устанавливается как' not anal'. В результате, если мы вводим строку 'hello, я Sinha', она будет рассматриваться как одна строка и не будет разделена на' hello' '' '' '' Sinha' –

+0

, что такое индексное имя, которое относится к этому сопоставлению ? – AbtPst

1

Я думаю, что обновление отображения является неправильным подходом только для обработки поля для целей отчетности. Рано или поздно вы можете захотеть найти поле для токенов. Если вы обновляете поле до «not_analyzed» и хотите найти foo из значения «foo bar», вы не сможете этого сделать.

Более грациозным решением является использование фильтров агрегации kibana вместо терминов. Что-то вроде ниже будет искать термины ivr04 и ivr02. Так что в вашем случае вы можете получить фильтр «Привет, я Синьха». Надеюсь это поможет.

enter image description here