2017-04-11 6 views
6

मैं फ़ायरबेस का उपयोग अपने अंतिम स्कैन अक्षांश और देशांतर के साथ उपयोगकर्ताओं को स्टोर करने के लिए कर रहा हूं।पास के स्थानों के लिए क्वेरी

कोई प्रविष्टि इस तरह दिखता है:

"Bdhwu37Jdmd28DmenHahd221" : { 
    "country_code" : "at", 
    "firstname" : "John", 
    "gender" : "m", 
    "lat" : 11.2549387, 
    "lon" : 17.3419559 
} 

जब भी कोई उपयोगकर्ता एक विशिष्ट "खोज" बटन दबाता है, मैं अपने Firebase समारोह व्यक्ति जो अनुरोध भेजा के सबसे नजदीक लोगों को लाने के लिए चाहते हैं।

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

पहले से ही 5 उपयोगकर्ताओं के साथ, परिणाम प्राप्त करने के लिए कार्य 40 सेकंड की तरह लगता है।

मैंने यौगिक इंडेक्स के बारे में भी पढ़ा है, लेकिन मुझे किसी भी तरह अक्षांश और देशांतर दोनों क्षेत्रों के लिए अक्षांश और क्वेरी को जोड़ना होगा।

क्या यहां कोई दूसरा और तीसरा प्रश्न शामिल करने का कोई तरीका है (उदा। उसी देशकोड की खोज करें, और फिर समान समानता और अक्षांश के लिए) या क्या मुझे इसे अपने सर्वर कोड के अंदर हल करना है?

+4

https://github.com/firebase/geofire – cartant

उत्तर

12

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

हालांकि यह पहली बार असंभव प्रतीत हो सकता है, यह वास्तव में Geohashes के रूप में किया गया है। इसके लक्षण के कुछ:

  1. यह एक श्रेणीबद्ध स्थानिक डेटा संरचना जो ग्रिड आकार

तो से भरी बाल्टी में अंतरिक्ष उप विभाजित है: Geohashes बकेट की ग्रिड में अंतरिक्ष को विभाजित, प्रत्येक बाल्टी एक स्ट्रिंग द्वारा पहचाना जाता है।

  1. Geohashes मनमाना परिशुद्धता और धीरे-धीरे इसका आकार कम करने के लिए (और धीरे-धीरे परिशुद्धता खो) कोड के अंत से पात्रों को दूर करने की संभावना की तरह गुण प्रदान करते हैं।

अब स्ट्रिंग, बड़े क्षेत्र है कि बाल्टी

  1. को शामिल किया गया क्रमिक परिशुद्धता गिरावट का एक परिणाम के रूप में, आसपास के स्थानों होगा अक्सर (लेकिन हमेशा नहीं) समान उपसर्ग प्रस्तुत करते हैं। अब एक साझा उपसर्ग है, दो जगहों के करीब हैं।

तार एक ही अक्षर के साथ शुरू करने के लिए एक दूसरे के करीब हैं।

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

फायरबेसेज जिओफ़ीयर नामक एक लाइब्रेरी प्रदान करता है, जो अपने रीयलटाइम डेटाबेस के शीर्ष पर एक जिओलोकेशन सिस्टम को लागू करने के लिए जियोशैश का उपयोग करता है। पुस्तकालय JavaScript, Java और Objective-C/Swift के लिए उपलब्ध है।

Geofire के बारे में अधिक जानने के लिए, बाहर की जाँच:

+0

धन्यवाद, मैं इसे पढ़ और कोशिश करूंगा। क्या यह संभव है, क्लाउड फ़ंक्शन सुपर धीमी हैं? केवल 3 लोगों के लिए पूछताछ मुझे हर बार 40 सेकंड की तरह लेती है (न केवल पहली बार) और मैं केवल 2 डेटाबेस तक पहुंचता हूं। – Thomas

+0

यदि आपके पास लगातार प्रदर्शन होता है जो आपको लगता है कि यह अनुचित है (भले ही आप क्लाउड फ़ंक्शंस बीटा में हों), तब भी [कम से कम कोड जो उस समस्या को पुन: उत्पन्न करता है] के साथ एक प्रश्न खोलें (http://stackoverflow.com/help/mcve) । –

+0

जियोफायर ठीक काम करता है, लेकिन मैं इसे काम नहीं कर सकता, जब उपयोगकर्ता का स्थान उपयोगकर्ता डेटा के भीतर घोंसला होता है। "/ उपयोगकर्ता" पर मेरा भू-संदर्भ संदर्भ बिंदु और मेरा जियोफायर डेटा/उपयोगकर्ता/$ uid/स्थान पर है, क्या geoFire स्वचालित रूप से नेस्टेड फ़ील्ड खोजता है या क्या मुझे कहीं परिभाषित करना है, जहां "g" मान मिलता है? ऐसा लगता है जैसे एल्गोरिदम मेरे "/ उपयोगकर्ता" प्रविष्टि के नीचे "जी" की तलाश में है और "स्थान" – Thomas

संबंधित मुद्दे