【发布时间】:2016-07-18 17:03:37
【问题描述】:
在尝试对日期时间(长)数字字段进行排序时,我总是得到一个 FormatException。
将字符串转换为日期时间时,解析字符串以获取 将每个变量放入 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”解析为 Integer 时,这似乎有点奇怪。
我将这些值添加为数字字段:
doc.Add(new NumericField(VersionNum, int.MaxValue, Field.Store.YES,
true).SetIntValue(VersionValue));
当我应该得到至少 1 次回击时,我得到了例外。 检查索引后,我看到该字段的术语如下:
字段文本为:
编辑:
我硬编码了一个 int 值并添加了一些段:
doc.Add(new Field(VersionNum, NumericUtils.IntToPrefixCoded(1), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
而且,当我尝试排序时,我得到了解析错误:
var sortVersion = new SortField(VersionNum, SortField.INT, true);
对于每个异常,Lucene 都会尝试解析“ \b\0\0\0 ”。 查看存储为字符串的前缀编码,我猜 1 将转换为“ \b\0\0\0\1 ”?
Lucene 是否可能在 FieldCache 中留下一些垃圾?
【问题讨论】:
-
你能说明“查询”是如何创建的吗?
-
@AndyPook 刚刚编辑了问题并添加了“查询”。如果我按 DOC 排序,效果很好。
-
查询中不包含日期字段,仅用于排序。假设我只查询一个自定义字段 ID,该字段被授予返回一组结果。
-
你为什么使用 NumericUtils 而不是 NumericField?
-
我不是,只是尝试不同的选择。我使用的是 NumericField。
标签: string lucene lucene.net numeric