我正在使用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 ?
答案 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);