Google Cloud Search स्कीमा, JSON स्ट्रक्चर होता है. यह आपके डेटा को इंडेक्स करने और उस पर क्वेरी करने के लिए, ऑब्जेक्ट, प्रॉपर्टी, और विकल्पों को तय करता है. आपका कॉन्टेंट कनेक्टर, आपकी रिपॉज़िटरी से डेटा पढ़ता है. साथ ही, रजिस्टर किए गए स्कीमा के आधार पर डेटा को स्ट्रक्चर करता है और उसे इंडेक्स करता है.
एपीआई को JSON स्कीमा ऑब्जेक्ट देकर स्कीमा बनाया जा सकता है. इसके बाद, उसे रजिस्टर किया जा सकता है. डेटा को इंडेक्स करने से पहले, आपको अपनी हर रिपॉज़िटरी के लिए स्कीमा ऑब्जेक्ट रजिस्टर करना होगा.
इस दस्तावेज़ में स्कीमा बनाने के बारे में बुनियादी जानकारी दी गई है. खोज के अनुभव को बेहतर बनाने के लिए, अपने स्कीमा को ट्यून करने के तरीके के बारे में जानने के लिए, खोज की क्वालिटी को बेहतर बनाना लेख पढ़ें.
स्कीमा बनाएं
Cloud Search स्कीमा बनाने के लिए, यहां दिए गए चरणों का पालन करें:
- उपयोगकर्ता के संभावित व्यवहार की पहचान करना
- डेटा सोर्स को शुरू करना
- स्कीमा बनाना
- सैंपल स्कीमा
- अपना स्कीमा रजिस्टर करना
- अपने डेटा को इंडेक्स करना
- अपने स्कीमा की जांच करना
- अपने स्कीमा को बेहतर बनाना
उपयोगकर्ता के संभावित व्यवहार की पहचान करना
उपयोगकर्ता किस तरह की क्वेरी करते हैं, इसका अनुमान लगाने से आपको स्कीमा बनाने की रणनीति तय करने में मदद मिलती है.
उदाहरण के लिए, किसी फ़िल्म के डेटाबेस के ख़िलाफ़ क्वेरी जारी करते समय, आपको यह अनुमान लगाना पड़ सकता है कि उपयोगकर्ता "मुझे रॉबर्ट रेडफ़ोर्ड की सभी फ़िल्में दिखाओ" जैसी क्वेरी कर सकता है. इसलिए, आपके स्कीमा में "किसी खास अभिनेता की सभी फ़िल्में" के आधार पर क्वेरी के नतीजे दिखाने की सुविधा होनी चाहिए.
उपयोगकर्ता के व्यवहार के पैटर्न को दिखाने के लिए, अपने स्कीमा को तय करने के लिए, ये काम करें:
- अलग-अलग उपयोगकर्ताओं की ओर से की गई, अलग-अलग तरह की क्वेरी का आकलन करें.
- उन ऑब्जेक्ट की पहचान करें जिनका इस्तेमाल क्वेरी में किया जा सकता है. ऑब्जेक्ट, मिलते-जुलते डेटा के लॉजिकल सेट होते हैं. जैसे, फ़िल्मों के डेटाबेस में मौजूद कोई फ़िल्म.
- उन प्रॉपर्टी और वैल्यू की पहचान करें जिनसे ऑब्जेक्ट बना है. इनका इस्तेमाल क्वेरी में किया जा सकता है. प्रॉपर्टी, ऑब्जेक्ट के इंडेक्स किए जा सकने वाले एट्रिब्यूट होते हैं. इनमें प्रिमिटिव वैल्यू या अन्य ऑब्जेक्ट शामिल हो सकते हैं. उदाहरण के लिए, किसी मूवी ऑब्जेक्ट में मूवी का टाइटल और रिलीज़ होने की तारीख जैसी प्रॉपर्टी, प्रिमिटिव वैल्यू के तौर पर हो सकती हैं. मूवी ऑब्जेक्ट में अन्य ऑब्जेक्ट भी शामिल हो सकते हैं. जैसे, कलाकार. इनकी अपनी प्रॉपर्टी होती हैं. जैसे, उनका नाम या भूमिका.
- प्रॉपर्टी के लिए मान्य वैल्यू के उदाहरणों की पहचान करना. वैल्यू, किसी प्रॉपर्टी के लिए इंडेक्स किया गया असल डेटा होता है. उदाहरण के लिए, आपके डेटाबेस में किसी फ़िल्म का टाइटल "Raiders of the Lost Ark" हो सकता है.
- यह तय करें कि आपके उपयोगकर्ताओं को क्रम से लगाने और रैंकिंग के कौनसे विकल्प चाहिए. उदाहरण के लिए, फ़िल्मों के बारे में क्वेरी करते समय, उपयोगकर्ता उन्हें रिलीज़ होने की तारीख के हिसाब से क्रम में लगाना और दर्शकों की रेटिंग के हिसाब से रैंक करना चाहें. उन्हें टाइटल के हिसाब से वर्णमाला के क्रम में लगाने की ज़रूरत नहीं है.
- (ज़रूरी नहीं) देखें कि क्या आपकी कोई प्रॉपर्टी, खोज के लिए ज़्यादा सटीक कॉन्टेक्स्ट दिखाती है. जैसे, उपयोगकर्ताओं की नौकरी की भूमिका या विभाग. इससे कॉन्टेक्स्ट के आधार पर, अपने-आप पूरा होने वाले सुझाव दिए जा सकते हैं. उदाहरण के लिए, अगर कोई व्यक्ति फ़िल्मों का डेटाबेस खोज रहा है, तो हो सकता है कि उसकी दिलचस्पी सिर्फ़ किसी खास शैली की फ़िल्मों में हो. उपयोगकर्ता यह तय करेंगे कि उन्हें किस तरह के कॉन्टेंट के लिए खोज के नतीजे चाहिए. ऐसा हो सकता है कि वे इसे अपनी उपयोगकर्ता प्रोफ़ाइल के हिस्से के तौर पर तय करें. इसके बाद, जब कोई उपयोगकर्ता फ़िल्मों के बारे में क्वेरी टाइप करना शुरू करता है, तो उसे सिर्फ़ उसकी पसंदीदा शैली वाली फ़िल्मों के नाम के सुझाव दिखते हैं. जैसे, "ऐक्शन फ़िल्में". ये सुझाव, अपने-आप पूरे होने वाले सुझावों के तौर पर दिखते हैं.
- इन ऑब्जेक्ट, प्रॉपर्टी, और उदाहरण वैल्यू की एक सूची बनाएं. इनका इस्तेमाल खोजों में किया जा सकता है. (इस सूची का इस्तेमाल कैसे किया जाता है, इस बारे में ज़्यादा जानने के लिए, ऑपरेटर के विकल्प तय करना सेक्शन देखें.)
डेटा सोर्स को शुरू करना
डेटा सोर्स, किसी ऐसी रिपॉज़िटरी के डेटा को दिखाता है जिसे इंडेक्स किया गया है और Google Cloud में सेव किया गया है. डेटा सोर्स को शुरू करने के निर्देशों के लिए, तीसरे पक्ष के डेटा सोर्स मैनेज करना लेख पढ़ें.
उपयोगकर्ता की खोज के नतीजे, डेटा सोर्स से दिखाए जाते हैं. जब कोई उपयोगकर्ता खोज के नतीजे पर क्लिक करता है, तो Cloud Search उसे इंडेक्स करने के अनुरोध में दिए गए यूआरएल का इस्तेमाल करके, असली आइटम पर भेजता है.
अपने ऑब्जेक्ट तय करना
किसी स्कीमा में डेटा की बुनियादी इकाई ऑब्जेक्ट होती है. इसे "स्कीमा ऑब्जेक्ट" भी कहा जाता है. यह डेटा का लॉजिकल स्ट्रक्चर होता है. फ़िल्मों के डेटाबेस में, डेटा का एक लॉजिकल स्ट्रक्चर "मूवी" होता है. किसी फ़िल्म में काम करने वाले कलाकारों और क्रू को दिखाने के लिए, दूसरा ऑब्जेक्ट "व्यक्ति" हो सकता है.
स्कीमा में मौजूद हर ऑब्जेक्ट में प्रॉपर्टी या एट्रिब्यूट की एक सीरीज़ होती है. ये ऑब्जेक्ट के बारे में जानकारी देते हैं. जैसे, किसी फ़िल्म का टाइटल और अवधि या किसी व्यक्ति का नाम और जन्मतिथि. किसी ऑब्जेक्ट की प्रॉपर्टी में, प्रिमिटिव वैल्यू या अन्य ऑब्जेक्ट शामिल हो सकते हैं.
पहली इमेज में, फ़िल्म और व्यक्ति ऑब्जेक्ट और उनसे जुड़ी प्रॉपर्टी दिखाई गई हैं.

Cloud Search स्कीमा, objectDefinitions
टैग में तय किए गए ऑब्जेक्ट की परिभाषाओं की सूची होती है. यहां दिए गए स्कीमा स्निपेट में, फ़िल्म और व्यक्ति के स्कीमा ऑब्जेक्ट के लिए objectDefinitions
स्टेटमेंट दिखाए गए हैं.
{
"objectDefinitions": [
{
"name": "movie",
...
},
{
"name": "person",
...
}
]
}
किसी स्कीमा ऑब्जेक्ट को तय करते समय, आपको ऑब्जेक्ट के लिए name
देना होता है. यह स्कीमा के सभी ऑब्जेक्ट में यूनीक होना चाहिए. आम तौर पर, आपको name
ऐसी वैल्यू का इस्तेमाल करना होगा जो ऑब्जेक्ट के बारे में जानकारी देती हो. जैसे, किसी फ़िल्म ऑब्जेक्ट के लिए movie
. स्कीमा सेवा, इंडेक्स किए जा सकने वाले ऑब्जेक्ट के लिए मुख्य आइडेंटिफ़ायर के तौर पर name
फ़ील्ड का इस्तेमाल करती है. name
फ़ील्ड के बारे में ज़्यादा जानकारी के लिए, ऑब्जेक्ट की परिभाषा देखें.
ऑब्जेक्ट की प्रॉपर्टी तय करना
ObjectDefinition के रेफ़रंस में बताए गए तरीके के मुताबिक, ऑब्जेक्ट के नाम के बाद options
का सेट और propertyDefinitions
की सूची दी जाती है.
options
में freshnessOptions
और displayOptions
भी शामिल हो सकते हैं.
freshnessOptions
का इस्तेमाल, किसी सामान के ताज़ा होने के आधार पर खोज के नतीजों में उसकी रैंकिंग को अडजस्ट करने के लिए किया जाता है. displayOptions
का इस्तेमाल यह तय करने के लिए किया जाता है कि किसी ऑब्जेक्ट के लिए खोज के नतीजों में, कुछ खास लेबल और प्रॉपर्टी दिखें या नहीं.
propertyDefinitions
सेक्शन में, किसी ऑब्जेक्ट की प्रॉपर्टी तय की जाती हैं. जैसे, फ़िल्म का नाम और रिलीज़ होने की तारीख.
इस स्निपेट में, दो प्रॉपर्टी वाला movie
ऑब्जेक्ट दिखाया गया है: movieTitle
और releaseDate
.
{
"objectDefinitions": [
{
"name": "movie",
"propertyDefinitions": [
{
"name": "movieTitle",
"isReturnable": true,
"isWildcardSearchable": true,
"textPropertyOptions": {
"retrievalImportance": { "importance": "HIGHEST" },
"operatorOptions": {
"operatorName": "title"
}
},
"displayOptions": {
"displayLabel": "Title"
}
},
{
"name": "releaseDate",
"isReturnable": true,
"isSortable": true,
"datePropertyOptions": {
"operatorOptions": {
"operatorName": "released",
"lessThanOperatorName": "releasedbefore",
"greaterThanOperatorName": "releasedafter"
}
},
"displayOptions": {
"displayLabel": "Release date"
}
...
]
}
]
}
PropertyDefinition में ये आइटम शामिल होते हैं:
name
स्ट्रिंग.- टाइप-अग्नोस्टिक विकल्पों की सूची, जैसे कि पिछले स्निपेट में
isReturnable
. - टाइप और उससे जुड़े टाइप के हिसाब से विकल्प. जैसे, पिछले स्निपेट में
textPropertyOptions
औरretrievalImportance
. operatorOptions
, जिसमें यह बताया गया हो कि प्रॉपर्टी का इस्तेमाल खोज ऑपरेटर के तौर पर कैसे किया जाता है.- एक या उससे ज़्यादा
displayOptions
, जैसे कि पिछले स्निपेट मेंdisplayLabel
.
किसी प्रॉपर्टी का name
, उस प्रॉपर्टी को शामिल करने वाले ऑब्जेक्ट में यूनीक होना चाहिए. हालांकि, उसी नाम का इस्तेमाल अन्य ऑब्जेक्ट और सब-ऑब्जेक्ट में किया जा सकता है.
पहली इमेज में, मूवी का टाइटल और रिलीज़ होने की तारीख दो बार तय की गई है:
एक बार movie
ऑब्जेक्ट में और दूसरी बार person
ऑब्जेक्ट के filmography
सब-ऑब्जेक्ट में. यह स्कीमा, movieTitle
फ़ील्ड का फिर से इस्तेमाल करता है, ताकि स्कीमा दो तरह की खोज के व्यवहार के साथ काम कर सके:
- जब लोग किसी फ़िल्म के टाइटल को खोजते हैं, तब उन्हें फ़िल्म के नतीजे दिखाएं.
- जब लोग किसी ऐसी फ़िल्म का टाइटल खोजें जिसमें किसी अभिनेता ने काम किया हो, तो उन्हें लोगों के नतीजे दिखाएं.
इसी तरह, स्कीमा releaseDate
फ़ील्ड का फिर से इस्तेमाल करता है, क्योंकि इसका मतलब दोनों movieTitle
फ़ील्ड के लिए एक ही है.
अपना स्कीमा बनाते समय, इस बात पर ध्यान दें कि आपकी रिपॉज़िटरी में ऐसे फ़ील्ड हो सकते हैं जिनमें ऐसा डेटा मौजूद हो जिसे आपको अपने स्कीमा में एक से ज़्यादा बार शामिल करना हो.
टाइप से जुड़े विकल्प जोड़ना
PropertyDefinition में, खोज से जुड़ी सामान्य सुविधाओं के विकल्प दिए गए हैं. ये विकल्प, डेटा टाइप के बावजूद सभी प्रॉपर्टी के लिए एक जैसे होते हैं.
isReturnable
- इससे पता चलता है कि प्रॉपर्टी, ऐसे डेटा की पहचान करती है जिसे Query API के ज़रिए खोज के नतीजों में दिखाया जाना चाहिए. उदाहरण के तौर पर दी गई सभी फ़िल्मों की प्रॉपर्टी को लौटाया जा सकता है. जिन प्रॉपर्टी को वापस नहीं किया जा सकता उनका इस्तेमाल, खोज या रैंकिंग के नतीजों के लिए किया जा सकता है. हालांकि, इन्हें उपयोगकर्ता को वापस नहीं किया जाता.isRepeatable
- इससे पता चलता है कि प्रॉपर्टी के लिए एक से ज़्यादा वैल्यू इस्तेमाल की जा सकती हैं या नहीं. उदाहरण के लिए, किसी फ़िल्म की रिलीज़ होने की तारीख सिर्फ़ एक होती है, लेकिन उसमें कई ऐक्टर हो सकते हैं.isSortable
- इससे पता चलता है कि प्रॉपर्टी का इस्तेमाल, क्रम से लगाने के लिए किया जा सकता है. यह उन प्रॉपर्टी के लिए सही नहीं हो सकता जिन्हें दोहराया जा सकता है. उदाहरण के लिए, फ़िल्मों के नतीजों को रिलीज़ होने की तारीख या ऑडियंस की रेटिंग के हिसाब से क्रम में लगाया जा सकता है.isFacetable
- इससे पता चलता है कि इस प्रॉपर्टी का इस्तेमाल, फ़ैसेट जनरेट करने के लिए किया जा सकता है. फ़ेसट का इस्तेमाल, खोज के नतीजों को बेहतर बनाने के लिए किया जाता है. इससे उपयोगकर्ता को शुरुआती नतीजे दिखते हैं. इसके बाद, वह उन नतीजों को और बेहतर बनाने के लिए, मानदंड या फ़ेसट जोड़ता है. यह विकल्प उन प्रॉपर्टी के लिए सही नहीं हो सकता जिनका टाइप ऑब्जेक्ट है. साथ ही, इस विकल्प को सेट करने के लिएisReturnable
सही होना चाहिए. आखिर में, यह विकल्प सिर्फ़ enum, boolean, और टेक्स्ट प्रॉपर्टी के लिए काम करता है. उदाहरण के लिए, हमारे सैंपल स्कीमा में, हमgenre
,actorName
,userRating
, औरmpaaRating
को फ़ेसटेबल बना सकते हैं, ताकि इनका इस्तेमाल खोज के नतीजों को इंटरैक्टिव तरीके से बेहतर बनाने के लिए किया जा सके.isWildcardSearchable
से पता चलता है कि उपयोगकर्ता इस प्रॉपर्टी के लिए वाइल्डकार्ड खोज कर सकते हैं. यह विकल्प सिर्फ़ टेक्स्ट प्रॉपर्टी के लिए उपलब्ध है. टेक्स्ट फ़ील्ड पर वाइल्डकार्ड सर्च की सुविधा कैसे काम करती है, यह exactMatchWithOperator फ़ील्ड में सेट की गई वैल्यू पर निर्भर करता है. अगरexactMatchWithOperator
कोtrue
पर सेट किया जाता है, तो टेक्स्ट वैल्यू को एक ऐटॉमिक वैल्यू के तौर पर टोकन में बदला जाता है. साथ ही, इसके लिए वाइल्डकार्ड खोज की जाती है. उदाहरण के लिए, अगर टेक्स्ट वैल्यूscience-fiction
है, तो वाइल्डकार्ड क्वेरीscience-*
इससे मैच करती है. अगरexactMatchWithOperator
कोfalse
पर सेट किया जाता है, तो टेक्स्ट वैल्यू को टोकन में बदला जाता है. इसके बाद, हर टोकन के लिए वाइल्डकार्ड खोज की जाती है. उदाहरण के लिए, अगर टेक्स्ट वैल्यू "science-fiction" है, तो वाइल्डकार्ड क्वेरीsci*
याfi*
आइटम से मेल खाती है, लेकिनscience-*
इससे मेल नहीं खाती.
खोज की सामान्य सुविधा के इन सभी पैरामीटर की वैल्यू बूलियन होती है. इन सभी की डिफ़ॉल्ट वैल्यू false
होती है. इनका इस्तेमाल करने के लिए, इन्हें false
पर सेट करना ज़रूरी है.true
यहां दी गई टेबल में, ऐसे बूलियन पैरामीटर दिखाए गए हैं जिन्हें true
ऑब्जेक्ट की सभी प्रॉपर्टी के लिए true
पर सेट किया गया है:movie
प्रॉपर्टी | isReturnable |
isRepeatable |
isSortable |
isFacetable |
isWildcardSearchable |
---|---|---|---|---|---|
movieTitle |
सही | सही | |||
releaseDate |
सही | सही | |||
genre |
सही | सही | सही | ||
duration |
सही | ||||
actorName |
सही | सही | सही | सही | |
userRating |
सही | सही | |||
mpaaRating |
सही | सही |
genre
और actorName
, दोनों के लिए isRepeatable
को true
पर सेट किया गया है, क्योंकि किसी फ़िल्म को एक से ज़्यादा शैलियों में रखा जा सकता है और आम तौर पर उसमें एक से ज़्यादा कलाकार होते हैं. अगर कोई प्रॉपर्टी दोहराई जा सकती है या दोहराए जा सकने वाले सब-ऑब्जेक्ट में शामिल है, तो उसे क्रम से नहीं लगाया जा सकता.
टाइप तय करना
PropertyDefinition रेफ़रंस सेक्शन में कई xxPropertyOptions
दिए गए हैं. इनमें xx
एक खास टाइप है, जैसे कि boolean
. प्रॉपर्टी का डेटा टाइप सेट करने के लिए, आपको सही डेटा-टाइप ऑब्जेक्ट तय करना होगा. किसी प्रॉपर्टी के लिए डेटा-टाइप ऑब्जेक्ट तय करने से, उस प्रॉपर्टी का डेटा टाइप तय होता है. उदाहरण के लिए, movieTitle
प्रॉपर्टी के लिए textPropertyOptions
को तय करने का मतलब है कि फ़िल्म का टाइटल टेक्स्ट टाइप का है. नीचे दिए गए स्निपेट में, movieTitle
प्रॉपर्टी दिखाई गई है. इसमें textPropertyOptions
डेटा टाइप सेट किया गया है.
{
"name": "movieTitle",
"isReturnable": true,
"isWildcardSearchable": true,
"textPropertyOptions": {
...
},
...
},
किसी प्रॉपर्टी से सिर्फ़ एक तरह का डेटा जुड़ा हो सकता है. उदाहरण के लिए, हमारे मूवी स्कीमा में, releaseDate
सिर्फ़ तारीख हो सकती है. जैसे, 2016-01-13
) या स्ट्रिंग
(जैसे, January 13, 2016
) का इस्तेमाल किया जा सकता है, लेकिन दोनों का नहीं.
यहां डेटा-टाइप ऑब्जेक्ट दिए गए हैं. इनका इस्तेमाल, सैंपल मूवी स्कीमा में मौजूद प्रॉपर्टी के लिए डेटा टाइप तय करने के लिए किया जाता है:
प्रॉपर्टी | डेटा-टाइप ऑब्जेक्ट |
---|---|
movieTitle |
textPropertyOptions |
releaseDate |
datePropertyOptions |
genre |
enumPropertyOptions |
duration |
textPropertyOptions |
actorName |
textPropertyOptions |
userRating |
integerPropertyOptions |
mpaaRating |
textPropertyOptions |
प्रॉपर्टी के लिए चुना गया डेटा टाइप, इस्तेमाल के आपके अनुमानित उदाहरणों पर निर्भर करता है.
इस फ़िल्म के स्कीमा के काल्पनिक उदाहरण में, उपयोगकर्ताओं से यह उम्मीद की जाती है कि वे नतीजों को समय के हिसाब से क्रम में लगाना चाहते हैं. इसलिए, releaseDate
एक तारीख का ऑब्जेक्ट है.
उदाहरण के लिए, अगर आपको दिसंबर की रिलीज़ की तुलना जनवरी की रिलीज़ से करनी है, तो स्ट्रिंग फ़ॉर्मैट काम आ सकता है.
टाइप के हिसाब से विकल्प कॉन्फ़िगर करना
PropertyDefinition रेफ़रंस सेक्शन में, हर टाइप के विकल्पों के लिंक दिए गए हैं. टाइप के हिसाब से तय किए गए ज़्यादातर विकल्प ज़रूरी नहीं होते. हालांकि, possibleValues
में मौजूद enumPropertyOptions
की सूची ज़रूरी होती है. इसके अलावा, orderedRanking
विकल्प की मदद से, वैल्यू को एक-दूसरे के हिसाब से रैंक किया जा सकता है. इस स्निपेट में, movieTitle
प्रॉपर्टी को textPropertyOptions
डेटा टाइप सेट करने और retrievalImportance
टाइप के हिसाब से विकल्प के साथ दिखाया गया है.
{
"name": "movieTitle",
"isReturnable": true,
"isWildcardSearchable": true,
"textPropertyOptions": {
"retrievalImportance": { "importance": "HIGHEST" },
...
},
...
}
यहां सैंपल स्कीमा में इस्तेमाल किए गए, टाइप के हिसाब से अतिरिक्त विकल्प दिए गए हैं:
प्रॉपर्टी | टाइप | टाइप के हिसाब से विकल्प |
---|---|---|
movieTitle |
textPropertyOptions |
retrievalImportance |
releaseDate |
datePropertyOptions |
|
genre |
enumPropertyOptions |
|
duration |
textPropertyOptions |
|
actorName |
textPropertyOptions |
|
userRating |
integerPropertyOptions |
orderedRanking , maximumValue |
mpaaRating |
textPropertyOptions |
ऑपरेटर के विकल्प तय करना
टाइप के हिसाब से उपलब्ध विकल्पों के अलावा, हर टाइप में विकल्पों का एक सेट होता है. operatorOptions
इन विकल्पों से पता चलता है कि प्रॉपर्टी का इस्तेमाल, सर्च ऑपरेटर के तौर पर कैसे किया जाता है. यहां दिए गए स्निपेट में, movieTitle
प्रॉपर्टी दिखाई गई है. इसमें textPropertyOptions
डेटा टाइप सेट किया गया है. साथ ही, इसमें retrievalImportance
और operatorOptions
टाइप के हिसाब से विकल्प दिए गए हैं.
{
"name": "movieTitle",
"isReturnable": true,
"isWildcardSearchable": true,
"textPropertyOptions": {
"retrievalImportance": { "importance": "HIGHEST" },
"operatorOptions": {
"operatorName": "title"
}
},
...
}
हर operatorOptions
का एक operatorName
होता है. जैसे, movieTitle
के लिए title
. ऑपरेटर का नाम, प्रॉपर्टी के लिए सर्च ऑपरेटर होता है. सर्च ऑपरेटर, वह पैरामीटर होता है जिसका इस्तेमाल करके लोग खोज के नतीजों को सीमित करते हैं. उदाहरण के लिए, अगर किसी व्यक्ति को फ़िल्मों को उनके टाइटल के आधार पर खोजना है, तो वह title:movieName
टाइप करेगा. यहां title:movieName
किसी फ़िल्म का नाम है.movieName
यह ज़रूरी नहीं है कि ऑपरेटर के नाम, प्रॉपर्टी के नाम से मेल खाएं. इसके बजाय, आपको ऐसे ऑपरेटर के नाम इस्तेमाल करने चाहिए जो आपके संगठन के उपयोगकर्ताओं के सबसे ज़्यादा इस्तेमाल किए गए शब्दों को दिखाते हों. उदाहरण के लिए, अगर आपके उपयोगकर्ता किसी फ़िल्म के टाइटल के लिए "title" के बजाय "name" शब्द का इस्तेमाल करना पसंद करते हैं, तो ऑपरेटर का नाम "name" पर सेट किया जाना चाहिए.
एक ही ऑपरेटर के नाम का इस्तेमाल कई प्रॉपर्टी के लिए किया जा सकता है. हालांकि, यह ज़रूरी है कि सभी प्रॉपर्टी एक ही तरह की हों. क्वेरी के दौरान, शेयर किए गए ऑपरेटर के नाम का इस्तेमाल करने पर, उस ऑपरेटर के नाम का इस्तेमाल करने वाली सभी प्रॉपर्टी वापस मिल जाती हैं. उदाहरण के लिए, मान लें कि फ़िल्म ऑब्जेक्ट में plotSummary
और plotSynopsis
प्रॉपर्टी हैं और इनमें से हर प्रॉपर्टी का operatorName
, plot
है. जब तक ये दोनों प्रॉपर्टी टेक्स्ट (textPropertyOptions
) के तौर पर मौजूद हैं, तब तक plot
सर्च ऑपरेटर का इस्तेमाल करके एक ही क्वेरी में इन दोनों को वापस पाया जा सकता है.
operatorName
के अलावा, क्रम से लगाई जा सकने वाली प्रॉपर्टी में operatorOptions
में lessThanOperatorName
और greaterThanOperatorName
फ़ील्ड हो सकते हैं.
उपयोगकर्ता इन विकल्पों का इस्तेमाल करके, सबमिट की गई वैल्यू की तुलना के आधार पर क्वेरी बना सकते हैं.
आखिर में, textOperatorOptions
में operatorOptions
में मौजूद exactMatchWithOperator
फ़ील्ड है. अगर आपने exactMatchWithOperator
को true
पर सेट किया है, तो क्वेरी स्ट्रिंग का पूरा प्रॉपर्टी वैल्यू से मेल खाना ज़रूरी है. सिर्फ़ टेक्स्ट में मौजूद होने से काम नहीं चलेगा.
ऑपरेटर की मदद से की जाने वाली खोजों और फ़ैसेट मैच में, टेक्स्ट वैल्यू को एक ऐटम वैल्यू माना जाता है.
उदाहरण के लिए, शैली की प्रॉपर्टी के साथ Book या Movie ऑब्जेक्ट को इंडेक्स करें.
शैली में "साइंस फ़िक्शन", "विज्ञान", और "फ़िक्शन" शामिल हो सकते हैं. exactMatchWithOperator
को false
पर सेट करने या इसे शामिल न करने पर, किसी शैली को खोजने या "साइंस" या "फ़िक्शन" फ़ैसेट में से किसी एक को चुनने पर, "साइंस फ़िक्शन" के नतीजे भी दिखेंगे. ऐसा इसलिए, क्योंकि टेक्स्ट को टोकन में बदला जाता है और "साइंस" और "फ़िक्शन" टोकन, "साइंस फ़िक्शन" में मौजूद होते हैं.
जब exactMatchWithOperator
true
होता है, तो टेक्स्ट को एक टोकन माना जाता है. इसलिए, न तो "Science" और न ही "Fiction", "Science-Fiction" से मैच होता है.
(ज़रूरी नहीं) displayOptions
सेक्शन जोड़ना
किसी भी displayOptions
सेक्शन के आखिर में, displayOptions
सेक्शन मौजूद होता है. हालांकि, यह सेक्शन शामिल करना ज़रूरी नहीं है.propertyDefinition
इस सेक्शन में एक displayLabel
स्ट्रिंग होती है.
displayLabel
, प्रॉपर्टी के लिए सुझाया गया और उपयोगकर्ता के लिए आसान टेक्स्ट लेबल है. अगर प्रॉपर्टी को ObjectDisplayOptions का इस्तेमाल करके दिखाने के लिए कॉन्फ़िगर किया गया है, तो यह लेबल प्रॉपर्टी के सामने दिखता है. अगर प्रॉपर्टी को डिसप्ले के लिए कॉन्फ़िगर किया गया है और displayLabel
तय नहीं किया गया है, तो सिर्फ़ प्रॉपर्टी की वैल्यू दिखेगी.
इस स्निपेट में, movieTitle
प्रॉपर्टी को displayLabel
के साथ 'Title' पर सेट किया गया है.
{
"name": "movieTitle",
"isReturnable": true,
"isWildcardSearchable": true,
"textPropertyOptions": {
"retrievalImportance": { "importance": "HIGHEST" },
"operatorOptions": {
"operatorName": "title"
}
},
"displayOptions": {
"displayLabel": "Title"
}
},
यहां सैंपल स्कीमा में मौजूद movie
ऑब्जेक्ट की सभी प्रॉपर्टी के लिए displayLabel
वैल्यू दी गई हैं:
प्रॉपर्टी | displayLabel |
---|---|
movieTitle |
Title |
releaseDate |
Release date |
genre |
Genre |
duration |
Run length |
actorName |
Actor |
userRating |
Audience score |
mpaaRating |
MPAA rating |
(ज़रूरी नहीं) suggestionFilteringOperators[]
सेक्शन जोड़ना
किसी भी propertyDefinition
सेक्शन के आखिर में, suggestionFilteringOperators[]
सेक्शन मौजूद होता है. हालांकि, इसे शामिल करना ज़रूरी नहीं है. इस सेक्शन का इस्तेमाल करके, ऐसी प्रॉपर्टी तय करें जिसका इस्तेमाल, अपने-आप पूरे होने के सुझावों को फ़िल्टर करने के लिए किया जाता है. उदाहरण के लिए, genre
ऑपरेटर को इस तरह से तय किया जा सकता है कि उपयोगकर्ता की पसंदीदा फ़िल्म की शैली के हिसाब से सुझाव फ़िल्टर किए जा सकें. इसके बाद, जब उपयोगकर्ता अपनी खोज क्वेरी टाइप करता है, तो उसे अपने-आप पूरे होने वाले सुझावों के तौर पर, सिर्फ़ उसकी पसंद की शैली वाली फ़िल्में दिखती हैं.
अपने स्कीमा को रजिस्टर करना
Cloud Search क्वेरी से स्ट्रक्चर्ड डेटा पाने के लिए, आपको Cloud Search स्कीमा सेवा में अपना स्कीमा रजिस्टर करना होगा. किसी स्कीमा को रजिस्टर करने के लिए, आपको उस डेटा सोर्स आईडी की ज़रूरत होगी जो आपको डेटा सोर्स शुरू करें चरण के दौरान मिला था.
अपने स्कीमा को रजिस्टर करने के लिए, डेटा सोर्स आईडी का इस्तेमाल करके UpdateSchema अनुरोध भेजें.
UpdateSchema रेफ़रंस पेज पर दी गई जानकारी के मुताबिक, अपने स्कीमा को रजिस्टर करने के लिए, यहां दिया गया एचटीटीपी अनुरोध करें:
PUT https://cloudsearch.googleapis.com/v1/indexing/{name=datasources/*}/schema
आपके अनुरोध के मुख्य भाग में यह जानकारी होनी चाहिए:
{ "validateOnly": // true or false, "schema": { // ... Your complete schema object ... } }
अपने स्कीमा की पुष्टि करने के लिए, validateOnly
विकल्प का इस्तेमाल करें. इससे स्कीमा को रजिस्टर किए बिना ही उसकी पुष्टि की जा सकती है.
अपने डेटा को इंडेक्स करना
स्कीमा रजिस्टर होने के बाद, Index कॉल का इस्तेमाल करके डेटा सोर्स में डेटा भरें. आम तौर पर, इंडेक्सिंग आपके कॉन्टेंट कनेक्टर में की जाती है.
मूवी स्कीमा का इस्तेमाल करके, किसी एक मूवी के लिए इंडेक्सिंग का REST API अनुरोध इस तरह दिखेगा:
{
"name": "datasource/<data_source_id>/items/titanic",
"acl": {
"readers": [
{
"gsuitePrincipal": {
"gsuiteDomain": true
}
}
]
},
"metadata": {
"title": "Titanic",
"sourceRepositoryUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
"objectType": "movie"
},
"structuredData": {
"object": {
"properties": [
{
"name": "movieTitle",
"textValues": {
"values": [
"Titanic"
]
}
},
{
"name": "releaseDate",
"dateValues": {
"values": [
{
"year": 1997,
"month": 12,
"day": 19
}
]
}
},
{
"name": "actorName",
"textValues": {
"values": [
"Leonardo DiCaprio",
"Kate Winslet",
"Billy Zane"
]
}
},
{
"name": "genre",
"enumValues": {
"values": [
"Drama",
"Action"
]
}
},
{
"name": "userRating",
"integerValues": {
"values": [
8
]
}
},
{
"name": "mpaaRating",
"textValues": {
"values": [
"PG-13"
]
}
},
{
"name": "duration",
"textValues": {
"values": [
"3 h 14 min"
]
}
}
]
}
},
"content": {
"inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
"contentFormat": "TEXT"
},
"version": "01",
"itemType": "CONTENT_ITEM"
}
ध्यान दें कि objectType
फ़ील्ड में movie
की वैल्यू, स्कीमा में ऑब्जेक्ट की परिभाषा के नाम से मेल खाती है. इन दोनों वैल्यू का मिलान करके, Cloud Search को यह पता चलता है कि इंडेक्सिंग के दौरान किस स्कीमा ऑब्जेक्ट का इस्तेमाल करना है.
यह भी ध्यान दें कि स्कीमा प्रॉपर्टी releaseDate
को इंडेक्स करने के लिए, year
, month
, और day
की सब-प्रॉपर्टी का इस्तेमाल किया जाता है. ऐसा इसलिए होता है, क्योंकि इसे date
डेटा टाइप के तौर पर तय किया गया है. इसके लिए, datePropertyOptions
का इस्तेमाल किया जाता है.
हालांकि, year
, month
, और day
को स्कीमा में तय नहीं किया गया है. इसलिए, इनमें से किसी एक प्रॉपर्टी (जैसे, year
) एक-एक करके.
यह भी ध्यान दें कि दोहराई जा सकने वाली प्रॉपर्टी actorName
को वैल्यू की सूची का इस्तेमाल करके कैसे इंडेक्स किया जाता है.
इंडेक्स करने से जुड़ी संभावित समस्याओं की पहचान करना
स्कीमा और इंडेक्सिंग से जुड़ी दो सबसे सामान्य समस्याएं ये हैं:
आपने इंडेक्स करने का जो अनुरोध किया है उसमें ऐसा स्कीमा ऑब्जेक्ट या प्रॉपर्टी का नाम शामिल है जिसे स्कीमा सेवा के साथ रजिस्टर नहीं किया गया है. इस समस्या की वजह से, प्रॉपर्टी या ऑब्जेक्ट को अनदेखा कर दिया जाता है.
आपके इंडेक्सिंग अनुरोध में मौजूद प्रॉपर्टी की टाइप वैल्यू, स्कीमा में रजिस्टर किए गए टाइप से अलग है. इस समस्या की वजह से, इंडेक्सिंग के दौरान Cloud Search में गड़बड़ी होती है.
अलग-अलग तरह की क्वेरी के साथ अपने स्कीमा की जांच करना
बड़ी प्रोडक्शन डेटा रिपॉज़िटरी के लिए स्कीमा रजिस्टर करने से पहले, छोटी टेस्ट डेटा रिपॉज़िटरी के साथ जांच करें. छोटी टेस्ट रिपॉज़िटरी के साथ टेस्टिंग करने से, आपको अपने स्कीमा में तुरंत बदलाव करने और इंडेक्स किए गए डेटा को मिटाने की सुविधा मिलती है. इससे बड़े इंडेक्स या मौजूदा प्रोडक्शन इंडेक्स पर कोई असर नहीं पड़ता. टेस्ट डेटा रिपॉज़िटरी के लिए, एक ऐसी एसीएल बनाएं जो सिर्फ़ टेस्ट उपयोगकर्ता को अनुमति दे, ताकि अन्य उपयोगकर्ताओं को खोज के नतीजों में यह डेटा न दिखे.
खोज क्वेरी की पुष्टि करने के लिए, खोज इंटरफ़ेस बनाने के लिए खोज इंटरफ़ेस पर जाएं
इस सेक्शन में, उदाहरण के तौर पर कई क्वेरी दी गई हैं. इनका इस्तेमाल, मूवी स्कीमा की जांच करने के लिए किया जा सकता है.
सामान्य क्वेरी के साथ टेस्ट करना
सामान्य क्वेरी से, डेटा सोर्स में मौजूद वे सभी आइटम दिखते हैं जिनमें कोई खास स्ट्रिंग शामिल होती है. खोज इंटरफ़ेस का इस्तेमाल करके, किसी मूवी के डेटा सोर्स के ख़िलाफ़ सामान्य क्वेरी चलाई जा सकती है. इसके लिए, "टाइटेनिक" शब्द टाइप करें और Return दबाएं. खोज के नतीजों में, "टाइटेनिक" शब्द वाली सभी फ़िल्में दिखनी चाहिए.
ऑपरेटर की मदद से टेस्ट करना
क्वेरी में ऑपरेटर जोड़ने पर, नतीजे सिर्फ़ उन आइटम के लिए दिखते हैं जो ऑपरेटर की वैल्यू से मेल खाते हैं. उदाहरण के लिए, किसी खास अभिनेता की सभी फ़िल्में ढूंढने के लिए, actor
ऑपरेटर का इस्तेमाल किया जा सकता है. सर्च इंटरफ़ेस का इस्तेमाल करके, इस ऑपरेटर क्वेरी को आसानी से पूरा किया जा सकता है. इसके लिए, operator=value पेयर टाइप करें. जैसे, "actor:Zane" और Return दबाएं. ज़ेन की ऐक्टिंग वाली सभी फ़िल्में, खोज के नतीजों में दिखनी चाहिए.
अपने स्कीमा को बेहतर बनाना
स्कीमा और डेटा का इस्तेमाल शुरू होने के बाद, यह देखते रहें कि आपके उपयोगकर्ताओं के लिए क्या काम कर रहा है और क्या नहीं. आपको इन स्थितियों में अपने स्कीमा में बदलाव करना चाहिए:
- ऐसे फ़ील्ड को इंडेक्स करना जिसे पहले इंडेक्स नहीं किया गया था. उदाहरण के लिए, आपके उपयोगकर्ता निर्देशक के नाम के आधार पर बार-बार फ़िल्में खोज सकते हैं. इसलिए, आपको अपने स्कीमा में बदलाव करके, निर्देशक के नाम को ऑपरेटर के तौर पर इस्तेमाल करने की सुविधा देनी पड़ सकती है.
- उपयोगकर्ता से मिले सुझाव के आधार पर, खोज ऑपरेटर के नाम बदले जा रहे हैं. ऑपरेटर के नाम, उपयोगकर्ता के लिए आसान होने चाहिए. अगर आपके उपयोगकर्ता लगातार गलत ऑपरेटर का नाम "याद रखते हैं", तो आपको उसका नाम बदलने पर विचार करना चाहिए.
स्कीमा में बदलाव करने के बाद, फिर से इंडेक्स करना
अपने स्कीमा में इनमें से किसी भी वैल्यू को बदलने के लिए, आपको अपने डेटा को फिर से इंडेक्स करने की ज़रूरत नहीं है. आपको सिर्फ़ नया UpdateSchema अनुरोध सबमिट करना होगा. इसके बाद, आपका इंडेक्स काम करता रहेगा:
- ऑपरेटर के नाम.
- पूर्णांक की कम से कम और ज़्यादा से ज़्यादा वैल्यू.
- पूर्णांक और enum के हिसाब से क्रम से रैंक करना.
- डेटा अपडेट होने की फ़्रीक्वेंसी के उपलब्ध विकल्प.
- डिसप्ले के विकल्प
इन बदलावों के लिए, पहले इंडेक्स किया गया डेटा, पहले से रजिस्टर किए गए स्कीमा के हिसाब से काम करता रहेगा. हालांकि, अगर स्कीमा में ये बदलाव किए गए हैं, तो आपको अपडेट किए गए स्कीमा के आधार पर बदलाव देखने के लिए, मौजूदा एंट्री को फिर से इंडेक्स करना होगा:
- नई प्रॉपर्टी या ऑब्जेक्ट जोड़ना या हटाना
isReturnable
,isFacetable
याisSortable
कोfalse
से बदलकरtrue
किया जा रहा है.
isFacetable
या isSortable
को true
सिर्फ़ तब सेट करें, जब आपके पास इस्तेमाल का कोई साफ़ तौर पर तय किया गया तरीका हो और आपको इसकी ज़रूरत हो.
आखिर में, किसी प्रॉपर्टी को isSuggestable
के तौर पर मार्क करके स्कीमा अपडेट करने पर, आपको अपने डेटा को फिर से इंडेक्स करना होगा. इससे उस प्रॉपर्टी के लिए, अपने-आप पूरा होने की सुविधा का इस्तेमाल करने में देरी होगी.
प्रॉपर्टी में बदलाव करने की अनुमति नहीं है
कुछ स्कीमा में बदलाव करने की अनुमति नहीं है. भले ही, आपने अपने डेटा को फिर से इंडेक्स किया हो. ऐसा इसलिए है, क्योंकि इससे इंडेक्स काम नहीं करेगा या खोज के नतीजे खराब या अलग-अलग मिलेंगे. इनमें ये बदलाव शामिल हैं:
- प्रॉपर्टी का डेटा टाइप.
- प्रॉपर्टी का नाम.
exactMatchWithOperator
सेटिंग.retrievalImportance
सेटिंग.
हालांकि, इस सीमा को पार करने का एक तरीका है.
स्कीमा में जटिल बदलाव करना
खराब खोज नतीजे जनरेट करने वाले या खोज इंडेक्स को खराब करने वाले बदलावों से बचने के लिए, Cloud Search, रिपॉज़िटरी को इंडेक्स किए जाने के बाद, UpdateSchema अनुरोधों में कुछ तरह के बदलावों को रोकता है. उदाहरण के लिए, प्रॉपर्टी का डेटा टाइप या नाम सेट करने के बाद, उसे बदला नहीं जा सकता. इन बदलावों को UpdateSchema अनुरोध के ज़रिए नहीं किया जा सकता. भले ही, आपने अपने डेटा को फिर से इंडेक्स किया हो.
अगर आपको अपने स्कीमा में ऐसा बदलाव करना है जिसकी अनुमति नहीं है, तो अक्सर ऐसे अनुमति वाले बदलाव किए जा सकते हैं जिनसे वही असर मिलता है. आम तौर पर, इसमें इंडेक्स की गई प्रॉपर्टी को पुराने ऑब्जेक्ट डेफ़िनिशन से नए ऑब्जेक्ट डेफ़िनिशन में माइग्रेट करना शामिल होता है. इसके बाद, इंडेक्स करने का ऐसा अनुरोध भेजा जाता है जिसमें सिर्फ़ नई प्रॉपर्टी का इस्तेमाल किया जाता है.
यहां किसी प्रॉपर्टी का डेटा टाइप या नाम बदलने का तरीका बताया गया है:
- अपने स्कीमा में ऑब्जेक्ट डेफ़िनिशन में नई प्रॉपर्टी जोड़ें. उस प्रॉपर्टी से अलग नाम का इस्तेमाल करें जिसका नाम बदलना है.
- नई परिभाषा के साथ UpdateSchema अनुरोध जारी करें. अनुरोध में पूरा स्कीमा भेजना न भूलें. इसमें नई और पुरानी, दोनों प्रॉपर्टी शामिल होनी चाहिए.
डेटा रिपॉज़िटरी से इंडेक्स को बैकफ़िल करें. इंडेक्स को बैकफ़िल करने के लिए, नई प्रॉपर्टी का इस्तेमाल करके इंडेक्स करने के सभी अनुरोध भेजें. हालांकि, पुरानी प्रॉपर्टी का इस्तेमाल न करें, क्योंकि इससे क्वेरी के मैच की गिनती दो बार हो जाएगी.
- बैकफ़िल इंडेक्सिंग के दौरान, नई प्रॉपर्टी की जांच करें और पुराने प्रॉपर्टी के लिए डिफ़ॉल्ट रूप से सेट करें, ताकि व्यवहार में कोई अंतर न हो.
- बैकफ़िल पूरा होने के बाद, पुष्टि करने के लिए टेस्ट क्वेरी चलाएं.
पुरानी प्रॉपर्टी मिटाएं. पुरानी प्रॉपर्टी के नाम के बिना, UpdateSchema का दूसरा अनुरोध करें. साथ ही, इंडेक्सिंग के आने वाले अनुरोधों में पुरानी प्रॉपर्टी के नाम का इस्तेमाल बंद करें.
पुरानी प्रॉपर्टी के इस्तेमाल को नई प्रॉपर्टी पर माइग्रेट करें. उदाहरण के लिए, अगर आपने प्रॉपर्टी का नाम क्रिएटर से बदलकर लेखक कर दिया है, तो आपको अपने क्वेरी कोड को अपडेट करना होगा. ऐसा इसलिए, ताकि जहां पहले क्रिएटर का रेफ़रंस दिया गया था वहां लेखक का रेफ़रंस दिया जा सके.
Cloud Search, किसी भी मिटाई गई प्रॉपर्टी या ऑब्जेक्ट का रिकॉर्ड 30 दिनों तक रखता है. इससे, इंडेक्सिंग के ऐसे नतीजों को रोका जा सकता है जो उम्मीद के मुताबिक नहीं हैं. आपको 30 दिनों के अंदर, मिटाए गए ऑब्जेक्ट या प्रॉपर्टी का इस्तेमाल बंद कर देना चाहिए. साथ ही, आने वाले समय में इंडेक्स के अनुरोधों में उन्हें शामिल नहीं करना चाहिए. इससे यह पक्का होता है कि अगर आपको बाद में उस प्रॉपर्टी या ऑब्जेक्ट को फिर से शामिल करना है, तो ऐसा इस तरह से किया जा सकता है कि आपके इंडेक्स की सटीकता बनी रहे.
साइज़ की सीमाओं के बारे में जानकारी
Cloud Search, स्ट्रक्चर्ड डेटा ऑब्जेक्ट और स्कीमा के साइज़ पर सीमाएं लगाता है. ये सीमाएं हैं:
- ज़्यादा से ज़्यादा 10 टॉप-लेवल ऑब्जेक्ट हो सकते हैं.
- स्ट्रक्चर्ड डेटा हैरारकी की ज़्यादा से ज़्यादा गहराई 10 लेवल होती है.
- किसी ऑब्जेक्ट में फ़ील्ड की कुल संख्या 1,000 से ज़्यादा नहीं होनी चाहिए. इसमें प्रिमिटिव फ़ील्ड की संख्या के साथ-साथ, हर नेस्ट किए गए ऑब्जेक्ट में फ़ील्ड की संख्या का योग भी शामिल है.
अगले चरण
यहां कुछ ऐसे तरीके दिए गए हैं जिन्हें आज़माया जा सकता है:
अपने स्कीमा की जांच करने के लिए, खोज इंटरफ़ेस बनाएं.
खोज की क्वालिटी को बेहतर बनाने के लिए, अपने स्कीमा को ट्यून करें.
अपनी कंपनी में आम तौर पर इस्तेमाल होने वाले शब्दों के समानार्थी शब्द तय करने के लिए,
_dictionaryEntry
स्कीमा का इस्तेमाल करने का तरीका जानें._dictionaryEntry
स्कीमा का इस्तेमाल करने के लिए, समानार्थी शब्द तय करना लेख पढ़ें.कनेक्टर बनाएं.