Lucene - 将日期排序为NumericField

时间:2016-03-30 15:21:53

标签: string lucene lucene.net numeric

在尝试对datetime(long)数字字段进行排序时,我总是得到一个FormatException。

  

将字符串转换为DateTime时,解析字符串以获取   将每个变量放入DateTime对象之前的日期。

添加数字字段:

doc.Add(new NumericField("creationDate",  Field.Store.YES, true)
   .SetLongValue(DateTime.UtcNow.Ticks);

添加排序:

// boolean query    
var sortField = new SortField("creationDate", SortField.LONG, true);
var inverseSort = new Sort(sortField);
var results = searcher.Search(query, null, 100, inverseSort); // exception thrown here

检查索引,我可以验证' creationDate'字段存储"长"值。可能导致此异常的原因是什么?

编辑:

查询

var query = new BooleanQuery();
foreach (var termQuery in incomingProps.Select(p => new TermQuery(new Term(kvp.Key, kvp.Value.ToLowerInvariant()))
{
  query.Add(new BooleanClause(termQuery , Occur.Must));
}

return query;

版本:Lucene.Net 3.0.3

更新:

此问题再次发生,现在使用INT值。 我下载了Lucene.Net源代码并调试了该问题。

所以它在FieldCache中的某个地方,当试图解析值"`\ b \ 0 \ 0 \ 0"到整数,这似乎有点奇怪。

FieldCacheException

我将这些值添加为数字字段:

doc.Add(new NumericField(VersionNum, int.MaxValue, Field.Store.YES, 
true).SetIntValue(VersionValue));

当我应该至少获得1次回击时,我得到了例外。 检查索引后,我看到该字段的术语如下:

Version Term

现场文字是:

enter image description here

编辑:

我已经硬编码了一个int值并添加了几个段:

doc.Add(new Field(VersionNum, NumericUtils.IntToPrefixCoded(1), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));

导致将版本字段存储为: enter image description here

然而,当我尝试排序时,我得到了解析错误:

var sortVersion = new SortField(VersionNum, SortField.INT, true);

对于每一个例外,Lucene都试图解析" \ b \ 0 \ 0 \ 0"。 查看存储为字符串的前缀编码,1将转换为" \ b \ 0 \ 0 \ 0 \ 1"我在猜?

Lucene可能会在FieldCache中留下一些垃圾吗?

1 个答案:

答案 0 :(得分:1)

这是一个单元测试,试图捕捉你所要求的内容。测试通过。你能解释一下你的代码有什么不同吗? (发布完整的失败测试将有助于我们了解您正在做什么:-))

ng-model