2016-06-21 86 views
3

如何使用不區分大小寫模式的多字段排序進行搜索?lucene案例不敏感排序搜索

我使用Lucene 4.10.4版本,並與multifiled排序做排序爲

SortField[] sortFiled = new SortField[2]; 
sortFiled[0] = new SortField("name", SortField.Type.STRING); 
sortFiled[1] = new SortField("country", SortField.Type.STRING); 

TopDocs topDocs = indexSearcher.search(query, 10 , new Sort(sortFiled)); 

它給排序結果,但在區分大小寫模式。我希望它在不區分大小寫的模式下排序。

回答

2
SortField[] sortFiled = new SortField[2]; 
sortFiled[0] = new SortField("name", SortField.Type.STRING); 
sortFiled[1] = new SortField("country", CaseInsensitiveStringComparator()); 

在SortField中使用custome filedCompartorSource作爲sortfield類型。 在上面的代碼中,我們在不區分大小寫的模式下對country字段進行排序。 看到下面的自定義FieldComparatorSource類

class CaseInsensitiveStringComparator extends FieldComparatorSource{ 

@Override 
public FieldComparator<String> newComparator(String arg0, int arg1, int arg2, 
     boolean arg3) throws IOException { 
    return new CaseIgonreCompare(arg0, arg1); 
} 
} 



class CaseIgonreCompare extends FieldComparator<String>{ 

private String field; 
private String bottom; 
private String topValue; 
private BinaryDocValues cache; 
private String[] values; 

public CaseIgonreCompare(String field, int numHits) { 
    this.field = field; 
    this.values = new String[numHits]; 
} 

@Override 
public int compare(int arg0, int arg1) { 
    return compareValues(values[arg0], values[arg1]); 
} 

@Override 
public int compareBottom(int arg0) throws IOException { 
    return compareValues(bottom, cache.get(arg0).utf8ToString()); 
} 

@Override 
public int compareTop(int arg0) throws IOException { 
    return compareValues(topValue, cache.get(arg0).utf8ToString()); 
} 

public int compareValues(String first, String second) { 
    int val = first.length() - second.length(); 
    return val == 0 ? first.compareToIgnoreCase(second) : val; 
}; 

@Override 
public void copy(int arg0, int arg1) throws IOException { 
    values[arg0] = cache.get(arg1).utf8ToString(); 
} 

@Override 
public void setBottom(int arg0) { 
    this.bottom = values[arg0]; 
} 

@Override 
public FieldComparator<String> setNextReader(AtomicReaderContext arg0) 
     throws IOException { 
    this.cache = FieldCache.DEFAULT.getTerms(arg0.reader(), 
      field , true); 
    return this; 
} 

@Override 
public void setTopValue(String arg0) { 
    this.topValue = arg0; 
} 

@Override 
public String value(int arg0) { 
    return values[arg0]; 
} 

}