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?
json
elasticsearch
Shawn Roller
fonte
fonte
Respostas:
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.
fonte
jfblouvmlxecs01
comlocalhost
, certo?De acordo com os documentos atuais, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :
Exemplo:
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
fonte
Fizemos uma pequena ferramenta para esse tipo de coisa https://github.com/taskrabbit/elasticsearch-dump
fonte
elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data
. Remova'username:password@'
se você não precisar.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
fonte
index
linha obrigatória antes de cada documento.elasticsearch_loader --help
para ver a mensagem de ajuda completa. Você pode especificar o host: port com--es-host http://hostname:port
--type
se torna redundante, pois Elasticsearch remove tipos na versão 6 elastic.co/guide/en/elasticsearch/reference/6.0/…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
fonte
Adicionando à resposta de KenH
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Você pode substituir
@requests
por@complete_path_to_json_file
Nota:
@
é importante antes do caminho do arquivofonte
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ê.
fonte
basta obter o carteiro em https://www.getpostman.com/docs/environments e fornecer a localização do arquivo com o comando / test / test / 1 / _bulk? pretty.
fonte
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.
fonte
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>
fonte
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
fonte
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
fonte
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
fonte
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))
fonte