2011-05-25 25 views
10

मेरे पास एक प्रश्न है जो कुछ 11 स्ट्रिंग या तालिका के टेक्स्ट फ़ील्ड पर ILIKE कर रहा है जो बड़ा नहीं है (500 000), लेकिन स्पष्ट रूप से बहुत बड़ा है, खोज क्वेरी 20 सेकंड लेती है। डाटाबेस पोस्ट 0 हैहाइबरनेट खोज, लुसीन या कोई अन्य विकल्प?

मुझे इस खोज को बहुत तेज होने की आवश्यकता है।

क्या मेरे मन में आया था:

  1. मैं अतिरिक्त TVECTOR स्तंभ सभी स्तंभों की खोज करने की आवश्यकता है से इकट्ठा किए गए, और उस पर पूरा टेक्स्ट सूचकांक बनाया। फुलटेक्स्ट खोज काफी तेज थी। लेकिन ... मैं इस टीवीईक्टर प्रकार को मेरे .hbms में मैप नहीं कर सकता। तो यह विचार गिर गया (किसी भी मामले में मैंने इसे एक अस्थायी समाधान के रूप में और अधिक बताया)।

  2. हाइबरनेट खोज। (आज पहली बार सुनाई दे रहा है) ऐसा प्रतीत होता है, लेकिन मुझे इस पर अनुभवी राय चाहिए, क्योंकि मैं नई एपीआई में नहीं जाना चाहता, संभवतः सबसे आसान नहीं, कुछ ऐसा करने के लिए जो सरल हो सकता है।

  3. Lucene

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

सभी सलाह की सराहना की!

Thanx

उत्तर

12

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

  1. हाँ आप कर सकते हैं सूचकांक विशिष्ट स्तंभ:

    तो आपके सवालों के जवाब। आपके पास फ़ील्ड की सामग्री को टोकन करने की क्षमता भी है ताकि आप फ़ील्ड के हिस्सों से मेल खा सकें।

  2. बिल्कुल उपयोग करना मुश्किल नहीं है, आप बस यह निर्धारित करते हैं कि आप किन संपत्तियों को खोजना चाहते हैं। हाइबरनेट को कहें कि इसकी अनुक्रमणिका कहाँ रखें। और फिर उन संस्थाओं को लोड करने के लिए EntityManager/सत्र इंटरफेस का उपयोग कर सकते हैं जिन्हें आपने खोजा है।

+0

thanx के लिए उपयोग की जाने वाली विशेष तालिका में अपने डेटा को फ़्लैट करने के लिए संग्रहीत प्रक्रियाओं का भी उपयोग कर सकते हैं, एक और छोटा प्रश्न, मैं कुछ स्ट्रिंग फ़ील्ड पर खोज करने में सक्षम होना चाहता हूं। क्या यह अन्य सभी फ़ील्ड को इंडेक्स में भी स्टोर करने का एहसास है, लेकिन खोजने योग्य नहीं है, और फिर जब मैंने मारा है, तो मुझे वहां से वस्तु मिलती है, या मुझे आईडीएस मिलना चाहिए और उन्हें प्राप्त करने के लिए डेटाबेस जाना चाहिए ? – Julia

+0

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

+0

वास्तव में साफ, thanx! – Julia

0

मैं Compass सलाह देते हैं। यह लुसीन के शीर्ष पर बनाया गया एक ओपन सोर्स प्रोजेक्ट है जो प्रदाता को एक सरल एपीआई (ल्यूसीन से) प्रदान करता है। यह कई सामान्य जावा पुस्तकालयों और स्प्रिंग और हाइबरनेट जैसे ढांचे के साथ अच्छी तरह से एकीकृत करता है।

0

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

क्या आपने Solr पर विचार किया है? यह लुसीन के शीर्ष पर बनाया गया है और एक डीबी और एक आराम एपीआई से स्वचालित अनुक्रमण प्रदान करता है।

+0

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

+0

जिस तरह से मैंने किया, मेरे डेटा की एक "फ्लैट" संरचना बनाने के लिए जॉइन के साथ चयन प्रश्नों का उपयोग करना था ताकि मैं उन पर एक सूचकांक चला सकूं। यह एक दृष्टिकोण है। आप स्पष्टीकरण के लिए इंडेक्सिंग उद्देश्यों –

0

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

+0

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

+0

मैं आपको एक उदाहरण देता हूं: आपको वेब सर्वर पर http कॉल करना होगा। जावा में सॉकेट लाइब्रेरी है जो आपको ऐसा करने में मदद करती है, लेकिन बेहतर है: अपाचे कॉमन्स http क्लाइंट। यह वास्तव में है कि प्रोटोकॉल को लागू करने वाले पुस्तकालयों में निर्मित के साथ आते हैं। सोलर के लिए वही बात जो इंडेक्स को प्रबंधित करने के लिए एपीआई में निर्मित है, आसान डेटाबेस एकीकरण के साथ आसान पूर्ण पाठ खोज और एक सर्वलेट कंटेनर चलाने के लिए डिज़ाइन किया गया है। –

6

चूंकि आप पहले से ही हाइबरनेट और लुसीन का उपयोग कर रहे हैं, Hibernate Search एक शानदार विकल्प है।

क्या हाइबरनेट खोज मुख्य रूप से प्रदान करेगा, यह आपके तंत्र को अद्यतन करने के लिए आपके ल्यूसीन इंडेक्स को अद्यतन करने के लिए एक तंत्र है, और लुसीन इंडेक्स के खिलाफ अपनी खोजों को सरल बनाने के लिए आपको पहले से ही हाइबरनेट के बारे में क्या पता है।

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

मुझे पता चला है कि टेक्स्ट भारी खोजों के लिए हाइबरनेट खोज पर भरोसा करना सबसे अच्छा है, लेकिन अधिक पारंपरिक खोज के लिए सादे पुराने हाइबरनेट पर वापस लौटना और परिणाम प्रदर्शन के लिए जटिल ऑब्जेक्ट ग्राफ़ को हाइड्रेट करना।

0

एक साल पहले मैंने कम्पास की सिफारिश की होगी। यह अच्छा था कि यह क्या करता है, और तकनीकी रूप से अभी भी खुशी से चलाया गया है जो मैंने विकसित और बनाए रखा है।

हालांकि, ElasticSearch पर स्विच करने के प्रयासों के साथ, कम्पास पर और कोई विकास नहीं है। उस परियोजना की वेबसाइट से मैं निश्चित रूप से निर्धारित नहीं कर सकता कि यह बिग टाइम के लिए तैयार है या यहां तक ​​कि वास्तव में भी जीवित है।

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

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