2013-07-06 14 views
6

Nie wiem jak indeksować i przeszukiwać Registred_Date (Zawiera datetime formatu sql). Muszę szukać między latami lub dniami. Gdzie używam zapytania boolowskiego dla wyszukiwania. Poniższy kod jest używany do pola liczbowego i zwykłe indeksowanie pól.Jak indeksować i przeszukiwać pole Datetime w Lucene.NET?

 IndexWriter indexWriter = new IndexWriter(dir, new StandardAnalyzer(),Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); 
     DataSet ds = new DataSet(); 
     //ds contains table 
     if (ds.Tables[0] != null) 
     { 
      DataTable dt = ds.Tables[0]; 
      if (dt.Rows.Count > 0) 
      { 
       foreach (DataRow dr in dt.Rows) 
       { 
        //Create the Document object 
        Document doc = new Document(); 

        foreach (DataColumn dc in dt.Columns) 
        { 
         string check = dc.ToString(); 
         if (check.Equals("Experience")) 
         { 
          int n=Convert.ToInt32(dr[dc.ColumnName]); 
          NumericField numericField = new NumericField(dc.ColumnName, Field.Store.YES, true); 
          numericField.SetIntValue(n); 
          doc.Add(numericField); 
         } 
         else if(check.Equals("Registred_Date")) 
         { 

         } 
         else 
         { 
          doc.Add(new Field(dc.ColumnName, dr[dc.ColumnName].ToString(), Field.Store.YES, Field.Index.ANALYZED)); 
         } 
         //Populate the document with the column name and value from our query 
        } 
        // Write the Document to the catalog 
        indexWriter.AddDocument(doc); 
       } 
      } 
     } 
     // Close the writer 
     indexWriter.Close(); 
+1

sprawdzić w ten sposób: [Lucene.Net: Jak mogę dodać filtr datę moich wynikach wyszukiwania?] (Http: // stackoverflow .pl/pytania/4565303/lucene-net-how-can-i-dodaj-a-filtr daty do moich wyników wyszukiwania? answerertab = głosów # tab-top) –

Odpowiedz

7

Dzięki @Thomas C. G. de Vilhena i Mihai Soloi. Znalazłem rozwiązanie z twoją pomocą.

do indeksowania:

DateTime d1 = Convert.ToDateTime(dr[dc.ColumnName]); 
doc.Add(new Field("Registered_Date", DateTools.DateToString(d1, DateTools.Resolution.SECOND), Field.Store.YES, Field.Index.ANALYZED)); 

Do wyboru:

DateTime d1 = DateTime.Now.AddDays(-15); 
var dateValue = DateTools.DateToString(d1, DateTools.Resolution.MILLISECOND); 
var filter = FieldCacheRangeFilter.NewStringRange("Registered_Date",lowerVal: dateValue, includeLower: true,upperVal: null, includeUpper: false); 
+0

dlaczego nie użyć DRUGIEJ rezolucji w sprawie indeksowanie? możesz mieć wiele rejestracji w tym samym dniu, który zakładam, gdy filtrujesz rozdzielczość MILLISECOND; obie rezolucje powinny być takie same imo –

+0

Nie zauważyłem tego, dzięki @Mihai Soloi oszczędzając mój czas. –

1

Jeśli chcesz zapisać jako standardowy indeks łańcucha, na przykład, jeśli byłyby przekształcenia z 2013-07-05 20:00:00 do 20130705200000 można użyć Lucene RangeQuery przeszukiwać zakresach.

Niestety nie podałem żadnego przykładowego kodu, ale nie znam interfejsu API .NET.

Powiązane problemy