#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
умолчанию и прекращает индексирование любых путей, связанных с внедренным объектом.