Объект Hibernate Search для строкового моста

Я использую Infinispan 6.0.2 и Hibernate Search 4.4.0.

В моем кеше есть некоторые данные, значение которых равно hibernate_search_DSL (тип String). Когда я использую поиск по ключевым словам с hibernate, он не может найти результат с подчеркиванием (hibernate_search_DSL).

Я думаю, что в Hibernate hibernate_search_DSL — это всего лишь одно слово, поэтому я написал String Bridge, пытаясь заменить все _ на пробел, но это не сработало.

Вот мой класс:

public class NormaliseValue implements StringBridge{

    public String objectToString(Object object)
    {
        if(object == null)
            throw new IllegalArgumentException("There is no value to normalise");

        String value = object.toString();
        value.replaceAll("_", " ");
        return value;
    }
}

И индекс сопоставления:

mapping.entity(Hibernate.class).indexed().providedId()
    .property("value", ElementType.FIELD).field().bridge(NormaliseValue.class);

Что-то не так или есть какое-то решение, чтобы найти результат с подчеркиванием ???


person Stephan    schedule 05.06.2014    source источник


Ответы (1)


По умолчанию используется StandardAnalyzer, который разбивает входные строки на пробелы и символы. Таким образом, буквальное «hibernate_search_DSL», вероятно (я предполагаю, что вы используете анализатор по умолчанию), токенизировано в разные ключевые слова «спящий режим», «поиск» и «dsl» (поскольку он также использует нижний регистр).

Принцип полнотекстового поиска заключается в том, что при токенизации запроса с помощью того же анализатора он будет соответствовать и оцениваться по частям.

Если вы хотите отключить это и просто использовать точное совпадение, отключите анализатор свойства с помощью аннотации:

@Field(analyze = Analyze.NO)
person Sanne    schedule 06.06.2014
comment
Ты за ответ. Но hibernate_search_DSL уже проиндексирован и хранится в кэше Infinispan. Я использовал StandardAnalyzer и хочу найти слово hibernate и найти в результате hibernate_search_DSL. В моей системе это не работает. Итак, я хочу написать мост для преобразования hibernate_search_DSL в режим гибернации, поиска и DSL. Я думаю, что если он хранит такие значения, как 3 слова, я могу найти идентификатор, у которого есть hibernate_search_DSL, через ключевое слово hibernate. @Санне - person Stephan; 06.06.2014
comment
Я сравнил свой StringBridge с примером в Справочном руководстве по Hibernate, но не могу найти, в чем проблема. Значение в кеше не изменилось после использования моста. - person Stephan; 06.06.2014
comment
да стандартный анализатор должен его разделить. Это повлияет только на индекс, а не на содержимое кеша! И, конечно же, если вы внесли изменения после того, как данные были сохранены, вам придется перестроить индекс. - person Sanne; 07.06.2014
comment
Но если он был проиндексирован тремя словами hibernate, search и dsl, то почему query query = queryBuilder.keyword().onField("value").matching("hibernate").creatQuery(); ничего не нашел. Как ты сказал, нет необходимости писать этот мост?? @Санне - person Stephan; 10.06.2014
comment
Я не знаю, как он был проиндексирован, это зависит от настроенного вами анализатора. Лучший способ проверить содержимое индекса — использовать Luke: code.google.com/p/luke всегда полезно отлаживать такие ситуации. - person Sanne; 11.06.2014