Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

अपस्टैश रेडिस सर्च का परिचय:आपके रेडिस डेटा के लिए शक्तिशाली, स्केलेबल खोज

<पी> हम अगले 1-2 सप्ताह में अपस्टैश रेडिस सर्च लॉन्च कर रहे हैं, लेकिन मैं इस बारे में कुछ शुरुआती विचार साझा करना चाहता था कि हम क्या बना रहे हैं और मैं इसे लेकर उत्साहित क्यों हूं।

हम इसे क्यों बना रहे हैं

<पी> हम 2024 से खोज क्षेत्र में हैं, जिसकी शुरुआत अपस्टैश वेक्टर से हुई है। वेक्टर ने लोगों को सिमेंटिक खोज लागू करने की अनुमति दी, और फिर बाद में हम अपस्टैश सर्च के साथ इस उत्पाद क्षेत्र में दोगुना हो गए।

<पी> उदाहरण के लिए, यह 2025 का हमारा लॉन्च ट्वीट है जिसमें हमारे वेक्टर-आधारित सिमेंटिक सर्च समाधान अपस्टैश सर्च की घोषणा की गई है 👇

<पी> अपस्टैश रेडिस सर्च का परिचय:आपके रेडिस डेटा के लिए शक्तिशाली, स्केलेबल खोज

<पी> और मुझे लगता है कि हम और भी बेहतर कर सकते हैं और सर्च से मिली सीख को आगे बढ़ा सकते हैं।

<पी> हम अधिकांश मौजूदा खोज प्रदाताओं से काफी नाखुश हैं। मेरे लिए व्यक्तिगत रूप से, उनमें से कोई भी वास्तव में सर्वर रहित स्थान में फिट नहीं बैठता है। इतना कि मैंने 2023 में AWS क्लाउडसर्च पर आधारित अपना स्वयं का खोज ऐप भी बनाया 💀

<पी> हम जो चाहते थे वह कुछ ऐसा था:

  • रेडिस में रहता है क्योंकि रेडिस तेज़ है
  • अपस्टैश रेडिस एसडीके के साथ काम करता है
  • 100% प्रकार-सुरक्षित है
  • जैसा कि आप टाइप करते हैं, वास्तविक समय में खोज के लिए पर्याप्त तेज़ है
<पी> इसलिए हम इसका निर्माण कर रहे हैं।

रेडिस एपीआई से परे हमारा पहला एक्सटेंशन

<पी> ये हमारे लिए बहुत बड़ी बात है. अब तक, @upstash/redis रेडिस कमांड की लगभग 1:1 मैपिंग की गई है। खोज उससे आगे हमारा पहला विस्तार है।

<पी> हम टैंटिवी का उपयोग कर रहे हैं, जो रस्ट में लिखा गया एक पूर्ण-पाठ खोज इंजन है जो अपाचे ल्यूसीन से प्रेरित है। यह तेज़ है. सचमुच तेज। और यह हमें वे सभी आदिम चीज़ें प्रदान करता है जिनकी हमें आवश्यकता होती है जैसे टोकनाइजेशन, स्टेमिंग, फ़ज़ी मैचिंग, वाक्यांश क्वेरीज़ और BM25 स्कोरिंग।

<पी> लक्ष्य इसे एसडीके और अपस्टैश रेडिस का मूल स्वरूप बनाना है। यदि आप @upstash/redis का उपयोग कर रहे हैं आज, खोज को जोड़ना एक स्वाभाविक विस्तार की तरह महसूस होना चाहिए न कि एक अलग उत्पाद की तरह।

प्रकार-सुरक्षित स्कीमा बिल्डर

<पी> एक चीज़ जिससे मैं सचमुच खुश हूँ वह है नया स्कीमा बिल्डर। हम अपने खोजने योग्य फ़ील्ड को ज़ॉड-जैसी एपीआई के साथ परिभाषित करते हैं:

import { Redis, s } from "@upstash/redis";
 
const redis = Redis.fromEnv();
 
const schema = s.object({
 name: s.string(),
 description: s.string(),
 sku: s.string().noTokenize(),
 brand: s.string().noStem(),
 price: s.number(),
 inStock: s.boolean(),
});
 
const products = await redis.search.createIndex({
 name: "products",
 dataType: "json",
 prefix: "product:",
 schema,
});
<पी> .noTokenize() और .noStem() विधियाँ हमें यह नियंत्रित करने देती हैं कि पाठ को कैसे संसाधित किया जाता है:

  • टोकनीकरण पाठ को खोजने योग्य शब्दों में विभाजित करता है। प्राकृतिक भाषा के लिए बढ़िया है, लेकिन SKU (SKU-12345-BLK) जैसी चीज़ों को तोड़ देता है ["SKU", "12345", "BLK"] हो जाता है ). इसे कोड, ईमेल और यूयूआईडी के लिए अक्षम करें।
  • स्टेमिंग शब्दों को उनके मूल रूप में कम कर देता है इसलिए "रनिंग" "रन" से मेल खाता है। ब्रांड नामों और उचित संज्ञाओं के लिए इसे अक्षम करें जहां हम सटीक मिलान चाहते हैं।
<पी> स्कीमा हमें प्रश्नों पर पूर्ण प्रकार का अनुमान देती है। यदि हम किसी ऐसे फ़ील्ड से पूछताछ करने का प्रयास करते हैं जो मौजूद नहीं है, तो टाइपस्क्रिप्ट उसे पकड़ लेगा। हम स्कीमा सिंटैक्स को ज़ॉड सिंटैक्स के बहुत करीब रख रहे हैं ताकि यह उपयोग करने में परिचित लगे।

क्वेरी आदिम

<पी> हम पांच मुख्य ऑपरेटरों के साथ लॉन्च कर रहे हैं जो हमारे अनुसार अधिकांश खोज उपयोग मामलों को कवर करते हैं:

$smart स्मार्ट मिलान के लिए

<पी> $smart ऑपरेटर के साथ हम स्वचालित रूप से स्मार्ट मिलान लागू करते हैं। इस ऑपरेटर को बस काम करना चाहिए™ और शुरुआती लोगों के लिए शुरुआत करने का यह सबसे अच्छा तरीका होना चाहिए।

await products.query({
 filter: {
 name: { $smart: "wirless headphones" },
 },
});
<पी> हुड के नीचे, यह चलता है:

  1. सटीक वाक्यांश मिलान (उच्चतम बूस्ट) - "वायरलेस हेडफ़ोन" वाले दस्तावेज़ आसन्न और क्रम में
  2. ढलान वाला वाक्यांश (मध्यम बूस्ट) - दस्तावेज़ जहां शब्द क्रम में दिखाई देते हैं लेकिन आसन्न नहीं (उदाहरण के लिए वायरलेस बोस हेडफ़ोन)
  3. शर्तें मेल खाती हैं (मध्यम बूस्ट) - सभी शर्तों, किसी भी आदेश वाले दस्तावेज़
  4. फ़ज़ी मिलान (कोई बूस्ट नहीं) - "वायरलेस हेडफ़ोन"
  5. जैसी टाइप त्रुटियों वाले दस्तावेज़
  6. अंतिम शब्द पर अस्पष्ट उपसर्ग (कोई बूस्ट नहीं) - जैसा आप टाइप करें वैसे ही खोजें परिदृश्यों के लिए
<पी> सर्वाधिक प्रासंगिक परिणाम प्राप्त करने के लिए अंकों को संयोजित किया जाता है। अधिकांश खोज बक्सों के लिए, यह वस्तुतः वह सब कुछ है जिसकी आपको आवश्यकता है। बेशक आप इस ऑपरेटर को स्वयं लागू कर सकते हैं और सेटिंग्स के साथ खेल सकते हैं, क्योंकि यह नीचे दिए गए अन्य आदिम ऑपरेटरों पर बनाया गया है।

$eq सटीक समानता के लिए

<पी> उन फ़ील्ड के लिए जहां हम सटीक मिलान चाहते हैं:

await products.query({
 filter: {
 name: { $eq: "wireless headphones" },
 price: { $eq: 200 },
 },
});

$phrase वाक्यांश मिलान के लिए

<पी> जब हमें शब्दों को आसन्न और क्रम में प्रदर्शित करने की आवश्यकता होती है:

await products.query({
 filter: { description: { $phrase: "noise cancelling" } },
});
<पी> हम slop भी जोड़ सकते हैं बीच में शब्दों को अनुमति देने के लिए:

await products.query({
 filter: {
 description: {
 $phrase: { value: "wireless headphones", slop: 2 },
 },
 },
});

$fuzzy टाइपो सहनशीलता के लिए

<पी> कॉन्फ़िगर करने योग्य टाइपो सहनशीलता (उदाहरण के लिए 2 टाइपो) के साथ अस्पष्ट मिलान के लिए:

await products.query({
 filter: { name: { $fuzzy: "headphonse", distance: 2 } },
});

$regex पैटर्न मिलान के लिए

<पी> जब हमें नियमित अभिव्यक्ति पैटर्न की आवश्यकता होती है:

await products.query({
 filter: { sku: { $regex: "SKU-[0-9]{5}-.*" } },
});
<पी> ध्यान देने योग्य एक बात:रेगेक्स .noStem() वाले फ़ील्ड पर सबसे अच्छा काम करता है चूंकि स्टेमड टेक्स्ट अपेक्षित पैटर्न से मेल नहीं खाएगा।

विशिष्ट फ़ील्ड को बढ़ावा देना

<पी> हम कुछ मैचों का वजन अधिक करने के लिए बूस्ट लागू कर सकते हैं:

await products.query({
 filter: {
 $and: [
 { name: { $smart: "wireless", $boost: 2 } },
 { description: { $smart: "wireless" } },
 ],
 },
});
<पी> इससे नाम मिलान का मूल्य विवरण मिलान से दोगुना हो जाता है। यह तब उपयोगी होता है जब हम चाहते हैं कि टाइटल मैचों को बॉडी मैचों से ऊपर रैंक दिया जाए।

आगे क्या

<पी> इस लेख में मैंने जो कुछ भी डाला है वह अभी भी बदलाव के लिए खुला है। हम अभी भी किनारों को चमका रहे हैं और दस्तावेज़ लिख रहे हैं। आधिकारिक लॉन्च 1-2 सप्ताह में है।

<पी> लेकिन मुझे लगता है कि यह वास्तव में अच्छा है कि हम एक साथ पहली नज़र डाल सकते हैं 👀

<पी> लॉन्च के बाद हम कुछ चीज़ें तलाश सकते हैं:

  • वेक्टर खोज एकीकरण (सिमेंटिक + कीवर्ड हाइब्रिड खोज)
  • स्वतः पूर्ण और सुझाव
<पी> यदि आप शीघ्र पहुंच चाहते हैं या आपके कोई प्रश्न हैं, तो मुझसे @joshtriedcoding पर संपर्क करें।

<पी> पढ़ने के लिए धन्यवाद 🙌


  1. जावास्क्रिप्ट कॉलबैक जावास्क्रिप्ट कॉलबैक

    जावास्क्रिप्ट में चूंकि फ़ंक्शन ऑब्जेक्ट होते हैं इसलिए हम उन्हें अन्य फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं। इन कार्यों को फिर किसी अन्य फ़ंक्शन के अंदर बुलाया जा सकता है और पारित फ़ंक्शन को कॉलबैक फ़ंक्शन के रूप में संदर्भित किया जाता है। जावास्क्रिप्ट कॉलबैक के लिए कोड निम्नलिखित है - उ

  1. C++ में किसी सरणी की बिटनोसिटी की जांच करने का कार्यक्रम C++ में किसी सरणी की बिटनोसिटी की जांच करने का कार्यक्रम

    एन पूर्णांकों की एक सरणी गिरफ्तारी [एन] को देखते हुए, कार्य यह जांचना है कि दिया गया सरणी बिटोनिक है या नहीं। यदि दी गई सरणी बिटोनिक है तो हां यह एक बिटोनिक सरणी है प्रिंट करें, अन्यथा प्रिंट करें नहीं यह एक बिटोनिक सरणी नहीं है। एक बिटोनिक सरणी तब होती है जब सरणी पहले सख्ती से बढ़ते क्रम में होती

  1. C++ में 3n स्लाइस के साथ पिज़्ज़ा C++ में 3n स्लाइस के साथ पिज़्ज़ा

    मान लीजिए कि एक पिज्जा है जिसमें अलग-अलग आकार के 3n स्लाइस हैं, मैं और मेरे दो दोस्त पिज्जा के स्लाइस इस प्रकार लेंगे - मैं कोई भी पिज़्ज़ा स्लाइस चुनूंगा। मेरा दोस्त अमल मेरी पसंद की घड़ी की विपरीत दिशा में अगला टुकड़ा उठाएगा। मेरा दोस्त बिमल मेरी पसंद की अगली स्लाइस को दक्षिणावर्त दिशा मे