Elastic Search 서버에서 json 파일(문서 100장)을 Import할 수 있는 방법이 있습니까?
Elastic Search 서버에서 JSON 파일(100개의 문서 포함)을 Import할 수 있는 방법이 있습니까?큰 json 파일을 es-server로 Import하고 싶다.
dadonet이 이미 언급했듯이 bulk API를 사용하는 것이 좋습니다.벌크 프로토콜의 파일을 변환하려면 jq를 사용할 수 있습니다.
파일에 문서만 포함되어 있다고 가정하면 다음과 같습니다.
$ echo '{"foo":"bar"}{"baz":"qux"}' |
jq -c '
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
또한 파일에 최상위 목록의 문서가 포함된 경우 먼저 래핑을 해제해야 합니다.
$ echo '[{"foo":"bar"},{"baz":"qux"}]' |
jq -c '
.[] |
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
jq의-c플래그를 지정하면 각 문서가 한 줄에 하나씩 표시됩니다.
파이프로 직선으로 구부리고 싶다면--data-binary @-뿐만 아니라-d그렇지 않으면 컬이 다시 새 라인을 제거합니다.
일괄 API를 사용해야 합니다.각 json 문서 앞에 헤더 행을 추가해야 합니다.
$ cat requests
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests; echo
{"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1,"ok":true}}]}
누군가 이걸 원할 테니 제가 쉽게 찾아볼게요.
참고로 이것은 새로운 ES 인스턴스와 같은 서버에서 Node.js(기본적으로 배치스크립트로 사용)를 사용하고 있습니다.각각 4000개의 항목이 있는 2개의 파일로 실행했는데 공유 가상 서버에서는 12초밖에 걸리지 않았습니다.YMMV
var elasticsearch = require('elasticsearch'),
fs = require('fs'),
pubs = JSON.parse(fs.readFileSync(__dirname + '/pubs.json')), // name of my first file to parse
forms = JSON.parse(fs.readFileSync(__dirname + '/forms.json')); // and the second set
var client = new elasticsearch.Client({ // default is fine for me, change as you see fit
host: 'localhost:9200',
log: 'trace'
});
for (var i = 0; i < pubs.length; i++ ) {
client.create({
index: "epubs", // name your index
type: "pub", // describe the data thats getting created
id: i, // increment ID every iteration - I already sorted mine but not a requirement
body: pubs[i] // *** THIS ASSUMES YOUR DATA FILE IS FORMATTED LIKE SO: [{prop: val, prop2: val2}, {prop:...}, {prop:...}] - I converted mine from a CSV so pubs[i] is the current object {prop:..., prop2:...}
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response); // I don't recommend this but I like having my console flooded with stuff. It looks cool. Like I'm compiling a kernel really fast.
}
});
}
for (var a = 0; a < forms.length; a++ ) { // Same stuff here, just slight changes in type and variables
client.create({
index: "epubs",
type: "form",
id: a,
body: forms[a]
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response);
}
});
}
내가 이 일로 나 자신보다 더 많은 것을 도울 수 있기를 바란다.로켓 과학이 아니라 누군가를 10분이나 절약할 수 있다.
건배.
jq는 가볍고 유연한 명령줄 JSON 프로세서입니다.
사용방법:
cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-
file.json 파일을 가져와 -c 플래그를 사용하여 먼저 jq에 내용을 파이핑하여 콤팩트한 출력을 구축합니다.여기 덩어리가 있습니다.우리는 jq가 입력 한 줄당 하나의 객체뿐만 아니라 여러 객체를 구성할 수 있다는 사실을 이용하고 있습니다.각 행에 대해 JSON Elastic Search가 필요로 하는 제어(원래 객체의 ID를 사용하여)를 만들고 원본 JSON 객체(.)에 불과한 두 번째 행을 만듭니다.
이 시점에서 JSON은 Elasticsearch의 벌크 API가 예상하는 대로 포맷되어 있기 때문에 어느 POST를 Elasticsearch에 POST 할 수 있도록 파이핑하기만 하면 됩니다.
Kevin Marsh의 공로
아니오를 가져오지만 ES API를 사용하여 문서를 색인화할 수 있습니다.
인덱스 api를 사용하여 각 행을 로드하거나(파일 읽기 및 컬 호출을 위해 일종의 코드를 사용), 인덱스 벌크 api를 사용하여 모든 행을 로드할 수 있습니다.데이터 파일을 사용할 수 있도록 포맷할 수 있다고 가정합니다.
간단한 셸 스크립트는 다음과 같은 셸에 익숙하다면 도움이 됩니다(테스트되지 않음).
while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json
Python이나 Elastic Search 클라이언트 중 하나를 사용합니다.
Stream2es는 데이터를 es에 빠르게 로드하는데도 매우 유용합니다.또한 단순히 파일을 스트리밍하는 방법도 있습니다.(파일을 테스트한 적은 없지만 es 성능 테스트를 위해 위키피디아 문서를 로드하기 위해 사용하고 있습니다.)
Stream2es가 IMO의 가장 쉬운 방법입니다.
예: JSON 문서 목록을 포함하는 파일 "some.json"을 한 줄에 하나씩 가정합니다.
curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type
빠르고 간단한 벌크 인덱서인 esbulk를 사용할 수 있습니다.
$ esbulk -index myindex file.ldj
이것은 구텐베르크 프로젝트 데이터를 Elastic Search에 11초 만에 로드하는 모습을 보여주는 방송입니다.
면책사항:제가 작가입니다.
Elasticsearch Gatherr 플러그인을 사용할 수 있습니다.
Elastic Search용 gatherer 플러그인은 확장 가능한 데이터 가져오기 및 인덱싱을 위한 프레임워크입니다.컨텐츠 어댑터는 Elastic Search 노드를 통해 배포 가능한 특수한 종류의 플러그인인 gather zip 아카이브에 구현됩니다.작업 요청을 수신하여 로컬 큐에서 실행할 수 있습니다.작업 상태는 특수 인덱스로 유지됩니다.
이 플러그인은 개발 중입니다.
마일스톤 1 - 노드에 Gatherer zip 전개
마일스톤 2 - 작업 지정 및 실행
마일스톤 3 - JDBC 강을 JDBC 수집기로 이동
마일스톤 4 - 로드/큐 길이/노드 이름별 수집기 작업 분포, cron 작업
마일스톤 5 - 수집자, 콘텐츠 어댑터 증가
참조:https://github.com/jprante/elasticsearch-gatherer
한 가지 방법은 일괄 삽입을 수행하는 bash 스크립트를 작성하는 것입니다.
curl -XPOST http://127.0.0.1:9200/myindexname/type/_bulk?pretty=true --data-binary @myjsonfile.json
삽입 실행 후 다음 명령을 실행하여 카운트를 가져옵니다.
curl http://127.0.0.1:9200/myindexname/type/_count
언급URL : https://stackoverflow.com/questions/20646836/is-there-any-way-to-import-a-json-filecontains-100-documents-in-elasticsearch
'programing' 카테고리의 다른 글
| 청구 필드를 삭제할 때 WooCommerce 오류가 발생했습니다. "계속하려면 주소를 입력하십시오." (0) | 2023.04.04 |
|---|---|
| 스프링 부트 상태에 커스텀 상태 체크를 추가하는 방법 (0) | 2023.04.04 |
| Java 스크립트 파일, Visual Studio에서 영역을 추가하는 방법 (0) | 2023.04.04 |
| Java의 모델 클래스에서 직접 JSON 개체 만들기 (0) | 2023.04.04 |
| CORS 정책에 의해 액세스가 차단되었습니다.비행 전 요청에 대한 응답이 액세스 제어 검사를 통과하지 못했습니다. (0) | 2023.04.04 |