2012-08-09 17 views
6

मैं एसडीएल ट्रिडियन 2011 (जीए) के लिए कस्टम सर्च इंडेक्सिंग हैंडलर के साथ खेल रहा था। मुझे very helpful information provided by Arjen का उपयोग करके कुछ काम मिल गया, हालांकि मुझे यकीन नहीं है कि मेरा निष्पादन सबसे अच्छा विकल्प है या नहीं।कस्टमाइज्ड ट्रिडियन सर्च इंडेक्स हैंडलर: पेज यूआरएल के लिए कस्टम बनाम मानक फ़ील्ड?

आवश्यकता यूआरएल द्वारा सीएमएस में पृष्ठों की खोज करने में सक्षम होना चाहिए (उदाहरण के लिए www.example.com/news/index.html)। ऐसा करने के लिए मैंने ISearchIndexingHandler इंटरफ़ेस (नीचे कोड) का उपयोग करके एक कक्षा बनाई है। मैं आइटम के ContentText फ़ील्ड में यूआरएल अनुक्रमणित कर रहा हूं, हालांकि मुझे यकीन नहीं है कि इसमें आमतौर पर किसी पृष्ठ के लिए कुछ और होगा (मुझे लगता है कि एक पृष्ठ में केवल मेटाडेटा है इसलिए यह ठीक होना चाहिए)। एक कस्टम फ़ील्ड पर इसका उपयोग करने का लाभ यह है कि मैं आसानी से < यूआरएल > < फ़ील्डनाम > या ऐसा कुछ उपयोग किए बिना खोज बॉक्स में यूआरएल टाइप कर सकता हूं।

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

कोड:

using System; 
using Tridion.ContentManager.Search; 
using Tridion.ContentManager.Search.Indexing.Handling; 
using Tridion.ContentManager.Search.Indexing.Service; 
using Tridion.ContentManager.Search.Indexing; 
using Tridion.ContentManager.Search.Fields; 

namespace ExampleSearchIndexHandler 
{ 
    public class PageUrlHandler : ISearchIndexingHandler 
    { 
     public void Configure(SearchIndexingHandlerSettings settings) 
     {    
     } 

     public void ExtractIndexFields(IdentifiableObjectData subjectData, Item item, CoreServiceProxy serviceProxy) 
     { 
      PageData data = subjectData as PageData; 
      if (data != null) 
      { 
       PublishLocationInfo info = data.LocationInfo as PublishLocationInfo; 
       string url = GetUrlPrefix(data) + info.PublishLocationUrl; 
       item.ContentText = url; 
      } 
     } 

     private string GetUrlPrefix(PageData page) 
     { 
      //hardcoded for now, but will be read from publication metadata 
      return "www.example.com"; 
     } 
    } 
} 

उत्तर

5

आप ContextText संपत्ति में यूआरएल स्टोर कर सकते हैं। टेम्पलेट सामग्री डेटा को इंडेक्स करने के लिए Thies फ़ील्ड का उपयोग किया जाता है।

ट्रिडियन बाल प्रकाशन के साझा आइटम (ओं) को इंडेक्स नहीं करता है।

इंडेक्सिंग आइटम संशोधन (बनाएं, अपडेट करें, हटाएं, स्थानीयकरण करें और अनलॉक करें) पर ट्रिगर किया गया है। या आप रीइंडेक्सिंग टूल का उपयोग अपने आइटम को रीइंडेक्स करने के लिए कर सकते हैं। लेकिन बाल प्रकाशन में साझा वस्तुओं को सूचीबद्ध करने का कोई तरीका नहीं है।

3

मुझे नहीं लगता कि आप यूआरएल उपसर्ग को न तो अनुक्रमित आइटम के रूप में अपनी खोज क्वेरी में शामिल कर सकते हैं। चूंकि साझा किए गए आइटम अनुक्रमित नहीं होते हैं, इसलिए आप शायद वेबसाइट संरचना परत से पृष्ठ को अनुक्रमित करेंगे, जो कभी प्रकाशित नहीं होता है।

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

कुछ भी पुनः इंडेक्स करने से पहले आपको मूल प्रकाशन स्थान url TcmEventArgs.ContextVariables संपत्ति में संरचना समूह, ताकि आप यह सत्यापित कर सकें कि पुन: अनुक्रमण कार्रवाई आवश्यक है या नहीं।

+0

एसजी प्रकाशित यूआरएल बदल गया है, तो केवल पुन: अनुक्रमणिका को ट्रिगर करने के बारे में अच्छा बिंदु - यह बड़ी साइटों के लिए कुछ भारी पुन: अनुक्रमण से बच सकता है। चूंकि एसजी का संस्करण नहीं है, मुझे लगता है कि ऐसा करने का एकमात्र तरीका इवेंट सिस्टम में है जैसा आपने कहा था। – Will

+0

हां, आपका संपादन सही था। मेरा मतलब पृष्ठ के बजाय संरचना समूह है। –