firebase - क्लाउड फायरस्टार संग्रह पर पैटर्न द्वारा खोजें



google-cloud-firestore (1)

मैं एक फायरस्टार संग्रह पर पैटर्न द्वारा एक फिल्टर करने की कोशिश कर रहा हूं। छूट के लिए, मेरे फायरस्टार डेटाबेस में मेरे पास adidas नामक एक ब्रांड है। उपयोगकर्ता के पास एक खोज इनपुट होता है, जहां "एडि", "एडिड", "एडिडा" या "एडिडास" टाइप करने से adidas दस्तावेज़ लौटता है। मैंने ऐसा करने के लिए कई समाधान बताए:


1. सभी दस्तावेज प्राप्त करें और फ्रंट-एंड फ़िल्टर करें

var brands = db.collection("brands");
filteredBrands = brands.filter((br) => br.name.includes("pattern"));

फायरस्टार मूल्य निर्धारण के कारण यह समाधान स्पष्ट रूप से एक विकल्प नहीं है। इसके अलावा दस्तावेजों की संख्या अधिक होने पर अनुरोध करने के लिए यह काफी लंबा हो सकता है।


2. Algolia या Algolia का उपयोग

यह दिलचस्प हो सकता है। हालाँकि मुझे लगता है कि केवल एक पैटर्न खोज के लिए इन समाधानों को जोड़ने के लिए यह थोड़ा ओवरकिल है, और यह भी जल्दी से महंगा हो सकता है।


3. ऑब्जेक्ट निर्माण पर कस्टम searchName क्षेत्र

इसलिए मेरे पास यह समाधान था: दस्तावेज़ निर्माण में, संभव खोज पैटर्न की एक सरणी के साथ एक फ़ील्ड बनाएं:

{
    ...
    "name":"adidas",
    "searchNames":[
        "adi",
        "adida",
        "adidas"
    ],
    ...
}

ताकि दस्तावेज़ तक पहुँचा जा सके:

filteredBrands = db.collection("brands").where("searchNames", "array-contains", "pattern");

इसलिए मेरे पास कई प्रश्न थे:

  • आप इस 3 समाधान की परिधि और दक्षता के बारे में क्या सोचते हैं? अब तक आपको क्या लगता है कि यह एलीटेसर्च या अल्गोलिया के रूप में तीसरे पक्ष के समाधान का उपयोग करने से बेहतर हो सकता है?
  • क्या आपके पास फायरस्टार संग्रह पर पैटर्न फ़िल्टर करने के लिए कोई अन्य विचार है?

IMHO, पहला समाधान निश्चित रूप से एक विकल्प नहीं है। क्लाइंट-साइड के लिए खोज करने के लिए संपूर्ण संग्रह डाउनलोड करना व्यावहारिक नहीं है और बहुत महंगा भी है।

दूसरा विकल्प इस तथ्य पर विचार करने का सबसे अच्छा विकल्प है जो आपको अपने पूरे क्लाउड फायरस्टोर डेटाबेस में पूर्ण पाठ खोज को सक्षम करने में मदद करेगा। यह तय करना है कि आप इसे इस्तेमाल करने लायक हैं या नहीं।

आप इस 3 समाधान की परिधि और दक्षता के बारे में क्या सोचते हैं?

तीसरे समाधान के बारे में, यह काम कर सकता है लेकिन इसका मतलब है कि आप ब्रांड नाम बहुत लंबे होने पर भी संभावित खोज पॉटर्स की एक सरणी बनाते हैं। जैसा कि मैंने आपके स्कीमा में देखा है, आप 3 अक्षर से शुरू होने वाले संभावित खोज पैटर्न को जोड़ रहे हैं, जिसका अर्थ है कि यदि कोई ad खोज रहा है, तो कोई परिणाम नहीं मिलेगा। इस समाधान का नकारात्मक पक्ष यह है कि यदि आपके पास Asics Tiger नाम का एक ब्रांड है और उपयोगकर्ता Tig या Tige लिए खोजकर्ता है, तो आप फिर से कोई परिणाम नहीं निकालेंगे।

क्या आपके पास फायरस्टार संग्रह पर पैटर्न फ़िल्टर करने के लिए कोई अन्य विचार है?

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

var brands = db.collection("brands");
brands.orderBy("name").startAt(searchName).endAt(searchName + "\uf8ff")

इस मामले में, एक ad या ad जैसी खोज पूरी तरह से ठीक काम करेगी। इसके अलावा, कोई अन्य सरणियाँ बनाने की आवश्यकता नहीं होगी। तो वहाँ कम दस्तावेज़ लिखेंगे।