2012-03-06 2 views
3

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

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

ответ

3

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

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

+0

Обратите внимание, что вы также можете указать Анализатор при создании запроса, что необходимо, если вы используете разные анализаторы для разных полей (например, у меня есть строчный индекс и индекс сохраненного случая для некоторых моих полей, для которых пользователи имеют возможность поиска как с учетом регистра или без учета регистра). –

0

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

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

0

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

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