Существует несколько способов сделать сортировку нечувствительной в поле типа строки.
1.First Way добавляет аннотацию @Fields в поле/свойство объекта. Как
@fields ({@ поле (индекс = Index.YES, анализировать = Analyze.YES, магазин = Store.YES), @Field (индекс = Index.YES, имя = "nameSort", анализатор = @Analyzer (impl = KeywordAnalyzer.class), store = Store.YES)})
частное имя строки;
Предположим, что у вас есть свойство имени с пользовательским анализатором и сортировка по нему. поэтому это невозможно, тогда вы можете добавить новый индекс в поле с именемSort apply sort в этом поле. вы должны применить класс анализатора ключевых слов, потому что это не поле токениза и по умолчанию применяет строчный заводский класс в поле.
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];
}
}
Применить сортировку на таких областях, как
новый SortField («name», новый StringCaseInsensitiveComparator(), true);
Обратите внимание, что вы также можете указать Анализатор при создании запроса, что необходимо, если вы используете разные анализаторы для разных полей (например, у меня есть строчный индекс и индекс сохраненного случая для некоторых моих полей, для которых пользователи имеют возможность поиска как с учетом регистра или без учета регистра). –