Свойство includePaths @IndexedEmbedded не создает индекс при размещении над полем вложенных экземпляров

#java #lucene #hibernate-search

#java #lucene #спящий режим-поиск

Вопрос:

Использование приведенной ниже версии для поиска в режиме гибернации:

  • hibernate-core-4.2.0.Final.jar
  • hibernate-search-engine-4.4.2.Final.jar
  • hibernate-search-analyzers-3.3.0.Final.jar
  • hibernate-search-orm-4.4.2.Final.jar
  • lucene-core-3.6.2.jar

Я сталкиваюсь с проблемой со includePaths свойством @indexedEmbedded аннотаций при размещении экземпляров экземпляра. Например: (предположим, что все поля имеют правильный метод получения / установки)

Корневой класс:

 @Indexed
public class RootClass {

@IndexedEmbedded
private Set<Instance> setOfInstances;

}
 

Класс экземпляра:

 public class Instance {

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String name;

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String vesion;

@IndexedEmbedded(includePaths={"type", "location", "users.name", "users.country"})
private InstanceDetail deltail;
}
 

Класс InstanceDetail:

 public class InstanceDetail{

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private int type;

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String location;

@IndexedEmbedded
private Set<User> users;

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String ref1;

@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String ref2

@IndexedEmbedded
private Set<Area> usersArea;
}
 

Пользовательский класс:

 public class User{
    @Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
    private String name;

    @Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
    private String address;

    @Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
    private String mobile;

    @Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
    private String country;
}
 

Поэтому, когда я определяю includePaths свойство IndexedEmbedded аннотации поверх InstanceDetail of Instance , то НИ ОДНО поле of InstanceDetail (другие идут как name / vesion) не индексируется для объекта корневого класса. (Подтверждение по журналам). Никаких исключений не происходит.

Так что это соответствует дизайну HibernateSearch или чему-то, что связано с моими реализациями.

Ответ №1:

Это должно сработать, но вы можете столкнуться с ошибкой, связанной с https://hibernate.atlassian.net/browse/HSEARCH-1112

Ответ №2:

Вам нужно будет указать a depth в @IndexedEmedded аннотации on Instance.deltail , чтобы получить свойства InstanceDetail , которые должны пройти. Согласно Javadocs:

Остановка индексации встроенных элементов при достижении глубины depth=1 означает, что индексируется связанный элемент, но не его встроенные элементы.

Значение по умолчанию зависит от значения атрибута includePaths: если пути не определены, по умолчанию используется целое число.MAX_VALUE; если определены какие-либо включаемые пути, глубина по умолчанию интерпретируется как 0, если не указано значение, отличное от значения по умолчанию.

Установка значения depth to 1 будет встраивать свойства InstanceDetail , в то время как установка значения to 2 будет встраивать как свойства InstanceDetail , так и связанные User с ними.

Комментарии:

1. Согласно справочному руководству по поиску в режиме гибернации 4.4.2: When using includePaths, and leaving depth undefined, behavior is equivalent to setting depth=0: only the included paths are indexed. поэтому, когда мы указываем путь, индексируются только те значения.

2. Если бы внедренный объект был проиндексирован отдельно, то includePaths он был бы помещен в индекс объекта; однако, поскольку объект внедряется в другой, когда код индексирования встраивает объект в индекс объекта-владельца, он достигает значения по depth=0 умолчанию и прекращает индексирование любых путей, связанных с внедренным объектом.