2015-01-22 12 views
8

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

(post)<-[:AUTHOR]-(user) 
(post)-[:LIKED_BY]->(otherusers) 
(post)-[:COMMENTED_BY]->(otherusers) 
(post)-[:HAS_PHOTO]->(photos) 

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

Neo4j और Elasticsearch में
  1. स्टोर सब कुछ: अब हम उत्पादन मैं पल में निम्नलिखित के बारे में सोच सकते हैं Elasticsearch के विस्तार के समान स्तर देने के लिए चाहते हैं। जब एक पाठ की खोज की जाती है तो परिणाम elasticsearch से खुद को सूचीबद्ध करते हैं। लेकिन अभी भी ऐसी समस्याएं हैं जैसे उपयोगकर्ता को पहले से ही पोस्ट पसंद आया है (इसे प्रत्येक पोस्ट के लिए फिर से पूछताछ की आवश्यकता हो सकती है? यह बहुत अच्छा नहीं लगता है)

  2. Elasticsearch में स्टोर पोस्ट आईडी। खोज परिणामों को पॉप्युलेट करते समय, इस पोस्ट आईडी के साथ neo4j डेटाबेस से प्रत्येक पोस्ट की जानकारी लें और परिणाम प्रदर्शित करें। (10 परिणाम -> 10 अलग-अलग कॉल, फिर से बहुत अक्षम होते हैं)

  3. एलआईडीएससीएआर प्रदान करता है और एलओ 4j को 1 कॉल करता है और परिणामों को पकड़ता है (यह नहीं पता कि यह कैसे करें या यदि वहां हैं प्रदर्शन के कारण)। एक साइफर संदर्भ सहायक हो सकता है।

इनमें से कोई भी समाधान? ये थोड़ा अक्षम है।

+1

हाय @ प्यूवेलेसर, हमने अभी इसे जारी किया है: http://graphaware.com/neo4j/2016/04/20/graph-aided-search-the-rise-of-personalised-content.html –

+0

@ क्रिस्टोफविलेम हेन धन्यवाद लिंक के लिए, एक महान परियोजना की तरह दिखता है। निश्चित रूप से इसे जांच लेंगे। प्रदर्शन और मापनीयता पर कोई जानकारी? – pewpewlasers

+0

प्रदर्शन आपके साइफर प्रश्नों, रीको इंजन या यहां तक ​​कि ES और neo4j के बीच विलंबता के प्रदर्शन पर अत्यधिक निर्भर हैं। यह कुल मिलाकर ईएस क्वेरी समय के लिए इस विलंबता को जोड़ता है (हमने नियो 4j तरफ जावा आधारित इंजन का उपयोग करते समय कच्चे साइफर और 10 एमएमएस के लिए कभी-कभी 40 मिमी मापा)। हालांकि हमने इसे neo4j के अंतिम संस्करण और http के बजाय बाइनरी प्रोटोकॉल के साथ सुधार लिया है। –

उत्तर

7

यह एक राय-आधारित प्रश्न है क्योंकि इसका कोई "सही" उत्तर नहीं है, इसलिए एसओ नो-मजेदार हथौड़ा को क्रैश होने के लिए तैयार करें ... लेकिन मैं सोच रहा हूं कि एक-दो (लोचदार खोज तब नियो) पंच इसे संभालने का सबसे अच्छा तरीका है: एलैस्टिकसेर्च में इंडेक्स गुण, संभावित आईडी प्राप्त करने के लिए एक पूर्ण-पाठ खोज करें, फिर एक साइफर मैच बनाएं जो परिणामों को लौटाए गए आईडी को सीमित करता है।

साइफर में, आप IN [] का उपयोग किसी सरणी के भीतर मेल खाने वाले रिकॉर्ड को वापस करने के लिए कर सकते हैं। तो आप MATCH (u:Student { age: 30 }) WHERE ID(u) IN [1, 2, 3, 4] RETURN u कर सकते हैं। फिर, नियो के साथ लोचदार खोज को एकीकृत करने की चाल, ईएस परिणामों के आसपास साइफर प्रश्नों को बनाना आसान बनाता है। मुझे वास्तव में ऐसा करने पर युक्तियाँ नहीं हैं क्योंकि यह आपकी भाषा और ड्राइवर पर निर्भर करेगा।

Neo4j.rb में, मैं स्वचालित करने के लिए इस ताकि आप यह कर सकते हैं की कोशिश कर के बारे में सोच रहा हूँ:

student.lessons(:l).where(name: 'Chris').to_a 

... और यह जानते हैं कि सबक मॉडल का उपयोग कर रहा है Elasticsearch, क्वेरी करूँगा , और उसके बाद उपयोगकर्ता के लिए क्वेरी को परिवर्तित तो यह प्रभावी रूप से यह है:

student.lessons(:l).where('ID(l) IN {elasticsearch_results}').params(elasticsearch_results: [1, 2, 3, 4]).to_a` 

मैं नव साथ पूर्ण पाठ खोज के लिए Searchkick का उपयोग किया गया है और यह अच्छी तरह से चल रहा है। मुझे लगता है कि यह करने योग्य है। आपकी समस्या का कोई समाधान नहीं है, लेकिन मैं इस बारे में सोच रहा हूं, इसलिए शायद यह आपको कुछ विचार देगा।

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

+0

के लिए संगत है अंतर्दृष्टि के लिए धन्यवाद। यद्यपि एक सवाल हालांकि, 'WHERE ID (u) में प्रदर्शन [1, 2, 3, 4] का प्रदर्शन कैसे होता है? यदि 200,000 से अधिक रिकॉर्ड और उच्च (इंडेक्स जगह पर हैं) कहें तो क्या यह वास्तव में धीमा होगा? दूसरे शब्दों में, क्या यह साइफर स्केल अच्छी तरह से होगा? – pewpewlasers

+3

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

+1

इसके अलावा, एक बात मैंने हाल ही में एक एसओ टिप्पणी से सीखा: neo4j का भविष्य (अगला?) संस्करण '= ~ 'शर्तों के लिए इंडेक्स का उपयोग करेगा! –

3

मैं भी Neo4J & Elasticsearch एकीकरण की तलाश में हूं। मैंने "लोचदार खोज के लिए नियो 4j नदी प्लगइन" देखा है। लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए। यदि आप लोगों को "लोचदार खोज के लिए नियो 4j नदी प्लगइन" के साथ एकीकृत करने के बारे में कोई जानकारी मिलेगी, तो कृपया मुझे बताएं, वास्तव में सहायक होगा।

+0

मैंने नदी प्लगइन के साथ ES और Neo4J एकीकृत किया है और मेरा उत्तर पोस्ट किया है, नीचे दिए गए लिंक को देखें: http://stackoverflow.com/questions/28323323/examples-about-integration-of-elasticsearch-with-neo4j/28428555#28428555 – RCS