Получить тип поля в Apache Lucene - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь добиться того, чтобы определить, является ли сохраненное значение числовым (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

Есть ли способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Похоже, именно это делает Люк, надеюсь, это поможет

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

Ссылка на код Люка

0 голосов
/ 22 мая 2018

Прежде всего, вот замечание о IntPoint поле

Индексированное поле для фильтров быстрого диапазона. Если вам также нужно хранить значение, вы должны добавить отдельный экземпляр StoredField.

что в основном означает, я не уверен, как у вас это работает:

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

он должен вернуть вам null вместо поля. Также применимо ко всем полям - если вы работаете с Документом, возвращенным вам Lucene, - он будет содержать только те поля, которые сохранены еще раз.

Для сохраненных полей вы можете легко получить их тип, выполнив что-то вроде этого:

((StoredField) text).fieldsData

, который вернул бы именно то, что там хранится - Float или String или Double.

Другая возможность - вызвать набор методов stringValue, binaryValue, readerValue, numericValue, который вернет вам String, ByteRef, Reader или Number или ноль, например, если это не число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...