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;

3 responses to “A-Z 0-9 custom sorting in Lucene

  1. The code is a good one.
    But since then a lot has changed.

    Now I’m trying to implement custom sorting and it doesn’t work with FieldComparatorSource on multiple shards (I’m actually using Solr and need to have sort order which is different from the natural one for field values).

Leave a Comment:

Your email address will not be published. Required fields are marked *