json - elasticsearch सर्वर में एक जेसन फ़ाइल(100 दस्तावेज शामिल हैं) आयात करने का कोई तरीका है?




bigdata artificial-intelligence (6)

क्या elasticsearch सर्वर में JSON फ़ाइल (100 दस्तावेज़ शामिल हैं) आयात करने का कोई तरीका है? मैं एएस-सर्वर में एक बड़ी जेसन फ़ाइल आयात करना चाहता हूं ..


आप esbulk , एक तेज़ और सरल थोक esbulk उपयोग कर सकते हैं:

$ esbulk -index myindex file.ldj

यहां एक asciicast जो इसे प्रोजेक्ट गुटेनबर्ग डेटा को लगभग 11 के asciicast लोड कर रहा है।

अस्वीकरण: मैं लेखक हूँ।


आप Elasticsearch Gatherer प्लगइन का उपयोग कर सकते हैं

Elasticsearch के लिए gatherer प्लगइन स्केलेबल डेटा लाने और अनुक्रमण के लिए एक ढांचा है। सामग्री एडेप्टर गैथेरर ज़िप अभिलेखागार में कार्यान्वित किए जाते हैं जो एक विशेष प्रकार के प्लगइन हैं जिन्हें लोचदार खोज नोड्स पर वितरित किया जा सकता है। वे नौकरी के अनुरोध प्राप्त कर सकते हैं और उन्हें स्थानीय कतार में निष्पादित कर सकते हैं। नौकरी राज्यों को एक विशेष सूचकांक में बनाए रखा जाता है।

यह प्लगइन विकास में है।

मील का पत्थर 1 - नोड्स के लिए gatherer ज़िप को तैनात करें

मील का पत्थर 2 - नौकरी विनिर्देश और निष्पादन

मील का पत्थर 3 - जेडीबीसी नदी को जेडीबीसी गेटरर में भेजना

मील का पत्थर 4 - लोड / कतार लंबाई / नोड नाम, क्रॉन नौकरियों द्वारा गैटरर जॉब वितरण

मील का पत्थर 5 - अधिक gatherers, अधिक सामग्री एडेप्टर

संदर्भ https://github.com/jprante/elasticsearch-gatherer


आयात करें, लेकिन आप ES API का उपयोग कर दस्तावेज़ों को अनुक्रमित कर सकते हैं।

आप प्रत्येक पंक्ति को लोड करने के लिए इंडेक्स एपीआई का उपयोग कर सकते हैं (फ़ाइल को पढ़ने और कर्ल कॉल करने के लिए किसी प्रकार का कोड इस्तेमाल करके) या इंडेक्स थोक एपीआई को लोड करने के लिए आप सभी का उपयोग कर सकते हैं। मान लें कि आपकी डेटा फ़ाइल को इसके साथ काम करने के लिए स्वरूपित किया जा सकता है।

यहां और पढ़ें: ईएस एपीआई

यदि आप शैल के साथ सहज महसूस करते हैं (परीक्षण नहीं किया गया है) तो एक साधारण शेल स्क्रिप्ट चाल चलती है:

while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json

कुल मिलाकर, मैं शायद पाइथन या तो पाई या लोचदार-खोज क्लाइंट का उपयोग करूंगा।

github पर pyes
लोचदार खोज पायथन ग्राहक

Stream2es भी तेजी से डेटा को लोड करने के लिए बहुत उपयोगी है और इसमें फ़ाइल को बस स्ट्रीम करने का कोई तरीका हो सकता है। (मैंने फ़ाइल का परीक्षण नहीं किया है, लेकिन इसे एएस परफ परीक्षण के लिए विकिपीडिया दस्तावेज़ लोड करने के लिए उपयोग किया है)


एक तरीका है कि एक बाश स्क्रिप्ट बनाना जो थोक प्रविष्टि करता है:

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

जैसा कि पहले से ही डडूनेट का उल्लेख किया गया है, थोक एपीआई शायद जाने का रास्ता है। थोक प्रोटोकॉल के लिए अपनी फ़ाइल को बदलने के लिए, आप 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's -c ध्वज सुनिश्चित करता है कि प्रत्येक दस्तावेज़ स्वयं ही एक रेखा पर है।

यदि आप सीधे पाइप को पाइप करना चाहते हैं, तो आप --data-binary @- , और न केवल --data-binary @- का उपयोग करना चाहेंगे, अन्यथा कर्ल फिर से न्यूलाइन को पट्टी कर देगा।


मुझे यकीन है कि कोई इसे चाहता है इसलिए मैं इसे ढूंढना आसान कर दूंगा।

एफवाईआई - यह ब्रांड नए ईएस इंस्टेंस के समान सर्वर पर 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 मिनट बचा सकता है।

चियर्स







elasticsearch-plugin