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,