Jestem nowy w Elasticsearch i do tego momentu ręcznie wprowadzałem dane. Na przykład zrobiłem coś takiego:
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elastic Search"
}'
Mam teraz plik .json i chcę go zindeksować w Elasticsearch. Ja też próbowałem czegoś takiego, ale bez powodzenia:
curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json
Jak zaimportować plik .json? Czy są jakieś kroki, które muszę najpierw wykonać, aby upewnić się, że mapowanie jest prawidłowe?
json
elasticsearch
Shawn Roller
źródło
źródło
Odpowiedzi:
Właściwe polecenie, jeśli chcesz użyć pliku z curl, to:
curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json
Elasticsearch nie ma schematu, więc nie musisz koniecznie mapować. Jeśli wyślesz json bez zmian i użyjesz domyślnego mapowania, każde pole zostanie zindeksowane i przeanalizowane przy użyciu standardowego analizatora .
Jeśli chcesz współdziałać z Elasticsearch za pośrednictwem wiersza poleceń, możesz rzucić okiem na elasticshell, który powinien być nieco wygodniejszy niż curl.
10.07.2019: Należy zauważyć, że niestandardowe typy mapowania są przestarzałe i nie powinny być używane. Zaktualizowałem typ w powyższym adresie URL, aby łatwiej było zobaczyć, który był indeksem, a który typ, ponieważ oba nazwane „test” były mylące.
źródło
jfblouvmlxecs01
zlocalhost
, prawda?Zgodnie z aktualnymi dokumentami, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :
Przykład:
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
źródło
Zrobiliśmy małe narzędzie do tego typu rzeczy https://github.com/taskrabbit/elasticsearch-dump
źródło
Jestem autorem flexiblesearch_loader.
Napisałem ESL dla tego konkretnego problemu.
Możesz go pobrać za pomocą pip:
pip install elasticsearch-loader
Następnie będziesz mógł załadować pliki json do elasticsearch, wydając:
elasticsearch_loader --index incidents --type incident json file1.json file2.json
źródło
index
linię przed każdym dokumentem.elasticsearch_loader --help
, aby wyświetlić pełną wiadomość pomocy. Możesz określić host: port za pomocą--es-host http://hostname:port
--type
staje się zbędne, ponieważ Elasticsearch usuwa typy w wersji 6 elast.co/guide/en/elasticsearch/reference/6.0/…Dodając do odpowiedzi KenH
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Można wymienić
@requests
z@complete_path_to_json_file
Uwaga:
@
jest ważne przed ścieżką do plikuźródło
Jedna rzecz, o której nikt nie wspominał: plik JSON musi mieć jedną linię określającą indeks, do którego należy następny wiersz, dla każdej linii „czystego” pliku JSON.
TO ZNACZY
{"index":{"_index":"shakespeare","_type":"act","_id":0}} {"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}
Bez tego nic nie działa i nie powie ci dlaczego
źródło
Po prostu upewniłem się, że jestem w tym samym katalogu, co plik json, a następnie po prostu uruchomiłem to
curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json
Więc jeśli Ty też jesteś w tym samym katalogu i uruchom go w ten sposób. Uwaga: produkt / default / w poleceniu jest czymś specyficznym dla mojego środowiska. możesz go pominąć lub zastąpić tym, co jest dla Ciebie istotne.
źródło
po prostu weź listonosza z https://www.getpostman.com/docs/environments i podaj lokalizację pliku za pomocą polecenia / test / test / 1 / _bulk? pretty.
źródło
Ty używasz
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Jeśli „request” jest plikiem json, należy to zmienić na
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json
Wcześniej, jeśli plik json nie jest indeksowany, musisz wstawić wiersz indeksu przed każdym wierszem w pliku json. Możesz to zrobić z JQ. Zobacz poniższy link: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html
Przejdź do samouczków Flexiblesearch (na przykład samouczka Szekspira) i pobierz przykładowy plik json i zapoznaj się z nim. Przed każdym obiektem json (każdą pojedynczą linią) znajduje się linia indeksu. To jest to, czego szukasz po użyciu polecenia jq. Ten format jest obowiązkowy, aby używać zbiorczego interfejsu API, zwykłe pliki json nie będą działać.
źródło
Począwszy od Elasticsearch 7.7, musisz również określić typ zawartości:
curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>
źródło
jeśli używasz w nim VirtualBox i UBUNTU lub po prostu używasz UBUNTU, może to być przydatne
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
źródło
Napisałem kod, aby udostępnić API Elasticsearch za pośrednictwem API systemu plików.
Dobrym pomysłem jest na przykład wyraźny eksport / import danych.
Stworzyłem prototyp elastyczny napęd . Opiera się na FUSE
źródło
Jeśli używasz wyszukiwania elastycznego w wersji 7.7 lub nowszej, wykonaj poniższe polecenie.
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"
Na powyższej ścieżce do pliku jest
/Users/waseem.khan/waseem/elastic/account.json
.Jeśli używasz elastycznej wersji wyszukiwania 6.x, możesz użyć poniższego polecenia.
curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'
Uwaga : upewnij się, że w swoim pliku .json na końcu dodasz jedną pustą linię, w przeciwnym razie otrzymasz poniższy wyjątek.
"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
źródło