0

我有一个事件发生在多个日期(例如接下来的 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(event1); 导致空引用,

更新 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 
4

1 回答 1

0

NumericField构造函数接受一个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。

于 2012-05-24T20:46:08.347 回答