Hello everybody,

I have problem with a custom sorting in solr . This problem(incorrect sorting order) happened only when used 2 or more shards in solr configuration.

I did next:


Extends from TrieIntField just for override comparator

*public class OperatingStatusFieldType extends TrieIntField  {
    @Override
    public SortField getSortField(SchemaField field, boolean top) {
return new SortField(field.getName(),new OperatingStatusComparatorSource(), top);
    }
}
*

Custom comparator implementation



*public class OperatingStatusComparatorSource extends FieldComparatorSource {

    private static int counter = 0;

    @Override
public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed) throws IOException {

return new OperatingStatusComparator(numHits, fieldname, FieldCache.NUMERIC_UTILS_INT_PARSER, SolrSortConfiguration.getInstance().getOrderMapForField(SolrSortConfiguration.OPERATING_STATUS_SORT_PROPERTY));
    }

private static class OperatingStatusComparator extends FieldComparator {
        private final int[] values;
        private int[] currentReaderValues;
        private final String field;
        private FieldCache.IntParser parser;
        private int bottom;
        private Map<String, Integer> mapValues = null;

OperatingStatusComparator(int numHits, String field, FieldCache.Parser parser, Map<String, Integer> mapValues) {
            values = new int[numHits];
            this.field = field;
            this.parser = (FieldCache.IntParser) parser;
            this.mapValues = mapValues;
        }

        @Override
        public int compare(int slot1, int slot2) {

            final Integer vKey1 = values[slot1];
            final Integer vKey2 = values[slot2];
            final Integer val1 = mapValues.get(String.valueOf(vKey1));
            final Integer val2 = mapValues.get(String.valueOf(vKey2));
            System.out.println("vKey1=" + vKey1);
            System.out.println("vKey2=" + vKey2);
            System.out.println("val1=" + val1);
            System.out.println("val2=" + val2);
            counter++;
            System.out.println("counter = " + counter);
            if (val1 == null) {
                if (val2 == null) {
                    return 0;
                }
                return -1;
            } else if (val2 == null) {
                return 1;
            }

            return val1.compareTo(val2);
        }

        @Override
        public int compareBottom(int doc) {

            final int v2 = currentReaderValues[doc];
            if (bottom > v2) {
                return 1;
            } else if (bottom < v2) {
                return -1;
            } else {
                return 0;
            }
        }

        @Override
        public void copy(int slot, int doc) {
            values[slot] = currentReaderValues[doc];
        }

        @Override
public void setNextReader(IndexReader reader, int docBase) throws IOException { currentReaderValues = FieldCache.DEFAULT.getInts(reader, field, parser);
        }

        @Override
        public void setBottom(final int bottom) {
            this.bottom = values[bottom];
        }

        @Override
        public Comparable<?> value(int slot) {
            return Integer.valueOf(values[slot]);
        }
    }
}*

in shema.xml field defined as listed below:

*<fieldType name="operatingStatusTint" class="com.dnb.daas.solr.custom.sorting.OperatingStatusFieldType" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>*


Custom comparator copy-past from the Solr int comparator and just modified compare method.
*  @Override
        public int compare(int slot1, int slot2) {

            final Integer vKey1 = values[slot1];
            final Integer vKey2 = values[slot2];
            final Integer val1 = mapValues.get(String.valueOf(vKey1));
            final Integer val2 = mapValues.get(String.valueOf(vKey2));
            System.out.println("vKey1=" + vKey1);
            System.out.println("vKey2=" + vKey2);
            System.out.println("val1=" + val1);
            System.out.println("val2=" + val2);
            counter++;
            System.out.println("counter = " + counter);
            if (val1 == null) {
                if (val2 == null) {
                    return 0;
                }
                return -1;
            } else if (val2 == null) {
                return 1;
            }

            return val1.compareTo(val2);
        }*


May be somebody know why incorrect sorting order happened when solr configured with shards.







--
Best Regards,
Eugene Stherbin
Exadel Inc,

Reply via email to