我有一个事件发生在多个日期(例如,接下来的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
答案 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。