Engineering Insights & Enterprise solutions
The natural sort order for String fields is 0-9 A-Z so it seems a custom sorter is needed. I guess this is a normal request for any application that does a little sorting so I am surprised nothing came up during a search. Here is the AZ09Comparator:
/**
* Custom Lucene sorting A-Z 0-9
*
* @author icocan
*/
public class AZ09Comparator implements SortComparatorSource {
private static final Logger logger = Logger.getLogger(AZ09Comparator.class);
public ScoreDocComparator newComparator(final IndexReader indexReader, final String str) throws IOException {
return new ScoreDocComparator() {
public int compare(ScoreDoc scoreDoc1, ScoreDoc scoreDoc2) {
try {
final Document doc1 = indexReader.document(scoreDoc1.doc);
final Document doc2 = indexReader.document(scoreDoc2.doc);
final String strVal1 = doc1.get(str);
final String strVal2 = doc2.get(str);
boolean c1 = Character.isDigit(strVal1.charAt(0));
boolean c2 = Character.isDigit(strVal2.charAt(0));
if (c1 && c2) {
return strVal1.compareTo(strVal2);
} else if (c1) {
return 1;
} else if (c2) {
return -1;
} else {
return strVal1.compareTo(strVal2);
}
} catch (IOException e) {
logger.error("Cannot read doc", e);
}
return 0;
}
public Comparable sortValue(ScoreDoc scoreDoc) {
return new Float(scoreDoc.doc);
}
public int sortType() {
return SortField.CUSTOM;
}
};
}
}