2013-07-06 36 views
6

Tôi không biết cách lập chỉ mục và Tìm kiếm trên Registred_Date (Nó có chứa định dạng sql datetime) .Tôi cần phải tìm kiếm giữa các năm hoặc days.where tôi đang sử dụng truy vấn boolean cho tìm kiếm. Mã dưới đây được sử dụng cho trường số và lập chỉ mục trường thông thường.Làm cách nào để Lập chỉ mục và tìm kiếm trường Ngày giờ trong 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

việc kiểm tra này: [Lucene.Net: Làm thế nào tôi có thể thêm một bộ lọc ngày để kết quả tìm kiếm của tôi?] (Http: // stackoverflow .com/question/4565303/lucene-net-how-can-i-add-a-date-lọc-to-my-tìm-kết quả như thế nào? answerertab = votes # tab-top) –

Trả lời

7

Cảm ơn @Thomas C. G. de Vilhena và Mihai Soloi. Tôi tìm thấy giải pháp với sự giúp đỡ của bạn.

Đối lập chỉ mục:

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

Để tìm kiếm:

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

tại sao không sử dụng độ phân giải SECOND trên lập chỉ mục? bạn có thể có nhiều đăng ký trong cùng một ngày tôi giả định khi bạn lọc qua độ phân giải MILLISECOND; cả hai nghị quyết phải giống nhau imho –

+0

Tôi không nhận thấy rằng, nhờ @Mihai Soloi tiết kiệm thời gian của tôi. –

1

Nếu bạn muốn lưu trữ chỉ số của bạn như là một chuỗi tiêu chuẩn, ví dụ nếu bạn muốn chuyển đổi từ 2013-07-05 20:00:00 vào 20130705200000 bạn có thể sử dụng Lucene RangeQuery tìm kiếm trên phạm vi.

Rất tiếc, tôi không cung cấp bất kỳ mã mẫu nào, nhưng tôi không quen với API .NET.

Các vấn đề liên quan