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?


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.


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

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


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

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


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


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.



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


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>

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.