Lucene.Net:在同一文档中搜索多个日期/日期范围

时间:2012-05-17 16:33:39

标签: lucene.net lucene

我有一个事件发生在多个日期(例如,接下来的6个月每个月的第5个月)。如果用户在第4天搜索接下来45天的事件而不是他应该获得上述事件,但是对于6日未来7天的查询不应该返回上述事件。

我为事件创建了文档,并在同一文档中添加了多个日期。

var event1 = new Document();
event1.Add(new Field("Id", "2", Field.Store.YES, Field.Index.NOT_ANALYZED));
event1.Add(new Field("Name", "Ford", Field.Store.YES, Field.Index.ANALYZED));
event1.Add(new Field("Desc", "Focus", Field.Store.YES, Field.Index.ANALYZED));
event1.Add(new NumericField("Date", (int)new DateTime(2012, 6, 05).Subtract(dt).TotalMinutes, Field.Store.YES, true));
event1.Add(new NumericField("Date", (int)new DateTime(2012, 7, 05).Subtract(dt).TotalMinutes, Field.Store.YES, true));
event1.Add(new NumericField("Date", (int)new DateTime(2012, 8, 05).Subtract(dt).TotalMinutes, Field.Store.YES, true));

我的想法是,如果我搜索特定日期或日期范围,它应该有效。但是一旦我尝试编写这个文档,它就会抛出一个NullReferenceException。

 Directory directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndex"));
 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);

 var writer = new IndexWriter(directory, true, analyzer, true);
 writer.AddDocument(event1);

我不确定如何执行这些类型的搜索。

更新1: writer.AddDocument(事件1);导致空引用,

更新2:

at Lucene.Net.Store.IndexOutput.WriteString(String s)
at Lucene.Net.Index.FieldsWriter.WriteField(FieldInfo fi, Fieldable field)
at Lucene.Net.Index.StoredFieldsWriterPerThread.AddField(Fieldable field, FieldInfo fieldInfo)
at Lucene.Net.Index.DocFieldProcessorPerThread.ProcessDocument()
at Lucene.Net.Index.DocumentsWriter.UpdateDocument(Document doc, Analyzer analyzer, Term delTerm)
at Lucene.Net.Index.DocumentsWriter.AddDocument(Document doc, Analyzer analyzer)
at Lucene.Net.Index.IndexWriter.AddDocument(Document doc, Analyzer analyzer)
at Lucene.Net.Index.IndexWriter.AddDocument(Document doc)
at luceneSearch.Program.Main(String[] args) in 

1 个答案:

答案 0 :(得分:0)

NumericField constructor接受precisionStep,而不是实际值。正确的用法要求您调用SetIntValue(或任何其他set * Value方法)。

event1.Add(new NumericField("Date", Field.Store.YES, true)
             .SetIntValue((int)new DateTime(2012, 6, 05).Subtract(dt).TotalMinutes));
event1.Add(new NumericField("Date", Field.Store.YES, true)
             .SetIntValue((int)new DateTime(2012, 7, 05).Subtract(dt).TotalMinutes));
event1.Add(new NumericField("Date", Field.Store.YES, true)
             .SetIntValue((int)new DateTime(2012, 8, 05).Subtract(dt).TotalMinutes));

发生异常是因为如果没有设置值,NumericField.StringValue()将返回null。