Solr - 无法解析 double 的科学记数法
Solr - Scientific notation of double cannot be parsed
为了测试,我尝试使用库 SolrNet 将 C# 的 Double.MIN (-1.79769313486232E+308) 和 Double.Max (1.79769313486232E+308) 值写入 Solr TrieDoubleField。两个双精度值都通过 XML 发送到输出以下日志的 Solr 服务器:
2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field 'd_DoubleMin' String value '-1.79769313486232E+308' is not mutable, so no values will be mutated
2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.ParseDoubleFieldUpdateProcessorFactory value '1.79769313486232E+308' is not parseable, thus not mutated; unparsed chars: 'E+308'
2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field 'd_DoubleMax' String value '1.79769313486232E+308' is not mutable, so no values will be mutated
Solrnet使用科学计数法来传递这些double值,但Solr似乎无法解析它。当我检查添加的 Solr 文档的内容时,两个值分别设置为 '-infinity' 和 'infinity'。
但是,当我将 NaN、'-infinity' 和 'infinity' 写入 Solr 时,所有值都按预期存储。
我也查了C#和Solr的Double规范,好像不太一样:
- Solr: https://lucene.apache.org/solr/4_6_0/solr-core/org/apache/solr/schema/TrieDoubleField.html
- C#: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/double
是 SolrNet 的错误还是我遗漏了什么?
为了解决这个问题,我实现了自己的DoubleFieldSerializer(派生自SolrNets AbstractFieldSerializer)。我的 DoubleFieldSerializer 在 Parse 函数中调用 obj.ToString("R") 。我对 Float 值做了同样的事情。
我的解决方案的一个缺点是我需要重写 DefaultFieldSerializer 才能注册我的 FieldSerializer(类似于 Dans solution)。
我也已将此问题发布到 Github。所以也许它会在未来得到修复:https://github.com/SolrNet/SolrNet/issues/422
为了测试,我尝试使用库 SolrNet 将 C# 的 Double.MIN (-1.79769313486232E+308) 和 Double.Max (1.79769313486232E+308) 值写入 Solr TrieDoubleField。两个双精度值都通过 XML 发送到输出以下日志的 Solr 服务器:
2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field 'd_DoubleMin' String value '-1.79769313486232E+308' is not mutable, so no values will be mutated 2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.ParseDoubleFieldUpdateProcessorFactory value '1.79769313486232E+308' is not parseable, thus not mutated; unparsed chars: 'E+308' 2018-06-06 13:27:46.840 DEBUG (qtp33524623-14) [ x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field 'd_DoubleMax' String value '1.79769313486232E+308' is not mutable, so no values will be mutated
Solrnet使用科学计数法来传递这些double值,但Solr似乎无法解析它。当我检查添加的 Solr 文档的内容时,两个值分别设置为 '-infinity' 和 'infinity'。
但是,当我将 NaN、'-infinity' 和 'infinity' 写入 Solr 时,所有值都按预期存储。
我也查了C#和Solr的Double规范,好像不太一样:
- Solr: https://lucene.apache.org/solr/4_6_0/solr-core/org/apache/solr/schema/TrieDoubleField.html
- C#: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/double
是 SolrNet 的错误还是我遗漏了什么?
为了解决这个问题,我实现了自己的DoubleFieldSerializer(派生自SolrNets AbstractFieldSerializer)。我的 DoubleFieldSerializer 在 Parse 函数中调用 obj.ToString("R") 。我对 Float 值做了同样的事情。
我的解决方案的一个缺点是我需要重写 DefaultFieldSerializer 才能注册我的 FieldSerializer(类似于 Dans solution)。
我也已将此问题发布到 Github。所以也许它会在未来得到修复:https://github.com/SolrNet/SolrNet/issues/422