Solr TrieFloat和SortableFloatField,最适合浮点数排序

时间:2012-10-25 14:32:35

标签: sorting solr floating-point

我有一个Solr架构,其中一个字段被声明为TrieFloatField:

    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>

(...)

    <field
                name="someField"
                type="tfloat"
                indexed="true"
                stored="false"
                multiValued="false" />

如果我用它来对结果进行排序:

solrQuery.addSortField("someField", ORDER.asc);
solrQuery.addSortField("score", ORDER.desc);

浮点数不按正确的数字顺序返回,即:我得到的结果如下:

0.31 0.67 0.80 15.13 0.09 15.13 0.04

更奇怪的是,当我使用此字段对结果进行排序时,会发生一些排序(它们的顺序不同,如果,假设我根本不使用任何排序字段)。此外,即使我将排序顺序从asc更改为desc,结果也是相同的顺序。

我认为TrieFloat类型适用于此。但是我现在在文档中看到他们只提到它是“浮点字段可访问的Lucene TrieRange处理”:

http://lucene.apache.org/solr/api-4_0_0-ALPHA/org/apache/solr/schema/TrieFloatField.html

我真的不知道这意味着什么。我还看到有一个SortableFloatField:

http://www.jarvana.com/jarvana/view/org/apache/solr/solr-core/3.5.0/solr-core-3.5.0-javadoc.jar!/org/apache/solr/schema/SortableFloatField.html

但是,当用作排序标准时,文档并没有真正说明它的行为。

我的问题很简单:这两种类型中的哪一种(或其他类型)适合存储浮点数,以便它们可用于Solr查询中的正确(自然)升序和降序排序

1 个答案:

答案 0 :(得分:2)

这两个类都应该可以工作,但是TrieFloatField将比SortableDoubleField需要更少的内存(假设前者使用浮点字段缓存,而后者使用字符串字段缓存)。请注意,如果您不需要执行范围查询,则应设置precisionStep=0

然而你遇到的错误很奇怪......