2013-07-06 14 views
6

Non so come indicizzare e cercare il Registred_Date (contiene il formato sql in formato datetime). Devo effettuare la ricerca tra anni o giorni. Dove sto usando la query booleana per la ricerca. Il codice qui sotto è usato per il campo numerico e indicizzazione di campo ordinaria.Come indicizzare e cercare il campo Data/ora 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

controllo questo: [Lucene.Net: Come posso aggiungere un filtro data per i miei risultati della ricerca?] (Http: // StackOverflow .com/questions/4565303/lucene-net-how-can-i-add-a-date-filter-to-my-search-results? answertab = voti # tab-top) –

risposta

7

Grazie a @Thomas C. G. de Vilhena e Mihai Soloi. Ho trovato la soluzione con il tuo aiuto.

Per l'indicizzazione:

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

Per la ricerca:

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

perché non utilizzare la SECONDA risoluzione sul indicizzazione? puoi avere più registrazioni nello stesso giorno che presumo mentre stai filtrando sulla risoluzione di MILLISECOND; entrambe le risoluzioni dovrebbero essere le stesse imho –

+0

Non l'ho notato, grazie @Mihai Soloi che mi ha salvato il tempo. –

1

Se si desidera memorizzare l'indice come una stringa di serie, per esempio se si trasformerebbe da 2013-07-05 20:00:00 in 20130705200000 è possibile utilizzare il Lucene RangeQuery per cercare sopra le gamme.

Spiacente, non ho fornito alcun codice di esempio, ma non ho familiarità con l'API .NET.