2012-05-21 21 views
20

मैं लोचदार खोज का उपयोग करके सामाजिक सुविधाओं के साथ एक व्यवसाय खोज बनाने की कोशिश कर रहा हूं। मेरे पास एक व्यापार निर्देशिका है, और उपयोगकर्ता विभिन्न तरीकों से उन व्यवसायों से बातचीत कर सकते हैं: उनकी समीक्षा करके, इन्हें जांचना, आदिसामाजिक खोज को लागू करने के लिए लोचदार खोज का उपयोग कैसे किया जा सकता है?

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

मैं कुछ संभव समाधान है सोच सकते हैं, लेकिन मैं ES के साथ एक शुरुआत कर रहा हूँ और मुझे यकीन है कि क्या समस्या पैदा हो जाएगा नहीं कर रहा हूँ:

  1. मैं बहु tennancy इस्तेमाल कर सकते हैं और एक अलग बनाने प्रत्येक उपयोगकर्ता के लिए सूचकांक। मैंने इसे अस्वीकार कर दिया है क्योंकि उपयोगकर्ताओं की संख्या व्यवसाय की मात्रा या उपयोगकर्ता-विशिष्ट सामग्री की मात्रा से कहीं अधिक है।

  2. मैं प्रत्येक अनुक्रमित व्यवसाय में उपयोगकर्ता/स्कोर जोड़े की एक सूची जोड़ सकता हूं। प्रत्येक उपयोगकर्ता जिसने व्यापार के साथ बातचीत की है वहां मौजूद होगा, और स्कोर व्यापार के साथ होने वाली बातचीत की मात्रा का प्रतिनिधित्व करेगा (यह मेरे फ़िल्टरिंग/सॉर्टिंग उद्देश्यों के लिए पर्याप्त है)। हर बार जब वे व्यवसाय के साथ बातचीत करते हैं, तो मैं सूचकांक में स्कोर अपडेट करूंगा। इसके साथ समस्या यह है कि मुझे केवल अपने दोस्तों की गतिविधि की परवाह है, इसलिए मुझे यह ध्यान में रखना होगा कि व्यवसाय के लिए समग्र स्कोर बनाते समय मेरे दोस्त कौन हैं। मुझे नहीं पता कि ईएस में ऐसा कैसे करें।

  3. मैं एक समान योजना बना सकता हूं, लेकिन व्यवसाय के साथ मेरी बातचीत के स्कोर को रखने के बजाय, स्कोर व्यापार के साथ मेरे दोस्तों के इंटरैक्शन को प्रतिबिंबित करेगा। यह लोचदार खोज में मेरे सोशल ग्राफ को मॉडल करने की आवश्यकता को दूर करता है, लेकिन इसका मतलब यह है कि जब भी कोई व्यक्ति किसी व्यवसाय के साथ बातचीत करता है, तो मुझे अपने सभी दोस्तों के स्कोर अपडेट करना होगा। इसका मतलब यह भी होगा कि प्रत्येक व्यवसाय के लिए उपयोगकर्ता/स्कोर जोड़े की सूची बड़ी होगी, क्योंकि इसमें किसी ऐसे व्यक्ति को शामिल करने की आवश्यकता होगी जिसके पास एक दोस्त है जिसने व्यापार के साथ बातचीत की है।

  4. अंतिम समाधान जो मैं सोच सकता हूं वह है कि किसी व्यवसाय के साथ होने वाली प्रत्येक व्यक्तिगत बातचीत का ट्रैक रखें और इसे ईएस में व्यवसाय के दस्तावेज़ में जोड़ें। यह मेरे लिए यथार्थवादी प्रतीत नहीं होता है - यह अन्य समाधानों से समस्याओं को जोड़ता है। लेकिन इंडेक्स को अद्यतित रखने के मामले में शायद यह सबसे सरल दृष्टिकोण है।

आपकी मदद के लिए धन्यवाद!

+1

मुझे एक समान समस्या का सामना करना पड़ रहा है - दिमाग साझा करना आप इसके बारे में कैसे जा रहे हैं? – EugeneMi

उत्तर

8

मैं एक संशोधित # 2 के लिए मतदान कर रहा हूं।

व्यवसाय दस्तावेज़ के अंदर प्रत्येक उपयोगकर्ता/स्कोर जोड़ी को संग्रहीत करने के बजाय, मैं एक अभिभावक/बाल संबंध बनाउंगा। यह आपको पूरे व्यवसाय दस्तावेज़ (और अन्य सभी उपयोगकर्ता स्कोर) को फिर से एक्सचेंज किए बिना बच्चे के स्कोर (उपयोगकर्ता स्कोर) को अपडेट करने देता है। http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/

तो फिर तुम एक has_child filter या top_children query केवल उन व्यवसायों कि अपने दोस्तों के लिए स्कोर को खोजने के लिए उपयोग कर सकते हैं:

चेक बाहर एक महान ट्यूटोरियल माता-पिता के लिए इस पेज/बच्चों आधे रास्ते नीचे के बारे में कर रहे हैं। बच्चों के दस्तावेजों को ऑर्डर करने के बारे में कुछ चेतावनी हैं, लेकिन यह उस ट्यूटोरियल द्वारा कवर किया गया है, इसलिए सुनिश्चित करें कि आप नीचे पढ़ लें।

तो मैं बस सभी "गैर-सामाजिक" रैंकिंग खोजों के लिए सामान्य क्वेरी करता हूं।

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

5

ऐसे समाधानों का एक और समूह है जो अत्यधिक तेज़ होने का उछाल है (यानी ईएस का सबसे अच्छा लाभ लेना), लेकिन डेटा भंडारण/पुनर्प्राप्ति प्रणालियों को डिजाइन करने के बारे में पहली चीज़ को जानने वाले किसी भी व्यक्ति के लिए भयानक लग रहा है।

अपने 'व्यापार' सूचकांक अपने 'उपयोगकर्ता सूचकांक (अर्थात 10,000 बिज़, 1,000,000 उपयोगकर्ताओं) की तुलना में छोटे

  1. 2 अनुक्रमणिका बनाएँ है: उपयोगकर्ता और व्यापार
  2. व्यापार सूचकांक 'एक सरणी' फ़ील्ड कि प्रत्येक उपयोगकर्ता की आईडी जो कभी यह (यानी "उपयोगकर्ताओं: 1,4,23,26,127,8678") के साथ "बातचीत" है धारण करना चाहिए
  3. उपयोगकर्ता सूचकांक होना चाहिए

आप एक व्यवसाय के लिए खोज करते हैं, करते हैं व्यापार आईडी और समीक्षाएँ, चेकइन, आदि मेटा जानकारी के साथ एक नेस्टेड वस्तु में (यानी ": 1233, रेटिंग: 7.5, चेकइन 21 business_id") के साथ एक नेस्टेड सरणी क्षेत्र बिजनेस इंडेक्स के खिलाफ उपयोगकर्ता के मित्र आईडी (या निश्चित रूप से) के साथ त्वरित स्ट्रिंग क्वेरी या फ़िल्टर क्वेरी। टीएफ-आईडीएफ को उन व्यवसायों को स्वचालित रूप से फ़िल्टर करना चाहिए जिन्हें आपके अपने दोस्तों द्वारा सबसे ज्यादा बातचीत की गई है। यदि आपको अधिक जानकारी चाहिए, तो बस अपने प्रत्येक मित्र (रेटिंग, चेकइन्स, आदि) के लिए मेटा डेटा प्राप्त करने के लिए उपयोगकर्ता अनुक्रमणिका को दबाएं। यह तेज़ और सुपर कुशल हल्का होना चाहिए, क्योंकि ईएस अलग-अलग शब्दों के रूप में मिलान करने वाले सरणी में बिल्कुल शानदार है। यो के लिए यही है!

यदि आपका 'व्यवसाय' इंडेक्स आपके 'उपयोगकर्ता' इंडेक्स से बड़े पैमाने पर बड़ा है, तो पैटर्न को उलट दें ... उपयोगकर्ता द्वारा इंडेक्स पर इंटरैक्ट किए गए व्यवसाय_आईड्स की अनुक्रमित सरणी डालना।

+0

मैं ईएस के साथ बिल्कुल नया हूं, लेकिन जब आप उपयोगकर्ता इंडेक्स बनाते हैं, तो क्या आपको मुफ्त में उपयोगकर्ता इंडेक्स नहीं मिलता है? असल में, बिजनेस इंडेक्स उपयोगकर्ता इंडेक्स में business_id फ़ील्ड के लिए रिवर्स इंडेक्स है – EugeneMi

3

बस यहां स्पिटबॉलिंग है लेकिन मुझे लगता है कि मैं एक ग्राफ डेटाबेस जैसे Neo4J का उपयोग करना चाहता हूं, जहां "मेरे दोस्तों ने जो व्यवसाय किया है" के रूप में ऐसी क्वेरी करने के लिए यह छोटा होगा और डेटाबेस और लोचदार दोनों में क्वेरी करें एक ही समय और पहले अपने ग्राफ डेटाबेस से परिणाम लौटाना। या आप केवल उस ग्राफ क्वेरी के परिणाम प्राप्त कर सकते हैं और परिणामों को elasticsearch (आईडी से मेल खाते हैं) में मिलान कर सकते हैं, फिर लोचदार खोज परिणामों में एक क्वेरी टाइम बूस्ट लागू करें ताकि वे लौटाए गए परिणामों के शीर्ष पर पहुंचे।

5

बाहर टाइटन https://github.com/thinkaurelius/titan/wiki/Using-Elastic-Search

चेक यह एक ग्राफ इंजन है कि एक वापस अंत के रूप में Elasticsearch साथ काम कर सकते हैं। आप इन सभी कनेक्शनों को ढूंढने और अपनी खोजों के रैंक को समायोजित करने के लिए (मुझे) -> (दोस्त) - [समीक्षा] -> (व्यवसाय) जैसे ग्राफ ट्रैवर्सल कर सकते हैं।

1

सौर ग्राफक्वायर ऑपरेटर के साथ ऐसा कर सकता है।

https://issues.apache.org/jira/browse/SOLR-7543

यह आपको अपने सूचकांक में दस्तावेज है कि "node_id" और "edge_id"

इस संरचना करने के कुछ तरीके हैं के लिए एक (multivalued) क्षेत्र के लिए एक क्षेत्र को शामिल रखने की अनुमति देता :

  1. आपके पास मित्र आईडी की सूची के साथ एक उपयोगकर्ता दस्तावेज़ हो सकता है।या
  2. आपके पास एक अलग तालिका हो सकती है जो एक लिंक तालिका है जो उपयोगकर्ता रिकॉर्ड के बीच लिंक करती है।

मामले 1 के लिए: सिस्टम में प्रत्येक उपयोगकर्ता के लिए एक दस्तावेज़ "user_id" युक्त फ़ील्ड और "friend_ids" वाला एक फ़ील्ड वाला एक दस्तावेज़।

उस समय उपयोगकर्ता 555 के लिए सभी दोस्तों के लिए एक खोज करने के लिए किया जाएगा: अगर आपने अन्य मेटाडाटा क्षेत्रों है, तो

{!graph from="user_id" to="friend_ids" maxDepth=1}user_id:555 

उपयोगकर्ता

{!graph from="user_id" to="friend_ids" maxDepth=2}user_id:555 

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

{!graph from="user_id" to="friend_ids" maxDepth=2 traversalFilter="location:Boston"}user_id:555 

उपर्युक्त क्वेरी बोस्टन में रहने वाले दोस्तों को मिलती है जो दोस्त हैं 555 जो बोस्टन में रहते हैं।

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