2013-07-06 2 views
6

Ich kann nicht registered_date indexieren und suchen (es enthält sql Format datetime) .Ich muss zwischen Jahren oder Tagen suchen. Wo ich boolean Abfrage für die Suche verwenden.Der Code unten wird für numerische Feld verwendet und normale Feldindexierung.Wie Indexe & Suche das Datetime-Feld in 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

Check this: [Lucene.Net: Wie kann ich ein Datum Filter zu meinen Suchergebnissen hinzufügen?] (Http: // Stackoverflow .com/questions/4565303/lucene-net-how-can-ich-add-a-date-filter-zu-meiner-suche-resultate? answertab = votes # tab-top) –

Antwort

7

Dank @Thomas C. G. de Vilhena und Mihai Soloi. Ich habe die Lösung mit Ihrer Hilfe gefunden.

Für die Indizierung:

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)); 

für die Suche:

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

warum nicht die ZWEITE Entschließung auf dem verwenden Indizierung? Sie können mehrere Anmeldungen am selben Tag haben, wie ich davon ausgehe, wenn Sie die Auflösung von MILLISEKUNDE filtern. beide Auflösungen sollten die gleichen sein Imho –

+0

Ich habe das nicht bemerkt, danke @Mihai Soloi spart meine Zeit. –

1

Wenn Sie Ihren Index als Standard-Zeichenfolge, zum Beispiel speichern würde, wenn Sie von 2013-07-05 20:00:00 in 20130705200000 verwandeln würden Sie die Lucene RangeQuery über die Bereiche suchen, verwenden können.

Entschuldigung, ich habe keinen Beispielcode angegeben, aber ich kenne die .NET API nicht.