2012-03-02 13 views
7

चलें कहते हैं कि मैं निम्नलिखित मानचित्रण है:क्या ElasticSearch में नेस्टेड दस्तावेज़ों को सॉर्ट करना संभव है?

"site": { 
    "properties": { 
    "title":  { "type": "string" }, 
    "description": { "type": "string" }, 
    "category": { "type": "string" }, 
    "tags":  { "type": "array" }, 
    "point":  { "type": "geo_point" } 
    "localities": { 
     type: 'nested', 
     properties: { 
     "title":  { "type": "string" }, 
     "description": { "type": "string" }, 
     "point":  { "type": "geo_point" } 
     } 
    } 
    } 
} 

मैं तो मूल दस्तावेज़ पर एक "_geo_distance" तरह कर रहा हूँ और "site.point" पर दस्तावेज़ों को सॉर्ट करने में सक्षम हूँ। हालांकि मैं मूल दस्तावेज के अंदर, "_geo_distance" द्वारा घोंसला वाले इलाकों को सॉर्ट करना भी पसंद करूंगा।

क्या यह संभव है? यदि हां, तो कैसे?

उत्तर

9

दुर्भाग्यवश, नहीं (कम से कम अभी तक नहीं)।

लोचदार खोज में एक प्रश्न सिर्फ यह पहचानता है कि कौन से दस्तावेज़ क्वेरी से मेल खाते हैं, और वे कितनी अच्छी तरह मेल खाते हैं।

क्या नेस्ट दस्तावेज़ों के लिए उपयोगी होते हैं समझने के लिए, इस उदाहरण पर विचार करें:

{ 
    "title": "My post", 
    "body":  "Text in my body...", 
    "followers": [ 
     { 
      "name":  "Joe", 
      "status": "active" 
     }, 
     { 
      "name":  "Mary", 
      "status": "pending" 
     }, 
    ] 
}   

ऊपर JSON, एक बार ES में अनुक्रमित, कार्यात्मक निम्नलिखित के बराबर है। ध्यान दें कि कैसे followers क्षेत्र चपटा कर दिया गया है

{ 
    "title":   "My post", 
    "body":    "Text in my body...", 
    "followers.name": ["Joe","Mary"], 
    "followers.status": ["active","pending"] 
}   

के लिए एक खोज: followers with status == active and name == Mary इस दस्तावेज़ से मेल खाएगा ... गलत तरीके से।

नेस्टेड फ़ील्ड हमें इस सीमा के आसपास काम करने की अनुमति देते हैं। followers फ़ील्ड टाइप करने के बजाय nested प्रकार के रूप में घोषित किया गया है तो इसकी सामग्री आंतरिक रूप से एक अलग (अदृश्य) उप-दस्तावेज़ के रूप में बनाई गई है। इसका मतलब यह है कि हम व्यक्तिगत दस्तावेजों के रूप में इन घोंसले दस्तावेजों से पूछने के लिए nested query या nested filter का उपयोग कर सकते हैं।

हालांकि, नेस्टेड क्वेरी/फ़िल्टर क्लॉज से आउटपुट केवल हमें बताता है कि मुख्य दस्तावेज़ मेल खाता है, और यह कितना अच्छा मेल खाता है। यह हमें यह भी नहीं बताता कि कौन से घोंसले वाले दस्तावेज़ मेल खाते हैं। इसे समझने के लिए, हमें अपने खोज मानदंडों के विरुद्ध घोंसला वाले दस्तावेज़ों की जांच करने के लिए हमारे आवेदन में कोड लिखना होगा।

कुछ open issues इन सुविधाओं को जोड़ने का अनुरोध करते हैं, लेकिन हल करने में यह एक आसान समस्या नहीं है।

आप जो चाहते हैं उसे हासिल करने का एकमात्र तरीका अपने उप-दस्तावेज़ों को अलग-अलग दस्तावेज़ों के रूप में अनुक्रमणित करना है, और उन्हें स्वतंत्र रूप से क्वेरी और सॉर्ट करना है। मुख्य दस्तावेज़ और इन अलग-अलग उप-दस्तावेज़ों के बीच अभिभावक-बाल संबंध स्थापित करना उपयोगी हो सकता है। (इसके अलावा parent-type mapping, index api docs के जनक & बाल अनुभाग, और top-children और has-child क्वेरी दिखाई।

, एक ES उपयोगकर्ता एक नया has_parent filter है कि वे वर्तमान में एक fork में काम कर रहे हैं के बारे में सूची भेज दिया गया है। हालांकि, इस मुख्य ईएस रेपो में अभी तक उपलब्ध नहीं है।

+0

आपके उत्कृष्ट उत्तर के लिए धन्यवाद! – Yeggeps

+0

ठीक है इसलिए मैंने इसके साथ थोड़ा सा खेला है। वास्तव में इलाकों के माता-पिता क्षेत्रों को खोजने के लिए कोई रास्ता नहीं है जैसा कि मैंने देखा? आप चाहते हैं तो माता-पिता के क्षेत्र को शामिल करना होगा जिसे हर बच्चे में खोजने योग्य होना चाहिए, है ना? – Yeggeps

+0

सही। आप शामिल नहीं हो सकते हैं। प्रत्येक दस्तावेज़ का मूल्यांकन अपने स्वयं के एम पर किया जाता है erits। माता-पिता/बच्चे और घोंसले वाले प्रश्न काम को दोगुना करते हैं क्योंकि वे पहले बच्चों (जैसे) बच्चों पर एक क्वेरी चलाते हैं, फिर उन मानों का उपयोग माता-पिता – DrTech

संबंधित मुद्दे