lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Theodan <>
Subject Sorting with custom SortComparator
Date Wed, 25 Apr 2007 23:27:40 GMT


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()),
		hits.recordHits(, 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
			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, as has been discussed before on this mailing list.

Any help would be greatly appreciated.

View this message in context:
Sent from the Lucene - Java Users mailing list archive at

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message