2010-12-30 5 views
7

मुझे अपने खोजकर्ता वास्तव में अच्छी तरह से काम कर रहा है, हालांकि यह अप्रचलित परिणामों को वापस करने के लिए प्रवृत्त होता है। मेरी साइट नेरड डिनर की तरह है, जिससे अतीत में घटनाएं अप्रासंगिक हो जाती हैं। एक मेरी उदाहरण VB.NET में है, लेकिन मुझे परवाह नहीं है उदाहरण सी # में दिया जाता है, तोलुसेन.Net: मैं अपने खोज परिणामों में दिनांक फ़िल्टर कैसे जोड़ सकता हूं?

Public Function AddIndex(ByVal searchableEvent As [Event]) As Boolean Implements ILuceneService.AddIndex 

     Dim writer As New IndexWriter(luceneDirectory, New StandardAnalyzer(), False) 

     Dim doc As Document = New Document 

     doc.Add(New Field("id", searchableEvent.ID, Field.Store.YES, Field.Index.UN_TOKENIZED)) 
     doc.Add(New Field("fullText", FullTextBuilder(searchableEvent), Field.Store.YES, Field.Index.TOKENIZED)) 
     doc.Add(New Field("user", If(searchableEvent.User.UserName = Nothing, 
            "User" & searchableEvent.User.ID, 
            searchableEvent.User.UserName), 
           Field.Store.YES, 
           Field.Index.TOKENIZED)) 
     doc.Add(New Field("title", searchableEvent.Title, Field.Store.YES, Field.Index.TOKENIZED)) 
     doc.Add(New Field("location", searchableEvent.Location.Name, Field.Store.YES, Field.Index.TOKENIZED)) 
     doc.Add(New Field("date", searchableEvent.EventDate, Field.Store.YES, Field.Index.UN_TOKENIZED)) 

     writer.AddDocument(doc) 

     writer.Optimize() 
     writer.Close() 
     Return True 

    End Function 

सूचना मैं कैसे है ":

मैं इस समय इस
टिप्पणी की तरह का अनुक्रमण कर रहा हूँ तारीख "इंडेक्स जो घटना की तारीख को संग्रहीत करता है।

मेरे खोज तो यह

''# code omitted 
     Dim reader As IndexReader = IndexReader.Open(luceneDirectory) 
     Dim searcher As IndexSearcher = New IndexSearcher(reader) 
     Dim parser As QueryParser = New QueryParser("fullText", New StandardAnalyzer()) 
     Dim query As Query = parser.Parse(q.ToLower) 

     ''# We're using 10,000 as the maximum number of results to return 
     ''# because I have a feeling that we'll never reach that full amount 
     ''# anyways. And if we do, who in their right mind is going to page 
     ''# through all of the results? 
     Dim topDocs As TopDocs = searcher.Search(query, Nothing, 10000) 
     Dim doc As Document = Nothing 

     ''# loop through the topDocs and grab the appropriate 10 results based 
     ''# on the submitted page number 
     While i <= last AndAlso i < topDocs.totalHits 
       doc = searcher.Doc(topDocs.scoreDocs(i).doc) 
       IDList.Add(doc.[Get]("id")) 
       i += 1 
     End While 
''# code omitted 

मैं निम्नलिखित की कोशिश किया था की तरह लग रहा है, लेकिन यह कोई लाभ नहीं हुआ था (एक NullReferenceException फेंक दिया)।

 While i <= last AndAlso i < topDocs.totalHits 
      If Date.Parse(doc.[Get]("date")) >= Date.Today Then 
       doc = searcher.Doc(topDocs.scoreDocs(i).doc) 
       IDList.Add(doc.[Get]("id")) 
       i += 1 
      End If 
     End While 

मैं भी निम्नलिखित दस्तावेज़ में पाया है, लेकिन मैं आप एक BooleanQuery के साथ कई प्रश्नों को जोड़ सकते हैं यह
http://lucene.apache.org/java/1_4_3/api/org/apache/lucene/search/DateFilter.html

+0

ठीक है, मैंने सोचा कि आपने एमवीसी वापस जोड़ा है। तो आयरनपीथन या आयरनआरबी उदाहरण के साथ आपका ठीक है? ;) – jfar

+0

:-p [ओह जो इसे पूरी तरह से धक्का दे रहा है] –

उत्तर

9

आप Lucene 1.4.3 के API दस्तावेज़ लिंक कर रहे हैं । Lucene.Net वर्तमान में 2.9.2 पर है। मुझे लगता है कि एक अपग्रेड देय है।

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

var dateValue = DateTools.DateToString(searchableEvent.EventDate, DateTools.Resolution.MILLISECOND); 
doc.Add(new Field("date", dateValue, Field.Store.YES, Field.Index.NOT_ANALYZED)); 

फिर आप अपनी खोज में एक फ़िल्टर लागू करते हैं (दूसरा पैरामीटर, जहां आप वर्तमान में कुछ भी नहीं/शून्य में जाते हैं)।

var dateValue = DateTools.DateToString(DateTime.Now, DateTools.Resolution.MILLISECOND); 
var filter = FieldCacheRangeFilter.NewStringRange("date", 
       lowerVal: dateValue, includeLower: true, 
       upperVal: null, includeUpper: false); 
var topDocs = searcher.Search(query, filter, 10000); 

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

+0

उदाहरण केवल Google खोज करने के लिए मिला था। मैं Lucene.Net v2.4.0.2 –

+0

का उपयोग कर रहा हूं, मैं चाहता हूं कि उपयोगकर्ता 'date: dd/mm/yyyy' के माध्यम से खोज सके, यह अभी भी काम करेगा? –

+0

जादुई Changes.txt में एक त्वरित खोज दिखाती है कि 2.4।0 2008-10-06 को जारी किया गया था, और बग फिक्स और नई सुविधाओं की एक लंबी सूची में लाइन 1100 के बाद है। मुझे लगता है कि एक नया इंडेक्स प्रारूप है (जिसे आप स्वचालित रूप से अपग्रेड कर देंगे, लेकिन पुराने संस्करण पढ़ना जारी नहीं रख सकते हैं), लेकिन फिर भी, आपको अपग्रेड पर विचार करना चाहिए। – sisve

7

के प्रमुखों या पूंछ नहीं कर सकता। चूंकि लुसीन केवल टेक्स्ट नोट की खोज करता है कि आपकी अनुक्रमणिका में दिनांक फ़ील्ड को तिथि के कम से कम महत्वपूर्ण भाग के लिए सबसे महत्वपूर्ण द्वारा आदेश दिया जाना चाहिए, यानी आईएस 8601 प्रारूप ("2010-11-02T20: 49: 16.000000 + 00: 00")

उदाहरण:

Lucene.Net.Index.Term searchTerm = new Lucene.Net.Index.Term("fullText", searchTerms); 
Lucene.Net.Index.Term dateRange = new Lucene.Net.Index.Term("date", "2010*"); 

Lucene.Net.Search.Query termQuery = new Lucene.Net.Search.TermQuery(searchTerm); 
Lucene.Net.Search.Query dateRangeQuery = new Lucene.Net.Search.WildcardQuery(dateRange); 

Lucene.Net.Search.BooleanQuery query = new Lucene.Net.Search.BooleanQuery(); 
query.Add(termQuery, BooleanClause.Occur.MUST); 
query.Add(dateRangeQuery, BooleanClause.Occur.MUST); 

वैकल्पिक रूप से अगर एक वाइल्डकार्ड काफी सटीक नहीं है आप जोड़ सकते हैं एक RangeQuery बजाय:

Lucene.Net.Search.Query termQuery = new Lucene.Net.Search.TermQuery(searchTerm); 
Lucene.Net.Index.Term date1 = new Lucene.Net.Index.Term("date", "2010-11-02*"); 
Lucene.Net.Index.Term date2 = new Lucene.Net.Index.Term("date", "2010-11-03*"); 
Lucene.Net.Search.Query dateRangeQuery = new Lucene.Net.Search.RangeQuery(date1, date2, true); 

Lucene.Net.Search.BooleanQuery query = new Lucene.Net.Search.BooleanQuery(); 
query.Add(termQuery, BooleanClause.Occur.MUST); 
query.Add(dateRangeQuery, BooleanClause.Occur.MUST); 
+0

ओह बकवास, मुझे कैसे पता लगाना है कि बुलियन खोज कैसे करें ;-) –

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

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