firebase - Google Firestore: संपत्ति मान के पाठ पर क्वेरी(पाठ खोज)




google-cloud-firestore (7)

मैं एक साधारण खोज फ़ील्ड जोड़ना चाह रहा हूं, जैसे कुछ उपयोग करना चाहते हैं

collectionRef.where('name', 'contains', 'searchTerm')

मैंने where('name', '==', '%searchTerm%') का उपयोग करने की कोशिश की, लेकिन यह कुछ भी वापस नहीं आया।


Firebase स्पष्ट रूप से एक स्ट्रिंग के भीतर शब्द की खोज का समर्थन नहीं करता है ...

हालांकि Firebase अब निम्नलिखित का समर्थन करता है जो आपके मामले और कई अन्य लोगों के लिए हल करेगा:

अगस्त 2018 तक वे array-contains क्वेरी का समर्थन करते हैं। देखें: https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

अब आप अपनी सभी महत्वपूर्ण शर्तों को एक फ़ील्ड के रूप में एक सरणी में सेट कर सकते हैं, फिर उन सभी दस्तावेज़ों के लिए क्वेरी कर सकते हैं जिनमें एक ऐसा सरणी है जिसमें 'X' है। आप अतिरिक्त प्रश्नों के लिए आगे की तुलना करने के लिए तार्किक और का उपयोग कर सकते हैं (ऐसा इसलिए है क्योंकि फायरबेस वर्तमान में कई सरणी वाले प्रश्नों के लिए मूल रूप से यौगिक प्रश्नों का समर्थन नहीं करता है, इसलिए 'एंड' सॉर्टिंग प्रश्नों को ग्राहक के अंत में करना होगा)

इस शैली में सरणियों का उपयोग करने से उन्हें समवर्ती लेखन के लिए अनुकूलित किया जा सकेगा जो अच्छा है! परीक्षण नहीं किया गया है कि यह बैच अनुरोधों का समर्थन करता है (डॉक्स नहीं कहते हैं) लेकिन मैं इसे आधिकारिक समाधान के बाद से दांव लगाऊंगा।

उपयोग:

collection("collectionPath").
    where("searchTermsArray", "array-contains", "term").get()

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


जबकि कुबा का जवाब सही है, जहां तक ​​प्रतिबंध है, आप आंशिक रूप से सेट-जैसी संरचना के साथ इसका अनुकरण कर सकते हैं:

{
  'terms': {
    'reebok': true,
    'mens': true,
    'tennis': true,
    'racket': true
  }
}

अब आप क्वेरी कर सकते हैं

collectionRef.where('terms.tennis', '==', true)

यह काम करता है क्योंकि फायरस्टार स्वचालित रूप से हर क्षेत्र के लिए एक सूचकांक बनाएगा। दुर्भाग्य से यह सीधे यौगिक प्रश्नों के लिए काम नहीं करता है क्योंकि फायरस्टार स्वचालित रूप से समग्र अनुक्रम नहीं बनाता है।

आप अभी भी शब्दों के संयोजन को संग्रहीत करके इसके चारों ओर काम कर सकते हैं लेकिन यह बदसूरत हो जाता है।

आप शायद अभी भी आउटबोर्ड पूर्ण पाठ खोज के साथ बेहतर हैं


देर से जवाब लेकिन किसी के लिए जो अभी भी एक उत्तर की तलाश में है, मान लें कि हमारे पास उपयोगकर्ताओं का एक संग्रह है और संग्रह के प्रत्येक दस्तावेज़ में हमारे पास "उपयोगकर्ता नाम" फ़ील्ड है, इसलिए यदि कोई दस्तावेज़ ढूंढना चाहते हैं, जहां उपयोगकर्ता नाम "अल" से शुरू होता है हम ऐसा कुछ कर सकते हैं

 FirebaseFirestore.getInstance().collection("users").whereGreaterThanOrEqualTo("username", "al")

मैं @ कुबा के उत्तर से सहमत हूं, लेकिन फिर भी, इसे उपसर्ग द्वारा खोज के लिए पूरी तरह से काम करने के लिए एक छोटे से बदलाव को जोड़ने की आवश्यकता है। यहाँ मेरे लिए क्या काम किया

नाम queryText शुरू होने वाले रिकॉर्ड खोजने के लिए

collectionRef.where('name', '>=', queryText).where('name', '<=', queryText+ '\uf8ff')

क्वेरी में उपयोग किया जाने वाला वर्ण \uf8ff यूनिकोड श्रेणी में एक बहुत ही उच्च कोड बिंदु है (यह एक निजी उपयोग क्षेत्र [PUA] कोड है)। क्योंकि यह यूनिकोड के अधिकांश नियमित पात्रों के बाद है, क्वेरी क्वेरी से शुरू होने वाले सभी मूल्यों से मेल खाती है।


मैं वास्तव में लगता है कि फायरस्टार के भीतर ऐसा करने का सबसे अच्छा समाधान एक सरणी में सभी सबस्ट्रिंग डालना है, और बस array_container क्वेरी करना है। यह आपको सबस्ट्रिंग मिलान करने की अनुमति देता है। सभी सबस्ट्रिंग्स को स्टोर करने के लिए थोड़ा ओवरकिल लेकिन अगर आपके खोज शब्द कम हैं तो यह बहुत ही उचित है।


फायरस्टार डॉक्स के अनुसार , क्लाउड फायरस्टार दस्तावेजों में पाठ क्षेत्रों के लिए देशी अनुक्रमण या खोज का समर्थन नहीं करता है। इसके अतिरिक्त, क्लाइंट-साइड के लिए खोज करने के लिए संपूर्ण संग्रह डाउनलोड करना व्यावहारिक नहीं है।

तीसरे पक्ष के खोज समाधान जैसे Algolia और इलास्टिक खोज की सिफारिश की जाती है।





google-cloud-firestore