Индексирование без учета регистра с помощью Hibernate-Search? - PullRequest
3 голосов
/ 06 марта 2012

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

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

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

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

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

0 голосов
/ 01 августа 2016

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

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

0 голосов
/ 31 марта 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...