Изменение отображения по умолчанию для строки "не анализировано" в 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 либо
Ответы
Ответ 1
Вы можете запросить версию .raw
вашего поля. Это было добавлено в Logstash 1.3.1:
Созданный нами индексный шаблон стартаста добавляет поле ".raw" для каждого поля, которое вы индексируете. Эти поля ".raw" устанавливаются с помощью logstash как "not_analyzed", так что анализ или токенизация не происходит - наше исходное значение используется как-есть!
Итак, если ваше поле называется foo
, вы должны запросить foo.raw
, чтобы вернуть версию not_analyzed
(не разделить на разделители).
Ответ 2
Просто создайте шаблон. пробег
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"
}
}
}
}
}
}
}'
Ответ 3
Сделайте копию файла 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
}
}
} ],
и point template
для вывода плагина в измененный файл:
output {
elasticsearch {
...
template => "/path/to/my-elasticsearch-template.json"
}
}
Вы по-прежнему можете переопределить это значение по умолчанию для определенных полей.
Ответ 4
Я думаю, что обновление сопоставления является неправильным подходом только для обработки поля для целей отчетности. Рано или поздно вы можете захотеть найти поле для токенов. Если вы обновляете поле до "not_analyzed" и хотите найти foo из значения "foo bar", вы не сможете этого сделать.
Более грациозным решением является использование фильтров агрегации kibana вместо терминов. Что-то вроде ниже будет искать термины ivr04 и ivr02. Так что в вашем случае вы можете получить фильтр "Привет, я Синьха". Надеюсь, это поможет.
![введите описание изображения здесь]()