Importuj / indeksuj plik JSON do Elasticsearch

89

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?

Shawn Roller
źródło

Odpowiedzi:

88

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.

javanna
źródło
1
U mnie nie działa, kiedy wpisuję Twoje polecenie konsola nie podaje żadnych danych.
Konrad,
2
@Konrad Państwo wymienić jfblouvmlxecs01z localhost, prawda?
Ehtesh Choudhury
2
clwen - „@” mówi curl, aby załadował dane z pliku json.
Oliver
1
Cześć, jestem również nowy w wyszukiwaniu elastycznym, czy ktoś może mnie poznać, gdzie przechowywać te pliki .json?
swaheed
2
Gdzie przechowywać plik JSON?
AV94
26

Zgodnie z aktualnymi dokumentami, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Jeśli udostępniasz plik tekstowy do curl, musisz użyć flagi --data-binary zamiast zwykłego -d. Ta ostatnia nie zachowuje nowych linii.

Przykład:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
KenH
źródło
1
Zauważ, że plik json _bulk load nie jest prawidłowym plikiem JSON; składnię można znaleźć w linku do interfejsu API _bulk. Nie musisz też podawać identyfikatora _id, jak wskazano w tych przykładach; automatycznie wygenerowany identyfikator _id zostanie podany, gdy zostanie pominięty identyfikator _id.
Steve Tarver
16

Zrobiliśmy małe narzędzie do tego typu rzeczy https://github.com/taskrabbit/elasticsearch-dump

Evan
źródło
6
Podane przykłady nie obejmują postawionego tutaj pytania. Czy to zadziała, jeśli podamy plik json jako dane wejściowe i elastyczny URL wyszukiwania jako dane wyjściowe?
jgr0
11

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
MosheZada
źródło
To jest miłe! Dodaje obowiązkową indexlinię przed każdym dokumentem.
dr0i
2018-10-04 11: 51: 40.395741 Próba BŁĘDU [1/1] dostała wyjątek, jest to trwała utrata danych, nie ma już żadnych ponownych prób. - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): przekroczono limit czasu odczytu. (Read timeout = 10.0))) podczas przetwarzania
Chiel
Poza tym, że to nie działa, gdzie podajesz adres URL i port?
Chiel
Możesz odwiedzić stronę GitHub lub uruchomić elasticsearch_loader --help, aby wyświetlić pełną wiadomość pomocy. Możesz określić host: port za pomocą--es-host http://hostname:port
MosheZada
Ładny. Z wyjątkiem tego, że --typestaje się zbędne, ponieważ Elasticsearch usuwa typy w wersji 6 elast.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.
8

Dodając do odpowiedzi KenH

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

Można wymienić @requestsz@complete_path_to_json_file

Uwaga: @jest ważne przed ścieżką do pliku

Ram Pratap
źródło
czy możesz podać przykład ścieżki. daję „@c: \ accounts.json” i umieszczam go tam nawet wtedy, nie jest w stanie go zlokalizować
Piyush Mittal
4
powinno to być @ "c: \ accounts.json"
Ram Pratap,
dodaj flagę nagłówka taką jak -H "Content-Type: application / json"
Shady Kip
8

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

Greg Dougherty
źródło
8

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.

Gajendra D Ambi
źródło
6

po prostu weź listonosza z https://www.getpostman.com/docs/environments i podaj lokalizację pliku za pomocą polecenia / test / test / 1 / _bulk? pretty. wprowadź opis obrazu tutaj

Piyush Mittal
źródło
2
{"error": "nie znaleziono modułu obsługi dla uri [/ test / test / 1 / _bulk? pretty] i metody [POST]"}
Chiel,
{"error": "Nagłówek Content-Type [tekst / zwykły] nie jest obsługiwany", "status": 406}
X. L
5

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ć.

MLS
źródło
1

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>
thSoft
źródło
0

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
sudarshan
źródło
0

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

próbny

Jarosław Gaponow
źródło
0
  • 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
waseem khan
źródło