Есть ли простой способ заставить Hibernate Search индексировать все свои значения в нижнем регистре? Вместо стандартного смешанного регистра.
Я использую аннотацию @Field. Но я не могу настроить какой-то набор на уровне приложения
Есть ли простой способ заставить Hibernate Search индексировать все свои значения в нижнем регистре? Вместо стандартного смешанного регистра.
Я использую аннотацию @Field. Но я не могу настроить какой-то набор на уровне приложения
Дурак какой я! Класс StandardAnalyzer уже индексирует строчные буквы. Это просто вопрос установки условий поиска в нижнем регистре. Я предполагал, что запрос сделает это.
Однако, если для всего приложения будет использоваться другой анализатор, его можно установить с помощью свойства hibernate.search.analyzer.
Анализатор применяет строчные буквы, разделение терминов, удаление общих терминов и многие другие расширенные функции языковой обработки.
Обычно вы должны обрабатывать пользовательский ввод, предназначенный для сопоставления проиндексированных строк, с тем же Анализатором, который использовался при индексировании; настройка hibernate.search.analyzer задает анализатор по умолчанию (глобальный), но вы можете настроить его для каждого индекса, типа сущности, поля и даже для разных экземпляров сущности.
Например, полезно иметь специфичный для языка анализ, чтобы обрабатывать китайские описания с помощью специальных китайских процедур, итальянские описания с итальянскими токенизаторами.
Анализатор по умолчанию подходит для большинства случаев использования, он переводит термины в нижний регистр и разделяет термины по пробелам.
Учтите также, что при использовании Lucene Queryparser API запрашивает у вас соответствующий анализатор.
При использовании Hibernate Search QueryBuilder он пытается применить правильный анализатор к каждому полю; см. также http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/#search-query-querydsl .
Существует несколько способов сделать сортировку нечувствительной только в поле строкового типа.
1. Первый способ — добавить аннотацию @Fields в поле/свойство объекта. Нравиться
@Fields({@Field(index=Index.YES,analyze=Analyze.YES,store=Store.YES), @Field(index=Index.YES,name = "nameSort",analyzer = @Analyzer(impl=KeywordAnalyzer. class), store = Store.YES)})
частное строковое имя;
предположим, что у вас есть свойство имени с пользовательским анализатором и сортировка по нему. поэтому это невозможно, тогда вы можете добавить новое поле в индекс с помощью сортировки nameSort для этого поля. вы должны применить класс Keyword Analyzer, потому что это не токенизированное поле, и по умолчанию в поле применяется фабричный класс нижнего регистра.
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];
}
}
Применить сортировку по полям Like
новое поле сортировки («имя», новый компаратор StringCaseInsensitiveComparator(), true);