Importar / indexar un archivo JSON en Elasticsearch

89

Soy nuevo en Elasticsearch y he estado ingresando datos manualmente hasta este momento. Por ejemplo, he hecho algo como esto:

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

Ahora tengo un archivo .json y quiero indexarlo en Elasticsearch. También intenté algo como esto, pero no tuve éxito:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json

¿Cómo importo un archivo .json? ¿Hay pasos que deba tomar primero para asegurarme de que el mapeo sea correcto?

Rodillo de Shawn
fuente

Respuestas:

88

El comando correcto si desea usar un archivo con curl es este:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json

Elasticsearch no tiene esquema, por lo que no necesariamente necesita un mapeo. Si envía el json como está y usa el mapeo predeterminado, cada campo se indexará y analizará usando el analizador estándar .

Si desea interactuar con Elasticsearch a través de la línea de comandos, es posible que desee echar un vistazo a elasticshell que debería ser un poco más útil que curl.

2019-07-10: Debe tenerse en cuenta que los tipos de mapeo personalizados están en desuso y no deben usarse. Actualicé el tipo en la URL anterior para que sea más fácil ver cuál era el índice y cuál era el tipo, ya que tener ambos nombres "prueba" era confuso.

javanna
fuente
1
No funciona para mí, cuando escribo Tu comando, la consola no proporciona ningún dato.
Konrad
2
@Konrad ha sustituido jfblouvmlxecs01con localhost, ¿verdad?
Ehtesh Choudhury
2
clwen - el "@" le dice a curl que cargue los datos del archivo json.
Oliver
1
hola, también soy nuevo en la búsqueda elástica, ¿alguien puede indicarme dónde almacenar estos archivos .json?
Swaheed el
2
¿Dónde almacenar el archivo json?
AV94
26

Según los documentos actuales, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Si está proporcionando entrada de archivo de texto a curl, debe usar la marca --data-binary en lugar de simple -d. Este último no conserva nuevas líneas.

Ejemplo:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
KenH
fuente
1
Tenga en cuenta que el archivo json _bulk load no es válido como un archivo json válido; la sintaxis se proporciona en el enlace _bulk API. Además, no es necesario que proporcione un _id como se indica en estos ejemplos; se proporcionará un _id generado automáticamente cuando se omita _id.
Steve Tarver
16

Hicimos una pequeña herramienta para este tipo de cosas https://github.com/taskrabbit/elasticsearch-dump

Evan
fuente
6
Los ejemplos dados no cubren la pregunta formulada aquí. ¿Funcionará si le damos el archivo json como entrada y la URL de búsqueda elástica como salida?
jgr0
11

Soy el autor de elasticsearch_loader
. Escribí ESL para este problema exacto.

Puedes descargarlo con pip:

pip install elasticsearch-loader

Y luego podrá cargar archivos json en elasticsearch emitiendo:

elasticsearch_loader --index incidents --type incident json file1.json file2.json
MosheZada
fuente
¡Esto es bonito! Agrega la indexlínea obligatoria antes de cada documento.
dr0i
2018-10-04 11: 51: 40.395741 ERROR intento [1/1] obtuvo una excepción, es una pérdida de datos permanente, no hay reintento más 2018-10-04 11: 51: 40.395741 WARN Chunk 0 obtuvo una excepción (ConnectionTimeout causado por - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): tiempo de lectura agotado (tiempo de espera de lectura = 10.0))) mientras se procesa
Chiel
Aparte del hecho de que no funciona, ¿dónde especificas la URL y el puerto?
Chiel
Puede visitar la página de GitHub o ejecutar elasticsearch_loader --helppara ver el mensaje de ayuda completo. Puede especificar el host: puerto con--es-host http://hostname:port
MosheZada
Agradable. Excepto que se --typevuelve redundante ya que Elasticsearch elimina los tipos en la versión 6 elastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.
8

Añadiendo a la respuesta de KenH

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Puedes reemplazar @requestscon@complete_path_to_json_file

Nota: @es importante antes de la ruta del archivo.

Ram Pratap
fuente
¿Puedes dar algún ejemplo de ruta? Estoy dando "@c: \ accounts.json" y colocándolo allí, incluso entonces, no puedo ubicarlo
Piyush Mittal
4
debería ser @ "c: \ accounts.json"
Ram Pratap
8

Una cosa que no he visto a nadie mencionar: el archivo JSON debe tener una línea que especifique el índice al que pertenece la siguiente línea, para cada línea del archivo JSON "puro".

ES DECIR

{"index":{"_index":"shakespeare","_type":"act","_id":0}}
{"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}

Sin eso, nada funciona y no te dirá por qué

Greg Dougherty
fuente
7

Me aseguré de estar en el mismo directorio que el archivo json y luego simplemente ejecuté esto

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

Entonces, si usted también, asegúrese de estar en el mismo directorio y ejecútelo de esta manera. Nota: producto / predeterminado / en el comando es algo específico de mi entorno. puede omitirlo o reemplazarlo con lo que sea relevante para usted.

Gajendra D Ambi
fuente
6

simplemente obtén al cartero de https://www.getpostman.com/docs/environments dale la ubicación del archivo con el comando / test / test / 1 / _bulk? pretty. ingrese la descripción de la imagen aquí

Piyush Mittal
fuente
2
{"error": "no se encontró un controlador para uri [/ test / test / 1 / _bulk? pretty] y el método [POST]"}
Chiel
{"error": "El encabezado de tipo de contenido [texto / sin formato] no es compatible", "estado": 406}
X. L
5

Tu estas usando

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Si 'solicitudes' es un archivo json, entonces debe cambiarlo a

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json

Ahora, antes de esto, si su archivo json no está indexado, debe insertar una línea de índice antes de cada línea dentro del archivo json. Puede hacer esto con JQ. Consulte el enlace a continuación: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Vaya a los tutoriales de elasticsearch (por ejemplo, el tutorial de Shakespeare) y descargue el archivo json de muestra utilizado y échele un vistazo. Delante de cada objeto json (cada línea individual) hay una línea de índice. Esto es lo que busca después de usar el comando jq. Este formato es obligatorio para usar la API masiva, los archivos json simples no funcionarán.

MLS
fuente
1

A partir de Elasticsearch 7.7, también debe especificar el tipo de contenido:

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>
thSoft
fuente
0

si está usando VirtualBox y UBUNTU en él o simplemente está usando UBUNTU, entonces puede ser útil

wget https://github.com/andrewvc/ee-datasets/archive/master.zip
sudo apt-get install unzip (only if unzip module is not installed)
unzip master.zip
cd ee-datasets
java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader
sudarshan
fuente
0

Escribí un código para exponer la API de Elasticsearch a través de una API del sistema de archivos.

Es una buena idea, por ejemplo, para una exportación / importación clara de datos.

He creado el prototipo elasticdriver . Se basa en FUSE

manifestación

Yaroslav Gaponov
fuente
0
  • Si está utilizando la búsqueda elástica 7.7 o una versión superior, siga el siguiente comando.

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"

  • En la ruta del archivo anterior es /Users/waseem.khan/waseem/elastic/account.json.

  • Si está utilizando la versión 6.x de búsqueda elástica, puede utilizar el siguiente comando.

curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'

Nota : asegúrese de que en su archivo .json al final agregará una línea vacía; de lo contrario, obtendrá la siguiente excepción.

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
],
"type" : "illegal_argument_exception",
"reason" : "The bulk request must be terminated by a newline [\n]"
},
`enter code here`"status" : 400
waseem khan
fuente