2009-10-26 11 views
5

क्या कोई खुले स्रोत या वाणिज्यिक उपकरण उपलब्ध हैं जो डेटाबेस सामग्री के टेक्स्ट खंड अनुक्रमण अनुक्रमण की अनुमति देते हैं और जावा से पूछे जा सकते हैं?डेटाबेस में टेक्स्ट टुकड़े की खोज कैसे करें

प्रश्न की पृष्ठभूमि एक बड़ी MySQL डेटाबेस तालिका है जिसमें कई सौ हजार रिकॉर्ड हैं, जिनमें कई VARCHAR कॉलम हैं। इन कॉलम में लोग सामग्री के टुकड़ों की खोज करना चाहते हैं, इसलिए एक पूर्ण टेक्स्ट इंडेक्स (जो शब्द सीमाओं पर आधारित है) मदद नहीं करेगा।

संपादित: [स्पष्ट करना क्यों इन पहला सुझाव समस्या का समाधान नहीं होता जोड़ा गया:]

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

EDIT2: [कुछ और पृष्ठभूमि जानकारी जोड़ा गया:] का अनुरोध सुविधा है कि यह एक व्यापार प्रबंधन प्रणाली में आइटम विवरण के लिए एक बहुत ढीला खोज है आधारित लागू किया जाना। उपयोगकर्ता अक्सर सही आइटम नंबर नहीं जानते हैं, लेकिन आइटम के नाम का केवल एक हिस्सा हैं। दुर्भाग्यवश इन विवरणों की गुणवत्ता कम है, वे विरासत प्रणाली से आती हैं और आसानी से नहीं बदला जा सकता है। उदाहरण के लिए लोग एक स्लेज हथौड़ा खोज रहे थे, वे "स्लेज" दर्ज करेंगे। एक शब्द/टोकन आधारित इंडेक्स के साथ यह "स्लेजहैमर" के रूप में संग्रहीत मैचों को नहीं मिलेगा, लेकिन केवल वे "स्लेज हथौड़ा" सुनते हैं। ऐसे सभी प्रकार के अजीब भिन्नताएं हैं जिन्हें कवर करने की आवश्यकता है, जिससे टोकन आधारित दृष्टिकोण अव्यवहारिक हो।

वर्तमान में केवल एक चीज है जो हम कर सकते हैं LIKE '%searchterm%' क्वेरी है, जो प्रभावी रूप से किसी भी इंडेक्स उपयोग को अक्षम कर रही है और बहुत सारे संसाधन और समय की आवश्यकता है।

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

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

मुझे सिफारिशें और/या अनुभव रिपोर्ट प्राप्त करने में खुशी होगी।

EDIT3: वाणिज्यिक समाधान पाया गया कि "सिर्फ काम करता है" हालांकि मैं इस सवाल के लिए अच्छा जवाब का एक बहुत हो गया, मैं यहाँ ध्यान दें, कि अंत में हम एक व्यावसायिक उत्पाद "QuickFind" कहा जाता है के साथ चला गया चाहता था , "एचएमबी डेंटेंटेनिक" नाम की एक जर्मन कंपनी द्वारा बनाई गई और बेची गई। कृपया ध्यान दें कि मैं किसी भी तरह से संबद्ध नहीं हूं, क्योंकि ऐसा लगता है कि जब मैं जाता हूं और वर्णन करता हूं कि उनका उत्पाद क्या कर सकता है। दुर्भाग्यवश उनके website बल्कि खराब दिखते हैं और केवल जर्मन ही हैं, लेकिन उत्पाद ही वास्तव में महान है। मेरे पास वर्तमान में उनमें से एक परीक्षण संस्करण है - आपको उनसे संपर्क करना होगा, कोई डाउनलोड नहीं - और मैं बेहद प्रभावित हूं।

चूंकि ऑनलाइन कोई व्यापक दस्तावेज उपलब्ध नहीं है, इसलिए मैं अब तक अपने अनुभवों का प्रयास और वर्णन करूंगा।

वे क्या करते हैं डेटाबेस सामग्री के आधार पर एक कस्टम इंडेक्स फ़ाइल बनाते हैं। वे ओडीबीसी के माध्यम से एकीकृत कर सकते हैं, लेकिन मुझे बताया गया है कि ग्राहकों को शायद ही कभी ऐसा ही किया जाता है। इसके बजाए - और यही वह है जो हम करेंगे - आप अपने प्राथमिक डेटाबेस से एक टेक्स्ट निर्यात (जैसे सीएसवी) उत्पन्न करते हैं और अपने सूचकांक को फ़ीड करते हैं। यह आपको वास्तविक तालिका संरचना (या बिल्कुल किसी भी SQL डेटाबेस) से पूरी तरह से स्वतंत्र होने की अनुमति देता है; वास्तव में हम कई तालिकाओं से डेटा एकत्रित निर्यात करते हैं। बाद में फ्लाई पर इंडेक्स को बढ़ाया जा सकता है।

उनके सर्वर के आधार पर (केवल 250kb या तो, एक कंसोल ऐप या विंडोज सेवा के रूप में चल रहा है) एक टीसीपी पोर्ट पर प्रश्नों के लिए सुनता है। प्रोटोकॉल पाठ आधारित है और थोड़ा "पुराना" दिखता है, लेकिन यह सरल और काम करता है। असल में आप केवल उन उपलब्ध इंडेक्स को पास करते हैं जिन्हें आप क्वेरी करना चाहते हैं और खोज शब्द (टुकड़े), स्थान सीमित है। तीन आउटपुट प्रारूप उपलब्ध हैं, एचटीएमएल/जावास्क्रिप्ट सरणी, एक्सएमएल या सीएसवी। वर्तमान में मैं कुछ हद तक "दिनांकित" वायर प्रोटोकॉल के लिए जावा रैपर पर काम कर रहा हूं। लेकिन परिणाम शानदार हैं: मेरे पास वर्तमान में 8 कॉलम अनुक्रमित के साथ लगभग 500,000 रिकॉर्ड्स का नमूना डेटा सेट है और मेरा परीक्षण एप्लिकेशन संपादित किए जाने के दौरान प्रत्येक कीस्ट्रोक पर JTextField की सामग्री के लिए सभी 8 कॉलम में एक खोज को ट्रिगर करता है और अपडेट कर सकता है रीयल-टाइम में परिणाम प्रदर्शित (जेटीबल)! यह MySQL इंस्टेंस पर जाने के बिना होता है, मूल रूप से डेटा आया था। कॉलम के आधार पर आप वापस आते हैं, फिर आप उस पंक्ति की प्राथमिक कुंजी के साथ MySQL से पूछकर "मूल" रिकॉर्ड मांग सकते हैं (निश्चित रूप से क्विकफ़िंड इंडेक्स में शामिल करने की आवश्यकता है)।

सूचकांक डेटा के पाठ निर्यात संस्करण का आकार लगभग 30-40% है। इंडेक्सिंग मुख्य रूप से डिस्क I/O गति से बंधी थी; मेरे 500,000 रिकॉर्ड संसाधित होने के लिए लगभग एक या दो मिनट लग गए।

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

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

+0

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

+0

अधिक पृष्ठभूमि के साथ एक और अनुच्छेद जोड़ा गया –

+0

लुसीन मैचों को प्रतिस्थापित करता है ... – Stobor

उत्तर

4

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

संक्षेप में, सोलर आपको कस्टम फील्ड टाइप को परिभाषित करने देता है। इनमें इंडेक्स-टाइम विश्लेषक और एक क्वेरी-टाइम विश्लेषक शामिल हैं।विश्लेषकों का पता चलता है कि पाठ के साथ क्या करना है, और प्रत्येक में टोकनिज़र और शून्य कई टोकन फ़िल्टर हैं। टोकनिज़र आपके पाठ को टुकड़ों में विभाजित करता है और फिर प्रत्येक टोकनफिल्टर टोकन जोड़, घटाना या संशोधित कर सकता है।

इस प्रकार फ़ील्ड मूल पाठ से कुछ अलग इंडेक्सिंग को समाप्त कर सकता है, जिसमें आवश्यक होने पर एकाधिक टोकन शामिल हैं। तो आप जो चाहते हैं वह आपके मूल पाठ की एक बहु-टोकन प्रति है, जिसे आप ल्यूसीन को "my_ngram_field: sledge" जैसे कुछ भेजकर पूछते हैं।

<fieldType name="prefix_token" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

EdgeNGramFilterFactory कैसे वे खोज बॉक्स स्वत: पूर्ण के लिए उपसर्ग मिलान लागू है: नहीं वाइल्डकार्ड :-)

शामिल तो फिर तुम एक मॉडल उपसर्ग के समान solrconfig.xml फ़ाइल में की पेशकश की खोज का पालन करें। यह पिछले चरणों से आने वाले टोकन लेता है (एकल सफेद जगह-सीमित शब्दों को कम मामले में परिवर्तित किया जाता है) और उन्हें अग्रणी किनारे पर हर सबस्ट्रिंग में प्रशंसकों को ले जाता है। sledgehammer = s, sl, sle, sled, sledg, sledge, sledgeh, आदि

आपको इस पैटर्न का पालन करने की आवश्यकता है, लेकिन EdgeNGramFilterFactory को अपने आप से बदलें जो फ़ील्ड में सभी एनजीआरएम करता है। डिफ़ॉल्ट org.apache.solr.analysis.NGramFilterFactory एक अच्छी शुरुआत है, लेकिन यह वर्तनी जांच के लिए पत्र पारदर्शिता करता है। आप इसे कॉपी कर सकते हैं और उसे बाहर कर सकते हैं - यह लागू करने के लिए एक बहुत ही सरल वर्ग है।

एक बार जब आप अपने खुद के FieldType है (यह ngram_text कहते हैं) अपनी खुद की MyNGramFilterFactory का उपयोग कर, सिर्फ इसलिए की तरह अपने मूल क्षेत्र और ngram क्षेत्र बनाने के लिए:

<field name="title" type="text" indexed="true" stored="true"/> 
    <field name="title_ngrams" type="ngram_text" indexed="true" stored="false"/> 

फिर कल्पना में मूल क्षेत्र कॉपी करने के लिए यह बताना एक:

<copyField source="title" dest="title_ngrams"/> 

ठीक है, अब आप खोज जब "title_ngrams: स्लेज" आप दस्तावेज है कि इस को शामिल की एक सूची मिलना चाहिए। फिर क्वेरी के लिए अपनी फ़ील्ड सूची में आप इसे फ़ील्ड title_ngrams के बजाय शीर्षक नामक फ़ील्ड को पुनर्प्राप्त करने के लिए कहें।

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

ओह, और वृद्धिशील (हालांकि वास्तविक समय नहीं) अनुक्रमण एक सिंचन है। यह इसे उच्च भार के तहत भी कर सकता है क्योंकि यह पृष्ठभूमि में नई अनुक्रमणिका बनाता है और अनुकूलित करता है और इसे स्वैप करने से पहले इसे स्वचालित करता है। बहुत हल्का।

शुभकामनाएं!

10

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

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

लुसीन और लुसीन.Net में, यदि आप चाहें तो wildcard matches का उपयोग कर सकते हैं। हालांकि, यह खोज में पहला प्रतीक के रूप में वाइल्डकार्ड का उपयोग करने के लिए समर्थित नहीं है। यदि आप पहले चरित्र वाइल्डकार्ड का उपयोग करने की क्षमता चाहते हैं, तो आपको शायद अपने आप पर कुछ प्रकार के त्रि-आधारित इंडेक्स को लागू करने की आवश्यकता होगी, क्योंकि यह कई मामलों में एक महंगी ऑपरेशन है जो कि शर्तों के सेट को फ़िल्टर करने के लिए उचित है इंडेक्स की पूरी तरह से पूर्ण पाठ खोज अनुप्रयोगों के लिए आवश्यक है, जहां प्रत्यय स्टेमिंग आम तौर पर अधिक मूल्यवान होती है।

आप स्पष्ट रूप से setAllowLeadingWildcard को सेट करके इस नियम को ओवरराइड करने के लिए लुसीन में क्वेरी पार्सर इंस्टेंस को बदल सकते हैं।

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

समस्या का समाधान करने के लिए अन्य समाधान हैं जो आप वर्णन करते हैं कि एक शब्द दो के रूप में वर्तनी हो सकती है, या इसके विपरीत। उदाहरण के लिए, लुसीन में अस्पष्ट प्रश्न समर्थित हैं। ऑर्थोग्राफिक और मॉर्फोलॉजिकल वेरिएंट को एक फ़िल्टर प्रदान करके संभाला जा सकता है जो कुछ प्रकार के बेयसियन तंत्र के आधार पर सुझाव प्रदान करता है, या चालों को अनुक्रमणित करके, अर्थात्, लगातार भिन्नताओं का एक कॉर्पस लेना और उन शर्तों के साथ इंडेक्स को भरना। मैंने पूर्ण पाठ इंजन में भरे संरचित डेटा से ज्ञान भी देखा है (उदाहरण के लिए होटल के नाम से रिकॉर्ड करने के लिए शहर का नाम और शब्द "होटल" जोड़ना, यह और अधिक संभावना है कि "पेरिस होटल" में पेंशन के लिए एक रिकॉर्ड शामिल होगा -हाउस Caisse des Dépôts।) वास्तव में एक छोटी सी समस्या नहीं है, यह शब्द-आधारित खोजों के फायदे को नष्ट किए बिना प्रबंधनीय है।

+0

यदि ओपी एक एमएस दुकान में है, तो मैं Lucene.Net की अनुशंसा करता हूं। 20 अक्टूबर तक, इसने अपने स्नातक वोट को अपाचे का आधिकारिक सबप्रोजेक्ट होने के लिए पारित कर दिया है। हम वर्तमान में लुसीन.Net को कार्यान्वित कर रहे हैं, और यह एक पूरी तरह से सुखद अनुभव रहा है। आपके पास खोज और अनुक्रमण दोनों पर इतना नियंत्रण है कि आप वास्तव में इसके प्रदर्शन को निचोड़ सकते हैं। –

0

मुझे पूरा यकीन है कि माइस्क्ल एक पूर्ण टेक्स्ट विकल्प प्रदान करता है, और संभवतः लुसीन का उपयोग करना भी संभव है।

संबंधित टिप्पणियों

Best efficient way to make a fulltext search in MySQL

3

अपनी मेज MyISAM है, तो आप MySQL के पूर्ण पाठ खोज capabilites उपयोग कर सकते हैं के लिए यहाँ देखें: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

यदि नहीं

, "उद्योग मानक" http://www.sphinxsearch.com/

है

यदि आप इनो डीबी का उपयोग कर रहे हैं तो कुछ विचार क्या करें: http://www.mysqlperformanceblog.com/2009/09/10/what-to-do-with-mysql-full-text-search-while-migrating-to-innodb/

इसके अलावा, एक अच्छी प्रस्तुति है कि स्फिंक्स का परिचय और वास्तुकला + उपयोग http://www.scribd.com/doc/2670976/Sphinx-High-Performance-Full-Text-Search-for-MySQL-Presentation

अद्यतन
बताते सवाल का स्पष्टीकरण पढ़ चुके - स्फिंक्स मैचों सबस्ट्रिंग कर सकते हैं। आपको "सक्षम-स्टार" सेट करने और उचित min_infix_length के साथ एक इंफिक्स इंडेक्स बनाने की आवश्यकता है (1 आपको सभी संभावित सबस्ट्रिंग्स देगा, लेकिन स्पष्ट रूप से यह सेट जितना अधिक होगा, आपकी अनुक्रमणिका जितनी छोटी होगी, और आपकी खोज तेज़ी से होगी)। विवरण के लिए http://sphinxsearch.com/docs/current.html देखें।

+0

यह अनुमान लगाएगा कि मैं कितना अनुमान लगाऊंगा। –

+0

मुझे आंतरिक विवरणों पर यकीन नहीं है, लेकिन मुझे लगता है कि वे विस्फोट से निपटने के लिए कुछ बहु-स्तरीय चीज कर रहे हैं - सब्सट्रिंग वाले शब्दों को इंगित करने वाले सबस्ट्रिंग्स (या लंबे सबस्ट्रिंग्स, कुल्ला, दोहराएं), शब्दों वाले दस्तावेज़ों को इंगित करते हैं।पहली नज़र में मैं वैसे भी करूँगा, वैसे भी। – SquareCog

+0

स्फिंक्स बहुत अच्छी पूर्ण पाठ खोज है और PotsgreSQL और Firebird –

3

मैं अपाचे सॉल का उपयोग करूंगा। इंडेक्सिंग रणनीति पूरी तरह से ट्यून करने योग्य है (http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters देखें), सूचकांक को पॉप्युलेट करने के लिए सीधे अपने डेटाबेस से सीधे पढ़ सकते हैं (उसी विकी में DataImportHandler देखें), और मूल रूप से किसी भी भाषा से पूछताछ की जा सकती है जो HTTP और XML या JSON जैसी कुछ बोलती है।

2

आप जो भी करने का प्रयास कर रहे हैं वह LIKE '%searchterm%' से अधिक तेज़ कस्टम कोड के बिना होने की संभावना नहीं है। हालांकि LIKE 'searchterm%' के बराबर तुच्छ होना चाहिए। आप जो भी कर रहे हैं वह कर सकते हैं जो आप सभी संभावित आंशिक शब्दों की एक इंडेक्स बनाकर कर रहे हैं जो पीछे वाले जंगली कार्ड से ढके नहीं हैं, लेकिन इसका परिणाम अविश्वसनीय रूप से बड़े सूचकांक आकार में होगा, और यह अद्यतनों के लिए असामान्य रूप से धीमा होगा। लंबे टोकन के परिणामस्वरूप लंबे टोकन ™ होंगे। क्या मैं पूछ सकता हूं क्यों आपको इसकी आवश्यकता है? पुन: स्पॉटलाइट ... आपको एहसास है कि स्पॉटलाइट ऐसा नहीं करता है, है ना? यह हर दूसरे पूर्ण-पाठ सूचकांक की तरह टोकन-आधारित है। आम तौर पर प्रश्न विस्तार अचूक मिलान प्राप्त करने का उचित तरीका है यदि यह आपका लक्ष्य है।

संपादित करें:

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

+0

जैसे डेटाबेस के लिए भी काम करता है, इसकी आवश्यकता क्यों है इसकी जानकारी की आवश्यकता है –

2

पूर्ण पाठ अनुक्रमण के लिए प्रस्तावित उपरोक्त (लुसीन इत्यादि) जैसे उपकरणों का उपयोग करने के बारे में क्या है और मामलों की तलाश में, जहां कुछ भी नहीं मिला था? (यानी पूर्ण टेक्स्ट अनुक्रमित खोज के बाद शून्य परिणाम लौटाए जाने के बाद)

+0

खोज की जाने वाली डेटा की प्रकृति के कारण (ऊपर संपादन 2 देखें) और जारी किए गए प्रश्नों का नमूना उपयोगकर्ता, अधिकांश प्रश्न LIKE क्वेरी पर वापस आ जाएंगे। –

+0

ठीक है, तो नए खोजशब्द के साथ हर खोज को कैशिंग करने के बारे में क्या? मुझे लगता है, बाकी के मुकाबले 5% कीवर्ड अधिक बार इस्तेमाल किए जाएंगे। इस प्रकार परिणाम कैशिंग संसाधनों को फिर से मदद कर सकता है। – dusoft

1

आपके प्रश्न का सटीक उत्तर right here है चाहे यह आपके डेटा के आकार के लिए पर्याप्त रूप से अच्छा प्रदर्शन करेगा, एक और सवाल है।

+0

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

+0

धन्यवाद, वास्तव में एक पूर्णांक पढ़ने वाला। हालांकि, हालांकि मैं इन सिद्धांतों में गहराई से गुजरना चाहता हूं, मेरे पास यह विकसित करने के लिए आवश्यक समय नहीं है - कॉर्पोरेट परियोजनाओं की आम समस्या ... :( तो मुझे बस कुछ हद तक तैयार होना है -12-लाइब्रेरी लाइब्रेरी जो मैं विकसित कर सकता हूं। –

2

शिंगल खोज चाल कर सकती है।

http://en.wikipedia.org/wiki/W-shingling

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

ध्यान दें कि 3-वर्ण शिंगल में कम से कम 5 वर्ण लंबे होने के लिए क्वेरी में खंड की आवश्यकता होती है, 4-चार शिंगल को 7-चार क्वेरी की आवश्यकता होती है और इसी तरह।

0

एक शब्द के हिस्सों का उपयोग करके एक "असली" पूर्ण पाठ अनुक्रमणिका स्रोत टेक्स्ट से कई गुना अधिक होगी और जब खोज तेज हो सकती है तो कोई अपडेट या सम्मिलन प्रसंस्करण बहुत धीमी गति से धीमा हो जाएगा।

आप केवल उम्मीद करते हैं कि "गलतियों" के लिए कुछ प्रकार का पैटर्न है। आप आने वाले पाठ में "एआई" प्रकार के नियमों का एक सेट लागू कर सकते हैं और पाठ के तोपैनिक रूप का उत्पादन कर सकते हैं जिसे आप लागू कर सकते हैं पूर्ण पाठ अनुक्रमणिका। नियम के लिए एक उदाहरण हैमर में समाप्त होने वाले शब्द को दो शब्दों में विभाजित करना (/ w?) (हथौड़ा)/\ 1 \ 2/g या "स्लेज" "स्लेज" और " schledge "to" sledge "। आपको क्वेरी टेक्स्ट पर नियमों का एक ही सेट लागू करने की आवश्यकता होगी। जिस तरह से" स्लेजहैमर "के रूप में वर्णित उत्पाद को 'स्लेजड हैमर' के लिए खोज से मेल किया जा सकता है।

+0

धन्यवाद। हम पहले से ही डेटाबेस प्रविष्टियों के साथ समस्याओं को कम करने के लिए कर रहे हैं जिन्हें कभी-कभी "डबेल" और "ड्यूबेल" के रूप में सूचीबद्ध किया जाता है जो दोनों वैध हैं, लेकिन एक ही खोज शब्द के साथ नहीं मिल सकते आम तौर पर। इसलिए हमारे पास पहले से ही एक "सामान्यीकृत" कॉलम है जहां सभी प्रकार के पैटर्न बदल दिए जाते हैं, लोअरकेड इत्यादि। फिर खोज पैटर्न के लिए जाता है। सबस्ट्रिंग प्रश्नों की क्षमता को हल नहीं करता है। –

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