Изменение отображения по умолчанию для строки «не анализировано» в Elasticsearch

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

 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 либо

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

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

Поэтому, если ваше поле называется foo , вы должны запросить foo.raw чтобы вернуть not_analyzed (не разделить на разделители).

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

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

Сделайте копию файла lib / logstash / output / 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" } } 

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

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

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

введите описание изображения здесь

Давайте будем гением компьютера.