Индексация без учета регистра с помощью Hibernate-Search?

Есть ли простой способ заставить Hibernate Search индексировать все свои значения в нижнем регистре? Вместо стандартного смешанного регистра.

Я использую аннотацию @Field. Но я не могу настроить какой-то набор на уровне приложения


person Jan Goyvaerts    schedule 06.03.2012    source источник


Ответы (3)


Дурак какой я! Класс StandardAnalyzer уже индексирует строчные буквы. Это просто вопрос установки условий поиска в нижнем регистре. Я предполагал, что запрос сделает это.

Однако, если для всего приложения будет использоваться другой анализатор, его можно установить с помощью свойства hibernate.search.analyzer.

person Jan Goyvaerts    schedule 07.03.2012
comment
Обратите внимание, что вы также можете указать анализатор при создании запроса, что необходимо, если вы используете разные анализаторы для разных полей (например, у меня есть индекс в нижнем регистре и сохраненный регистр для некоторых из моих полей, для которых у пользователей есть опция для поиска с учетом регистра или без учета регистра). - person David Mason; 12.04.2012

Анализатор применяет строчные буквы, разделение терминов, удаление общих терминов и многие другие расширенные функции языковой обработки.

Обычно вы должны обрабатывать пользовательский ввод, предназначенный для сопоставления проиндексированных строк, с тем же Анализатором, который использовался при индексировании; настройка 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 .

person Sanne    schedule 31.03.2012

Существует несколько способов сделать сортировку нечувствительной только в поле строкового типа.

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);

person Bipin    schedule 01.08.2016