Importar / indexar um arquivo JSON para o Elasticsearch


90

Eu sou novo no Elasticsearch e tenho inserido dados manualmente até este ponto. Por exemplo, eu fiz algo assim:

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

Agora tenho um arquivo .json e desejo indexá-lo no Elasticsearch. Eu tentei algo assim também, mas sem sucesso:

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

Como importo um arquivo .json? Há etapas que preciso executar primeiro para garantir que o mapeamento esteja correto?


Respostas:


89

O comando certo se você deseja usar um arquivo com curl é este:

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

Elasticsearch não tem esquema, portanto, você não precisa necessariamente de um mapeamento. Se você enviar o json como está e usar o mapeamento padrão, todos os campos serão indexados e analisados ​​usando o analisador padrão .

Se você quiser interagir com o Elasticsearch através da linha de comando, você pode querer dar uma olhada no elasticshell, que deve ser um pouco mais prático do que curl.

10/07/2019: deve-se observar que os tipos de mapeamento personalizado estão obsoletos e não devem ser usados. Eu atualizei o tipo no url acima para tornar mais fácil ver qual era o índice e qual era o tipo, já que ter ambos os nomes "teste" era confuso.


1
Não funciona para mim, quando digito Seu comando, o console não fornece nenhum dado.
Konrad

2
@ Konrad você substituiu jfblouvmlxecs01com localhost, certo?
Ehtesh Choudhury

2
clwen - o "@" diz ao curl para carregar os dados do arquivo json.
Oliver

1
Oi, eu também sou novo em pesquisa elástica, alguém pode me indicar onde armazenar esses arquivos .json?
swaheed de

2
Onde armazenar o arquivo json?
AV94

27

De acordo com os documentos atuais, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Se estiver fornecendo entrada de arquivo de texto para curl, você deve usar a sinalização --data-binary em vez de -d simples. Este último não preserva novas linhas.

Exemplo:

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

1
Observe que o arquivo _bulk load json não é um arquivo json válido; a sintaxe é fornecida no link da API _bulk. Além disso, você não precisa fornecer um _id conforme indicado nesses exemplos; um _id gerado automaticamente será fornecido quando _id for omitido.
Steve Tarver

17

Fizemos uma pequena ferramenta para esse tipo de coisa https://github.com/taskrabbit/elasticsearch-dump


6
Os exemplos fornecidos não cobrem a pergunta feita aqui. Funcionará se dermos o arquivo json como entrada e o URL de pesquisa elástico como saída?
jgr0

Estou usando isso para exportar o índice para json. Obrigado.
Krishna Chaitanya Gopaluni

Use o seguinte comando. elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data. Remova 'username:password@'se você não precisar.
Krishna Chaitanya Gopaluni 01 de

11

Sou o autor de elasticsearch_loader
, escrevi ESL exatamente para esse problema.

Você pode baixá-lo com pip:

pip install elasticsearch-loader

E então você poderá carregar arquivos json no elasticsearch emitindo:

elasticsearch_loader --index incidents --type incident json file1.json file2.json

Isso é legal! Ele adiciona a indexlinha obrigatória antes de cada documento.
dr0i

04/10/2018 11: 51: 40.395741 ERROR tentativa [1/1] obteve exceção, é uma perda de dados permanente, não há mais nenhuma tentativa 2018-10-04 11: 51: 40.395741 WARN Chunk 0 obteve exceção (ConnectionTimeout causado por - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Tempo limite de leitura esgotado. (Tempo limite de leitura = 10.0))) durante o processamento
Chiel

Além do fato de que não funciona, onde você especifica o URL e a porta?
Chiel

Você pode visitar a página do GitHub ou executar elasticsearch_loader --helppara ver a mensagem de ajuda completa. Você pode especificar o host: port com--es-host http://hostname:port
MosheZada

Agradável. Exceto que --typese torna redundante, pois Elasticsearch remove tipos na versão 6 elastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.

9

Uma coisa que não vi ninguém mencionar: o arquivo JSON deve ter uma linha especificando o índice ao qual a próxima linha pertence, para cada linha do arquivo JSON "puro".

IE

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

Sem isso, nada funciona e não vai te dizer por que


8

Adicionando à resposta de KenH

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

Você pode substituir @requestspor@complete_path_to_json_file

Nota: @é importante antes do caminho do arquivo


u pode dar algum exemplo para o caminho. Estou dando "@c: \ accounts.json" e colocando lá mesmo assim, não é possível localizá-lo
Piyush Mittal

4
deve ser @ "c: \ accounts.json"
Ram Pratap

adicione um sinalizador de cabeçalho como -H "Content-Type: application / json"
Shady Kip

8

Eu apenas me certifiquei de que estou no mesmo diretório do arquivo json e então simplesmente executei este

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

Portanto, se você também, certifique-se de estar no mesmo diretório e execute-o desta forma. Nota: product / default / no comando é algo específico para meu ambiente. você pode omiti-lo ou substituí-lo pelo que for relevante para você.



5

Você está usando

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

Se 'requisições' é um arquivo json então você tem que mudar isto para

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

Agora, antes disso, se seu arquivo json não estiver indexado, você deve inserir uma linha de índice antes de cada linha dentro do arquivo json. Você pode fazer isso com JQ. Consulte o link abaixo: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Vá para os tutoriais do elasticsearch (exemplo do tutorial de Shakespeare) e baixe a amostra do arquivo json usado e dê uma olhada nele. Na frente de cada objeto json (cada linha individual), há uma linha de índice. Isso é o que você procura após usar o comando jq. Este formato é obrigatório para usar a API em massa, arquivos json simples não funcionam.


2

A partir do Elasticsearch 7.7, você também deve especificar o tipo de conteúdo:

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

1
  • Se você estiver usando a pesquisa elástica 7.7 ou versão superior, siga o comando abaixo.

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

  • No caminho do arquivo acima é /Users/waseem.khan/waseem/elastic/account.json.

  • Se você estiver usando a versão 6.x da pesquisa elástica, poderá usar o comando abaixo.

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

Nota : Certifique-se de que em seu arquivo .json, no final, você adicionará uma linha vazia, caso contrário, receberá a exceção abaixo.

"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

0

se você estiver usando o VirtualBox e UBUNTU nele ou simplesmente estiver usando o UBUNTU, ele pode 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

0

Eu escrevi alguns códigos para expor a API Elasticsearch por meio de uma API Filesystem.

É uma boa ideia para uma exportação / importação clara de dados, por exemplo.

Criei um protótipo de chave de elasticidade . É baseado no FUSE

demo


0

Se você deseja importar um arquivo json para o Elasticsearch e criar um índice, use este script Python.

import json
from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
i = 0
with open('el_dharan.json') as raw_data:
    json_docs = json.load(raw_data)
    for json_doc in json_docs:
            i = i + 1
            es.index(index='ind_dharan', doc_type='doc_dharan', id=i, body=json.dumps(json_doc))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.