Hello. I am trying to sort my query results on a String field called "AssetType" and then on the relevancy score, but I need a particular ordering of the possible values in "AssetType" (i.e. first "Video", then "Article", etc.).
I have tried doing this with a custom SortComparator that returns Integers from getComparable(), as follows: =========================== public class LuceneIndexSearchCommand extends AbstractSearchCommand { protected boolean execute(SearchContext context) throws Exception { ... Hits hits = new Hits(); ... BooleanQuery keywordQuery = new BooleanQuery(); ... Query query = queryParser.parse(finalQuery); ConstantScoreRangeQuery constantScoreRangeQuery = new ConstantScoreRangeQuery("assettype", null, null, true, true); BooleanQuery booleanQuery = new BooleanQuery(); booleanQuery.add(query, Occur.MUST); booleanQuery.add(constantScoreRangeQuery, Occur.MUST); SortField[] sortFields = new SortField[] { new SortField("assettype", new AssetTypeSortComparator()), SortField.FIELD_SCORE }; hits.recordHits(searcher.search(booleanQuery, new Sort(sortFields))); ... } private static class AssetTypeSortComparator extends SortComparator { private static final Map ASSET_TYPE_ORDER_MAP = new HashMap(); private static final Integer DEFAULT_ORDER = new Integer(3); static { ASSET_TYPE_ORDER_MAP.put("Interactive".toLowerCase(), new Integer(0)); ASSET_TYPE_ORDER_MAP.put("Video".toLowerCase(), new Integer(0)); ASSET_TYPE_ORDER_MAP.put("EncyclopediaArticles".toLowerCase(), new Integer(1)); ASSET_TYPE_ORDER_MAP.put("Image".toLowerCase(), new Integer(2)); } protected Comparable getComparable(String termtext) { if (ASSET_TYPE_ORDER_MAP.containsKey(termtext.toLowerCase())) { return (Integer)ASSET_TYPE_ORDER_MAP.get(termtext.toLowerCase()); } else { return DEFAULT_ORDER; } } }; } =========================== but my Hits don't come back sorted. They seem to be in the same unsorted order as before I started trying to use the custom SortComparator. I have debugged through SortComparator and FieldCacheImpl, and the "cachedValues" array does seem to correctly contain Integer items corresponding to most of my 80,000+ docs. The rest of the items in the array are null, corresponding to those docs that are missing a value for the "AssetType" field. Also, FYI, I am using ConstantScoreRangeQuery because the "AssetType" field is sometimes missing from certain of the docs, and if I don't use ConstantScoreRangeQuery then I get NullPointerException on SortComparator.java:37, as has been discussed before on this mailing list. Any help would be greatly appreciated. -Theo -- View this message in context: http://www.nabble.com/Sorting-with-custom-SortComparator-tf3648692.html#a10191597 Sent from the Lucene - Java Users mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]