2015-11-07 24 views
6

मैं elasticsearch को इंडेक्स का डेटा प्राप्त करने के लिए एक प्रश्न पोस्ट करता हूं .. मुझे केवल इन फ़ील्ड डेटा की आवश्यकता है और कितने दस्तावेज़ों को जानकारी मिली है ... लेकिन वहां "लिया", "shards" और अंदर है एक दस्तावेज़ "_id", "_ अनुक्रमणिका", "_ स्कोर"।elasticsearch क्वेरी से केवल स्रोत डेटा लौटाएं

query='{"query": {"match_all": {}}}'; 
$.ajax({ 
     url: "http://localhost:9200/webproxylog/_search?source=" + query, 
     type:"GET", 
     dataType: "json", 
     data: $.param(params), 
     success: function(data) {... 

मैं सफलता विधि में प्रतिक्रिया डेटा इसे यहाँ कैसे लगता है की जाँच करें:: ये मेरे प्रयोजन के लिए संयुक्त राष्ट्र आवश्यक मेरी सरल अनुरोध कर रहे हैं ..

यहाँ enter image description here

मैं सिर्फ हिट प्राप्त करना चाहते हैं दस्तावेजों में, और दस्तावेजों में मैं केवल "डेटा" ऑब्जेक्ट करना चाहता हूं जिसमें फ़ील्ड डेटा है। "लिया", "shards", "_ id", "_ index", असफल, मैं उन्हें कैसे अक्षम कर सकता हूं

+2

आप एलैस्टिकजे का उपयोग क्यों नहीं करते https://www.elastic.co/guide/en/elasticsearch/c lient/जावास्क्रिप्ट-एपीआई/वर्तमान/quick-start.html? – CodeNotFound

+0

क्योंकि मुझे नहीं पता था कि इस तरह की एक लाइब्रेरी मौजूद है: डी दिलचस्प .. तो आपका मतलब है कि केवल सामग्री प्राप्त करने के लिए e.sj के साथ यह आसान है, मैं प्रतिक्रिया.hits.hits (आपके द्वारा साझा किए गए दस्तावेज़ों में) के साथ पार्स नहीं चाहता हूं, मैं बस elasticsearch वापसी चाहता हूं क्या चाहिए मुझे। –

+0

आप लौटे हुए JSON को अपने आप को पार्स करने की तुलना में बहुत अधिक समय बचाएंगे ;-) – CodeNotFound

उत्तर

2

आप प्रतिक्रिया मेटा डेटा बंद नहीं कर सकते। _source के बजाय आप fields वापस कर सकते हैं यदि आप केवल विशिष्ट फ़ील्ड चाहते हैं, लेकिन यह वास्तव में जटिलता को कम नहीं करता है। पुस्तकालय उसमें से कुछ को अमूर्त कर सकता है, लेकिन मुझे सीधे ईएस प्रतिक्रियाओं को सीधे पार्स करना मुश्किल नहीं लगता है।

आप निश्चित रूप से, एक छोटी जावास्क्रिप्ट लिखना है। सौभाग्य से यह बहुत मुश्किल नहीं है। कुछ इस तरह आम तौर पर मेरे लिए अच्छी तरह से काम करता है:

var results = es_response_data['hits']['hits'].map(function(i){ 
    return i['_source']; 
}); 
+0

हां यह विचार मेरे लिए अच्छा लगता है।दूसरी तरफ धन्यवाद, मुझे इसका विश्लेषण करने में कठिनाई नहीं है, ये अनावश्यक डेटा क्लाइंट को पोस्ट किया जाएगा और बैंडविड्थ का उपभोग करेगा और थोड़ा धीमा प्रदर्शन होगा .. मुझे आश्चर्य है कि यह संभव है या बंद नहीं है :) –

1

बस इसका उपयोग करें ElasticJS, एपीआई रिक ElasticSearch द्वारा अनुशंसित जेएस क्लाइंट को लोचदार खोज नोड्स के साथ आसानी से संवाद करने में मदद करेगा। आप इस एपीआई का उपयोग करके बहुत समय बचाएंगे।

+1

मुझे आपकी बात मिली, अगर मैं शुरुआत कर रहा था तो मैं इसका उपयोग कर सकता था, लेकिन मुझे केवल 2-3 प्रकार की खोज की आवश्यकता है, इसलिए कैंट इस समय परियोजना के लिए बाहरी पुस्तकालय जोड़ें। लेकिन इसका उपयोगी ज्ञान आपको धन्यवाद देता है। –

1

हाँ आप से

_source

जवाब सिर्फ एक सरल शब्द है अतिरिक्त क्षेत्रों को हटा सकते हैं filter_path

कर्ल:

curl -XGET 'http://localhost:9200/webproxylog/_search?filter_path=hits.hits._source' 

नोड:

आप किसी भी नोड 'elasticsearch' आप सिर्फ एक extrs परम filterPath

client.search({ 
     index: 'index', 
     type: 'type', 
     filterPath : ['hits.hits._source'], // this will remove extra fileds _index/_score/_id ... 
     body: { 
      sort: [ 
       {"posted_dt": {"order": "desc"}}, 
       "_score" 
      ], 
      query: query, 
      size: 50, 
      from: index * 50 
     } 
    } 

आपके मामले में जोड़ने की जरूरत उपयोग कर रहे हैं:

तुम सिर्फ में है कि अतिरिक्त क्षेत्र जोड़ने की जरूरत है अपने यूआरएल जैसे:

"http://localhost:9200/webproxylog/_search?filter_path=hits.hits._source&source=" + query 
संबंधित मुद्दे