2013-01-14 5 views
8

मुझे एमसीआरएपी जैसे एमसीआर द्वारा एक टैग आधारित खोज प्रणाली की आवश्यकता है। मैं कुछ टैग्स द्वारा नोड्स खोजना चाहता हूं। प्रश्न यह है कि इसे लागू करने का सबसे अच्छा तरीका क्या है?जेसीआर द्वारा एक टैग आधारित खोज प्रणाली को लागू करने का सबसे अच्छा तरीका जैसे कि मोडसपेप

  1. , नए नोड प्रकार और टैग कि यदि ऐसा है तो सच है के लिए mixins जोड़ा जा रहा है जहां मैं अपने टैग नाम है कि उपयोगकर्ताओं को देखा जा सकता है परिभाषित कर सकते हैं?
  2. टैग के पदानुक्रम को लागू करें और उन्हें मेरे नोड्स में संदर्भित करें। तो यदि यह सच है तो मैं उन्हें कैसे संदर्भित कर सकता हूं?
  3. कोई अन्य तरीका।

उत्तर

13

जेसीआर में टैग लागू करने के कई तरीके हैं। आप जो विकल्प चुनते हैं वह आपके अपने आवेदन की ज़रूरतों पर निर्भर करेगा। यहां चार विकल्प हैं जिन्हें मैं जानता हूं।

विकल्प 1: उपयोग mixins

, प्रत्येक टैग के लिए परिभाषित एक mixin नोड प्रकार परिभाषा एक मार्कर mixin (यह कोई संपत्ति परिभाषाओं या चाइल्ड नोड परिभाषाएं हैं) है कि उन्हें NodeTypeManager का उपयोग कर गतिशील रूप से दर्ज की। फिर जब आप नोड को "टैग" करना चाहते हैं, तो बस उस नोड को उस मिश्रण में जोड़ें जो टैग का प्रतिनिधित्व करता है। किसी भी नोड में एकाधिक टैग हो सकते हैं, और आप उन सभी नोड्स के लिए पूछ सकते हैं जिनके पास एक विशेष टैग है।

(इस प्रतिक्रिया के बाकी में, "एकमी" एक सामान्य नाम स्थान के रूप में प्रयोग किया जाता है। आप अपनी खुद की आवेदन और संगठन के लिए उपयुक्त एक नाम स्थान से प्रतिस्थापित करना चाहिए।)

उदाहरण के लिए, एक टैग दिया "एक्मे: tag1", आप सभी नोड्स सरल प्रश्न के साथ इस कोड है तो मिल सकता है:

SELECT * FROM [acme:tag1] 

इस दृष्टिकोण का नुकसान यह है कि टैग को बनाए रखने बोझिल है। नए टैग बनाने के लिए नए नोड प्रकारों को पंजीकृत करने की आवश्यकता है। आप आसानी से टैग का नाम नहीं बदल सकते हैं, लेकिन इसके बजाय टैग के लिए नए नाम के साथ मिश्रण बनाना होगा; उन सभी नोड्स को ढूंढें जिनमें पुराने टैग का मिश्रण करने वाला मिश्रण है, पुराने मिश्रण को हटाएं, और नया जोड़ें; और अंत में पुराने टैग के लिए नोड प्रकार परिभाषा को हटा दें (इसके बाद अब कहीं भी उपयोग नहीं किया जाता है)। पुराने टैग को हटाने के समान तरीके से किया जाता है। एक और नुकसान यह है कि टैग के साथ अतिरिक्त मेटाडाटा (उदा।, प्रदर्शन नाम) को जोड़ना आसान नहीं है, क्योंकि नोड प्रकार परिभाषाओं पर अतिरिक्त गुणों की अनुमति नहीं है।

इस दृष्टिकोण को काफी अच्छा प्रदर्शन करना चाहिए।

विकल्प 2: एक वर्गीकरण और मजबूत संदर्भ

इस दृष्टिकोण में प्रयोग करें, आप भंडार के एक क्षेत्र में एक साधारण नोड संरचना जिसमें आप प्रत्येक टैग के लिए एक नोड बना सकते हैं (उदाहरण के लिए, एक वर्गीकरण)। इस नोड पर आप गुणों को सेट कर सकते हैं जो टैग का वर्णन करते हैं (उदा।, नाम प्रदर्शित करें); इन गुणों को किसी भी समय बदला जा सकता है (उदाहरण के लिए, टैग का नाम बदलने के लिए)।

फिर टैग को नोड पर "लागू" करने के लिए, आपको बस टैग पर कुछ प्रकार का रिश्ते बनाना होगा। एक तरीका एक मिक्सीन नोड प्रकार को परिभाषित करना है जिसमें "Acme: टैग" प्रकार की विविधता की विविधता शामिल है। जब आप नोड में एक या अधिक टैग्स को लागू करना चाहते हैं, तो बस नोड में मिश्रण जोड़ें और "acme: टैग" प्रॉपर्टी को टैग नोड (ओं) पर सेट करें।

किसी विशेष टैग के सभी नोड्स को ढूंढने के लिए, आप टैग नोड के संदर्भ वाले सभी नोड्स को खोजने के लिए टैग नोड पर "getReferences()" को कॉल कर सकते हैं।

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

विकल्प 3: ": टैग एकमी" गुण के बजाय WeakReference संदर्भ होगा उपयोग वर्गीकरण और कमजोर संदर्भ

यह विकल्प ऊपर सिवाय इसके कि विकल्प 2 के लिए एक संकर समान है। आप अभी भी एक या अधिक टैक्सोनोमी को परिभाषित और प्रबंधित करेंगे। किसी विशेष टैग के साथ नोड्स खोजने के लिए, आप टैग नोड पर "getReferences()" विधि का उपयोग नहीं कर सकते हैं (क्योंकि वे WEAKREFERENCE गुणों के साथ काम नहीं करते हैं), लेकिन आप इसे आसानी से एक क्वेरी के साथ कर सकते हैं:

SELECT * FROM [acme:taggable] AS taggable 
JOIN [acme:tag] AS tag ON taggable.[acme:tags] = tag.[jcr:uuid] 
AND LOCALNAME(tag) = 'tag1' 

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

नुकसान यह है कि आप अभी भी एक टैग को हटा सकते हैं, भले ही इसका उपयोग अभी भी किया जा सके, लेकिन नोड्स जिसमें उस हटाए गए टैग को वेकफेरेंस शामिल है, अब और मान्य नहीं होंगे। इसका उपयोग आपके आवेदन में कुछ सम्मेलनों के साथ किया जा सकता है, या केवल वर्गीकरण पर मेटाडेटा का उपयोग करके यह कहने के लिए कि एक विशेष टैग "बहिष्कृत" है और इसका उपयोग नहीं किया जाना चाहिए। (IMO, बाद वास्तव में इस दृष्टिकोण का एक फायदा है।)

यह विकल्प आमतौर पर करते हैं और ज्यादा विकल्प की तुलना में बेहतर 2.

विकल्प 4 स्केल करेगा: अभी तक उपयोग स्ट्रिंग गुण

एक और दृष्टिकोण प्रत्येक नोड को टैग (टैग्स) के नाम से टैग करने के लिए बस एक STRING प्रॉपर्टी का उपयोग करना है जिसे लागू किया जाना है। उदाहरण के लिए, आप एक मिक्सीन (उदाहरण के लिए, "एसीएम: टैगगेबल") परिभाषित कर सकते हैं जो एक बहु-मूल्यवान STRING प्रॉपर्टी को परिभाषित करता है, और जब आप नोड को टैग करना चाहते हैं तो बस मिश्रण जोड़ें (यदि पहले से मौजूद नहीं है) और नाम का नाम जोड़ें "acme: टैग" STRING प्रॉपर्टी पर एक मान के रूप में टैग करें (फिर से, यदि यह पहले से ही मान के रूप में मौजूद नहीं है)।

इस दृष्टिकोण का प्राथमिक लाभ यह है कि यह बहुत आसान है: आप बस टैग किए जाने वाले नोड पर स्ट्रिंग मानों का उपयोग कर रहे हैं। सभी नोड्स है कि एक विशेष टैग (जैसे, "tag1") के साथ टैग कर रहे हैं खोजने के लिए, एक प्रश्न जारी करते हैं: टैग की

SELECT * 
FROM [acme:taggable] AS taggable 
WHERE taggable.[acme:tags] = 'tag1' 

प्रबंधन आसान है: कोई प्रबंधन नहीं है। यदि टैग का नाम बदलना है, तो आप टैग मानों का नाम बदल सकते हैं। यदि कोई टैग हटाया जाना है (और इसके साथ टैग किए गए नोड्स से हटा दिया गया है), तो यह "acme: टैग" गुणों (शायद पृष्ठभूमि की नौकरी में) से मानों को हटाकर किया जा सकता है।

ध्यान दें कि इससे किसी भी टैग नाम का उपयोग करने की अनुमति मिलती है, और इस प्रकार उन मामलों के लिए सबसे अच्छा काम करता है जहां टैग नाम नियंत्रित नहीं होते हैं।यदि आप टैग मानों के रूप में उपयोग की जाने वाली तारों की सूची को नियंत्रित करना चाहते हैं, तो बस भंडार में वर्गीकरण बनाएं (जैसा कि ऊपर विकल्प 2 और 3 में वर्णित है) और क्या आपका आवेदन मूल्यों को वर्गीकरण में सीमित करता है। आप कई टैक्सोनोमी भी कर सकते हैं, जिनमें से कुछ शायद उपयोगकर्ता-विशिष्ट हैं। लेकिन इस दृष्टिकोण के पास विकल्प 2 या 3.

यह विकल्प विकल्प 3 से थोड़ा बेहतर प्रदर्शन करेगा (क्योंकि प्रश्न सरल हैं), लेकिन यह भी स्केल करेगा।

+0

एक संस्करण स्ट्रिंग गुणों का उपयोग करना है जो स्ट्रिंग पथ का उपयोग कर वर्गीकरण को इंगित करते हैं, उदाहरण के लिए स्टोर/आदि/टैग/प्रकृति/जानवर/शेर उस टैग को इंगित करने के लिए। यह कमजोर संदर्भों के साथ आपके विकल्प 3 के समान ही है - आपको यह जांच नहीं मिलती है कि इसे सेट करने से पहले एक टैग मौजूद है, लेकिन जैसा कि आपको एप्लिकेशन स्तर पर लटकने वाले संदर्भों को संभालने की आवश्यकता है, कमजोर संदर्भों में कोई महत्वपूर्ण अंतर नहीं होता है मेरी राय। Http://dev.day.com/content/ddc/blog/2009/04/cq5tags.html –

+0

पर वर्णित अनुसार यह सीक्यू 5 में टैग को कैसे संभालता है, यह विकल्प है कि विकल्प 4 का बड़ा नुकसान यह है कि कोई नहीं है सभी टैग सूचीबद्ध करने का आसान तरीका। क्या यह सही है? – ovonel

+0

मोडशिप जेसीआर-एसक्यूएल 2 प्रश्नों में 'DISTINCT' फ़ंक्शन प्रदान करता है, ताकि आप यह कर सकें: 'चयन करें [Acme: टैग] [acme: taggable] से। बेशक, इस क्वेरी का प्रदर्शन संभवतः कई कारकों पर निर्भर करेगा, जिनमें # नोड्स, इंडेक्स के प्रकार इत्यादि शामिल हैं, लेकिन, यदि आपको अक्सर टैग की सूची की आवश्यकता होती है, तो वर्गीकरण का उपयोग करने वाले विकल्पों में से एक बेहतर हो सकता है । –

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