Существует несколько способов сделать нечувствительным к сортировке только поле типа строки.
1.Первый способ - добавить аннотацию @Fields в поле / свойстве объекта.Например,
@ Fields ({@ Field (index = Index.YES, анализ = Analyze.YES, store = Store.YES), @Field (index = Index.YES, name = "nameSort", analyzer =@Analyzer (impl = KeywordAnalyzer.class), store = Store.YES)})
private String name;
предположим, что у вас есть свойство name с пользовательским анализатором и сортировка по нему.так что это невозможно, тогда вы можете добавить новое поле в индекс с помощью nameSort apply sort для этого поля.Вы должны применить класс Keyword Analyzer, потому что это не поле tokeniz, и по умолчанию применять строчный класс фабрики в поле.
2. Второй способ - реализовать класс сравнения при сортировке, например
@Override
public FieldComparator newComparator(String field, int numHits, int sortPos, boolean reversed) throws IOException {
return new StringValComparator(numHits, field);
}
Создание одного класса с расширением класса FieldComparatorSource и реализация описанного выше метода.
Создание нового имени класса с помощью StringValComparator и реализация FieldComparator и реализация следующего метода
Класс StringValComparator расширяет FieldComparator {
private String[] values;
private String[] currentReaderValues;
private final String field;
private String bottom;
StringValComparator(int numHits, String field) {
values = new String[numHits];
this.field = field;
}
@Override
public int compare(int slot1, int slot2) {
final String val1 = values[slot1];
final String val2 = values[slot2];
if (val1 == null) {
if (val2 == null) {
return 0;
}
return -1;
} else if (val2 == null) {
return 1;
}
return val1.toLowerCase().compareTo(val2.toLowerCase());
}
@Override
public int compareBottom(int doc) {
final String val2 = currentReaderValues[doc];
if (bottom == null) {
if (val2 == null) {
return 0;
}
return -1;
} else if (val2 == null) {
return 1;
}
return bottom.toLowerCase().compareTo(val2.toLowerCase());
}
@Override
public void copy(int slot, int doc) {
values[slot] = currentReaderValues[doc];
}
@Override
public void setNextReader(IndexReader reader, int docBase) throws IOException {
currentReaderValues = FieldCache.DEFAULT.getStrings(reader, field);
}
@Override
public void setBottom(final int bottom) {
this.bottom = values[bottom];
}
@Override
public String value(int slot) {
return values[slot];
}
}
Применение сортировки к полям, например
new SortField ("name", new StringCaseInsensitiveComparator (), true);