Hello,

In Lucene 6 I was doing this to get all values for a given field
knowing its type:

public List<Object> getDistinctValues(IndexReader reader, String fieldname,
Class<? extends Object> type) throws IOException {

    List<Object> values = new ArrayList<Object>();
    Fields fields = MultiFields.getFields(reader);
    if (fields == null) return values;

    Terms terms = fields.terms(fieldname);
    if (terms == null) return values;

    TermsEnum iterator = terms.iterator();

    BytesRef value = iterator.next();

    while (value != null) {
        if (type == Long.class) {
            values.add(LegacyNumericUtils.prefixCodedToLong(value));
        } else if (type == Integer.class) {
            values.add(LegacyNumericUtils.prefixCodedToInt(value));
        } else if (type == Boolean.class) {
            values.add(LegacyNumericUtils.prefixCodedToInt(value) == 1 ?
TRUE : FALSE);
        } else if (type == Date.class) {
            values.add(new
Date(LegacyNumericUtils.prefixCodedToLong(value)));
        } else if (type == String.class) {
            values.add(value.utf8ToString());
        } else {
            // ...
        }

        value = iterator.next();
    }

    return values;
}

I am trying to upgrade to lucene 9.
there were 2 changes over time:
- LegacyNumericUtils has been removed in favor of PointBase
- MultiFields.getFields() has been dropped, and I read we were encouraged
to avoid fields in general

what is proper way to implement getting distinct values for a specific
field in a reader?

thanks for your help,

vs

Reply via email to