tutorial - puertos elasticsearch
Cambie la asignaciĆ³n predeterminada de la cadena a "no analizada" en Elasticsearch (4)
En mi sistema, la inserción de datos siempre se realiza a través de archivos csv a través de logstash.
Nunca predefiní el mapeo.
Pero cada vez que ingreso una cadena, siempre se toma para
analyzed
, como resultado, una entrada como
hello I am Sinha
se divide en
hello
,
I
,
am
,
Sinha
.
¿Hay alguna forma de que pueda cambiar la asignación predeterminada / dinámica de Elasticsearch para que todas las cadenas, independientemente del índice, independientemente del tipo, sean tomadas para
not analyzed
ser
not analyzed
?
¿O hay alguna forma de configurarlo en el archivo
.conf
?
Digamos que mi archivo
conf
parece
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
}
}
Quiero que
not analyzed
todas las cadenas y tampoco me importa que sea la configuración predeterminada para que todos los datos futuros se inserten en elasticsearch
Creo que actualizar el mapeo es un enfoque incorrecto solo para manejar un campo con fines informativos. Tarde o temprano es posible que desee poder buscar tokens en el campo. Si está actualizando el campo a "no analizado" y desea buscar foo desde un valor "foo bar", no podrá hacerlo.
Una solución más elegante es usar filtros de agregación de kibana en lugar de términos. Algo como a continuación buscará los términos ivr04 y ivr02. Entonces, en su caso, puede tener un filtro "Hola, soy Sinha". Espero que esto ayude.
Haga una copia de lib / logstash / salidas / elasticsearch / elasticsearch-template.json de su distribución Logstash (posiblemente instalada como /opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json), modifíquela reemplazándola
"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}
}
}
}
} ],
con
"dynamic_templates" : [ {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "string", "index" : "not_analyzed", "omit_norms" : true
}
}
} ],
y la
template
puntos para su complemento de salida a su archivo modificado:
output {
elasticsearch {
...
template => "/path/to/my-elasticsearch-template.json"
}
}
Todavía puede anular este valor predeterminado para campos particulares.
Puede consultar la versión
.raw
de su campo.
Esto se agregó en
Logstash 1.3.1
:
La plantilla de índice logstash que proporcionamos agrega un campo ".raw" a cada campo que indexa. Logstash establece estos campos ".raw" como "no_analizados" para que no tenga lugar ningún análisis o tokenización: ¡nuestro valor original se utiliza tal cual!
Entonces, si su campo se llama
foo
, consultaría
foo.raw
para devolver la
not_analyzed
(no dividida en delimitadores).
Solo crea una plantilla. correr
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"
}
}
}
}
}
}
}''