2010-04-28 32 views
9

मैं डेटाबेस तालिका से कुछ फ़ील्ड इंडेक्स करने के लिए Lucene.Net 2.0 का उपयोग कर रहा हूं। खेतों में से एक एक 'नाम' फ़ील्ड है जो विशेष पात्रों की अनुमति देता है। जब मैं कोई खोज करता हूं, तो मुझे ऐसा दस्तावेज़ नहीं मिलता है जिसमें विशेष वर्ण वाले शब्द होते हैं।लुसीन और विशेष वर्ण

मैं सूचकांक मेरी क्षेत्र जैसे:

Directory DALDirectory = FSDirectory.GetDirectory(@"C:\Indexes\Name", false); 
Analyzer analyzer = new StandardAnalyzer(); 
IndexWriter indexWriter = new IndexWriter(DALDirectory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); 

Document doc = new Document(); 
doc.Add(new Field("Name", "Test (Test)", Field.Store.YES, Field.Index.TOKENIZED)); 
indexWriter.AddDocument(doc); 

indexWriter.Optimize(); 
indexWriter.Close(); 

और मैं निम्न कार्य खोज:

value = value.Trim().ToLower(); 
value = QueryParser.Escape(value); 

Query searchQuery = new TermQuery(new Term(field, value)); 
Searcher searcher = new IndexSearcher(DALDirectory); 

TopDocCollector collector = new TopDocCollector(searcher.MaxDoc()); 
searcher.Search(searchQuery, collector); 
ScoreDoc[] hits = collector.TopDocs().scoreDocs; 

अगर मैं 'टेस्ट' के रूप में 'नाम' और मूल्य के रूप में क्षेत्र के लिए एक खोज करते हैं, यह दस्तावेज़ पाता है। यदि मैं 'नाम' और 'टेस्ट (टेस्ट)' के रूप में एक ही खोज करता हूं, तो उसे दस्तावेज़ नहीं मिलता है।

और भी अजीब, अगर मैं QueryParser को हटा देता हूं। ऐस्केप लाइन एक GUID (जो, ज़ाहिर है, इसमें हाइफ़न होते हैं) की खोज होती है, यह दस्तावेजों को पाता है जहां GUID मान मेल खाता है, लेकिन मूल्य के साथ समान खोज को ' टेस्ट (टेस्ट) 'अभी भी कोई परिणाम नहीं देता है।

मुझे यकीन है कि मैं क्या गलत कर रहा हूं। मैं विशेष वर्णों से बचने के लिए QueryParser.Escape विधि का उपयोग कर रहा हूं और क्षेत्र को संग्रहीत कर रहा हूं और Lucene.Net के उदाहरणों से खोज रहा हूं।

किसी भी विचार?

उत्तर

5

मानक विश्लेषक इंडेक्सिंग के दौरान विशेष पात्रों को बाहर निकाल देता है। आप स्पष्ट स्टॉपवर्ड की सूची में जा सकते हैं (जिन्हें आप चाहते हैं उन्हें छोड़कर)।

+0

क्या मुझे अपना लक्ष्य प्राप्त करने के लिए उपयोग करने के लिए एक और विश्लेषक पर विचार करना चाहिए? विशेष वर्णों वाले फ़ील्ड को संग्रहीत करते समय टोकनयुक्त के बीच टोकनयुक्त के बीच स्विच करने के बारे में क्या? – Brandon

+0

अच्छी तरह से यदि आप फ़ील्ड को टोकननाइज़ नहीं करते हैं तो आप उस पर "खोज" नहीं सकते हैं। आपके पास कुछ विकल्प हैं जो आपके स्वयं के विश्लेषक लिखते हैं (बहुत सरल है) या मानक विश्लेषक को स्टॉप शब्दों की सूची पास करें। कुछ ऐसा: हैशटेबल htStopwords = नया हैशटेबल(); विश्लेषक विश्लेषक = नया मानक विश्लेषक (एचटीएसटॉपवर्ड); – Mikos

+0

आप StopAnalyzer या SimpleAnalyzer को भी देख सकते हैं ... वे मदद कर सकते हैं। समस्या यह है कि आप बहुत सारे शोर शब्द खत्म कर सकते हैं। लेकिन अगर यह कोई मुद्दा नहीं है .... – Mikos

3

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

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

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

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