获取Apache Lucene中的字段类型

时间:2018-05-17 23:35:53

标签: java lucene

我想要实现的是一种检测存储值是数字(IntPoint还是FloatPoint)还是字符串(StringFieldTextField)的方法。

例如: 我正在存储这个字段

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

有没有办法实现这个目标?

2 个答案:

答案 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("???");
      }
      ...
    }

Link to luke code

答案 1 :(得分:1)

首先,这里是关于IntPoint字段

的评论
  

快速范围过滤器的索引字段。如果你还需要存储   值,您应该添加一个单独的StoredField实例。

这基本上意味着,我不确定,你是如何做到这一点的:

IndexableField field = doc.getField("Value");

它应该返回null而不是字段。 此外,适用于所有字段 - 如果您在Lucene返回的文档上操作 - 它将只包含再次存储的字段。

对于存储的字段,您可以通过执行以下操作轻松获取其类型:

((StoredField) text).fieldsData

将准确返回存储在那里的内容 - Float或String或Double。

另一种可能性是调用一组方法stringValue, binaryValue, readerValue, numericValue,它会返回StringByteRefReaderNumber或null,如果它&# 39;例如,不是数字。