为了测试,我尝试使用库SolrNet将C#的Double.MIN(-1.79769313486232E + 308)和Double.Max(1.79769313486232E + 308)值写入Solr TrieDoubleField。两个double值都通过XML发送到Solr服务器,后者输出以下日志:
2018-06-06 13:27:46.840 DEBUG(qtp33524623-14)[x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field' d_DoubleMin'字符串值' -1.79769313486232E + 308'是不可变的,所以没有任何值会被改变 2018-06-06 13:27:46.840 DEBUG(qtp33524623-14)[x:Test] o.a.s.u.p.ParseDoubleFieldUpdateProcessorFactory value' 1.79769313486232E + 308'是不可解析的,因此不会发生变异;未解析的字符:' E + 308' 2018-06-06 13:27:46.840 DEBUG(qtp33524623-14)[x:Test] o.a.s.u.p.AllValuesOrNoneFieldMutatingUpdateProcessor field' d_DoubleMax'字符串值' 1.79769313486232E + 308'是不可变的,所以没有值会被突变
Solrnet使用科学记数法传递这些双重值,但Solr似乎无法解析它。当我检查添加的Solr文档的内容时,两个值都设置为' -infinity'和'无限'分别。
然而,当我写NaN时,' -infinity'和'无限'到Solr,所有值都按预期存储。
我还检查了C#和Solr的Double规范,它们似乎不一样:
是SolrNet的错误还是我错过了什么?
答案 0 :(得分:0)
为了解决这个问题,我实现了一个自己的DoubleFieldSerializer(派生自SolrNets AbstractFieldSerializer)。我的DoubleFieldSerializer改为在Parse函数中调用obj.ToString(“R”)。我为Float值做了同样的事。
我的解决方案的一个缺点是我需要覆盖DefaultFieldSerializer才能注册我的FieldSerializers(类似于Dans solution)。
我也把这个问题发给了Github。所以也许它将来会被修复:https://github.com/SolrNet/SolrNet/issues/422