我想要实现的是一种检测存储值是数字(IntPoint
还是FloatPoint
)还是字符串(StringField
或TextField
)的方法。
例如: 我正在存储这个字段
doc.add(new IntPoint("Value", 4));
执行查询后,如果Value
字段类型为IntPoint
我正在使用这样的东西
IndexableField field = doc.getField("Value");
if (field != null)
System.out.println(field.fieldType());
返回stored
如果我使用field.fieldType().docValuesType()
,则会返回NONE
有没有办法实现这个目标?
答案 0 :(得分:2)
这似乎是卢克所做的,希望有所帮助
public static String fieldFlags(Field fld, FieldInfo info) {
...
Number numeric = null;
if (fld == null) {
...
} else {
...
numeric = fld.numericValue();
}
...
if (numeric != null) {
flags.append("#");
// try faking it
if (numeric instanceof Integer) {
flags.append("i32");
} else if (numeric instanceof Long) {
flags.append("i64");
} else if (numeric instanceof Float) {
flags.append("f32");
} else if (numeric instanceof Double) {
flags.append("f64");
} else if (numeric instanceof Short) {
flags.append("i16");
} else if (numeric instanceof Byte) {
flags.append("i08");
} else if (numeric instanceof BigDecimal) {
flags.append("b^d");
} else if (numeric instanceof BigInteger) {
flags.append("b^i");
} else {
flags.append("???");
}
...
}
答案 1 :(得分:1)
首先,这里是关于IntPoint
字段
快速范围过滤器的索引字段。如果你还需要存储 值,您应该添加一个单独的StoredField实例。
这基本上意味着,我不确定,你是如何做到这一点的:
IndexableField field = doc.getField("Value");
它应该返回null
而不是字段。
此外,适用于所有字段 - 如果您在Lucene返回的文档上操作 - 它将只包含再次存储的字段。
对于存储的字段,您可以通过执行以下操作轻松获取其类型:
((StoredField) text).fieldsData
将准确返回存储在那里的内容 - Float或String或Double。
另一种可能性是调用一组方法stringValue, binaryValue, readerValue, numericValue
,它会返回String
,ByteRef
,Reader
或Number
或null,如果它&# 39;例如,不是数字。