Изменить сопоставление строки по умолчанию, чтобы она не анализировалась в 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.


person Sagnik Sinha    schedule 15.12.2014    source источник


Ответы (4)


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

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

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

person Banjer    schedule 24.02.2015
comment
поля foo.raw пусты, а поля foo заполнены. я не понимаю - person Roland Kofler; 17.01.2016
comment
@Roland Kofler Вы узнали, почему они были пусты? У меня такая же проблема - person Matt Leonowicz; 18.03.2016
comment
@AviArro все, что я помню, так и задумано. Типа взлома. Больше не могу вспомнить - person Roland Kofler; 18.03.2016
comment
Предполагается ли, что все, у кого есть этот вопрос, будут использовать logstash? - person jononomo; 18.07.2016
comment
@JonCrowell хорошо и да и нет. На днях я наткнулся на свой ответ, когда НЕ использовал logstash. Я не смог просмотреть поле .raw и понял, что это было создано для меня logstash, поэтому мой ответ здесь не помог. :) Однако вопрос помечен и относится к logstash, поэтому имеет смысл принять мой ответ. Есть и другие связанные с SO вопросы и ответы о создании полей not_analyzed с помощью vanilla Elasticsearch, на которые можно сослаться. - person Banjer; 18.07.2016
comment
Logstash 5.x с Elasticsearch 5.x меняет сопоставление с .raw на .keywordelastic.co/guide/en/logstash/current/ - person Wex; 26.05.2017

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

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"
                        }
                    }
                }
            }
        }
    }
}'
person Sagnik Sinha    schedule 16.12.2014
comment
Что именно это делает? Как это работает? Не могли бы вы подробнее рассказать о том, что это за шаблон и как он применим к вопросу? - person Brad; 28.11.2015
comment
@Брэд, как вы можете видеть здесь, внутри dynamic templates и properties index устанавливается как not analyzed. В результате, если мы введем строку hello, I am Sinha, она будет обработана как одна строка и не будет разделена на hello I am Sinha - person Sagnik Sinha; 30.11.2015
comment
каково имя индекса, к которому применяется это сопоставление? - person AbtPst; 21.04.2016
comment
это относится ко всем индексам @AbtPst - person Sagnik Sinha; 22.04.2016
comment
хорошо, это имеет смысл. что, если я хочу применить только к некоторым полям индекса. скажем, у меня есть индекс ind. количество полей во входящих данных не фиксировано, но обязательно будет строка fieldd. Я хочу, чтобы анализировалось только поле d, а все остальные строковые поля не анализировались. - person AbtPst; 22.04.2016
comment
@SagnikSinha, что именно вы делаете, чтобы удалить поля .raw для каждого поля? Вы имели в виду, что удаление параметра полей в файле сопоставления приведет к удалению необработанной части каждого поля и сэкономит 50% места? У меня есть файл сопоставления, в котором у меня есть параметр fields для каждого поля, которое я извлекаю из журнала. - person vvs14; 06.05.2016

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

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

person Magnus Bäck    schedule 15.12.2014
comment
Кажется, это не дает мне желаемых результатов... У меня есть поле с именем State, в котором есть экземпляр с именем West Bengal. Когда я строю гистограмму, я получаю две разные легенды, а именно west и bengal, что неверно. Эта проблема все еще существует - person Sagnik Sinha; 16.12.2014
comment
Это в новом индексе? Имейте в виду, что изменение шаблона индекса не повлияет на существующие данные. - person Magnus Bäck; 16.12.2014
comment
Я удалил предыдущий индекс, обновил его и снова вставил. Да, это в новом индексе - person Sagnik Sinha; 16.12.2014
comment
Интересный. Что, если вы получите сопоставление индекса и посмотреть на фактическое используемое сопоставление? - person Magnus Bäck; 16.12.2014
comment
Он показывает, что {"promosms-16.12.2014":{"mappings":{"promosms_dec15":{"properties":{..............,"State":{"type":"string"},.........}}}}} нет информации о том, анализируется он или нет. - person Sagnik Sinha; 16.12.2014
comment
Я объявил все это как шаблон, и это сработало. Я установил "template" : "*" - person Sagnik Sinha; 16.12.2014

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

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

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

person Arslan Mehboob    schedule 01.11.2016