如何在Lucene中存储SHORT类型的NumericField

时间:2014-05-20 01:23:34

标签: java solr lucene elasticsearch

我正在使用Lucene 3.5.0 我在FLOAT类型上使用FieldScoreQuery开发了一个CustomScoreQuery,它运行得很好。

我实际上并不需要浮点数的精度,我所拥有的是介于-1和1之间的数字,而我精确到0.001精度,所以我只需要表示2000个值。我想使用SHORT类型的FieldScoreQuery。来自FieldScoreQuery.Type

的javadoc
    BYTE consumes 1 * maxDocs bytes.
    SHORT consumes 2 * maxDocs bytes.
    INT consumes 4 * maxDocs bytes.
    FLOAT consumes 8 * maxDocs bytes.

所以我试过了:

new FieldScoreQuery(FIELD_MY_RANK, FieldScoreQuery.Type.SHORT));

如果我使FIELD_MY_RANK成为整数类型的NumericField,它会在查询时中断。

NumericField rankFieldShort = new NumericField(
FIELD_RANK,
Field.Store.NO,
true).setIntValue( to_short(myRank) );

如果我使用FieldScoreQuery.Type.INT,它可以正常工作,但在这种情况下,我仍然使用4个字节而不是2个。

我还尝试使用字节字段,使用2个字节来表示我的Short int。在这种情况下,我总是从CustomScoreQuery中的索引返回0。

Field rankFieldShortBytes = new Field(
RANK, to_bytes(myRank) );

所以问题是,我需要创建哪种字段才能使用FieldScoreQuery.Type.SHORT

1 个答案:

答案 0 :(得分:0)

当它被添加为NumericField时,似乎Lucene无法从字段FIELD_MY_RANK反序列化短值。请尝试以下代码:

Field rankFieldShort = new Field(FIELD_MY_RANK, Short.toString((short) myRank), Field.Store.NO, Field.Index.ANALYZED_NO_NORMS);