В настоящее время я работаю над проектом по сохранению данных с помощью JPA 2.1 и поиску объектов с использованием спящего режима поиска 4.5.0.final.
После сопоставления классов и индексации поиск работает нормально.
Однако, когда я изменил значение описание classB с «someStr» на «anotherStr». База данных была обновлена соответствующим образом, но когда я проверил индекс с помощью Luke, classA.classB.description в индексе не был обновлен, и данные не могут быть доступны для поиска по ключевому слову «anotherStr», но могут быть доступны для поиска по ключевому слову «someStr».
После того, как я переиндексировал всю базу данных, она наконец обновилась.
Согласно поисковому веб-сайту Hibernate,
Короткий ответ заключается в том, что индексация выполняется автоматически: Hibernate Search будет прозрачно индексировать каждый объект, сохраняемый, обновляемый или удаляемый с помощью Hibernate ORM. Его задача — синхронизировать индекс и вашу базу данных, позволяя вам забыть об этой проблеме.
Но это не работает в моем случае. Я не уверен, пропустил ли я какие-то детали или мне нужно справиться с такими проблемами самостоятельно.
Я также попытался добавить аннотацию @Indexed к классу B, как это было предложено этим, но это все еще не решает мою проблему.
Насколько я знаю, решением будет периодическая переиндексация базы данных. Но переиндексация отключит функцию поиска, а это в большинстве случаев невозможно.
Может ли кто-нибудь дать несколько предложений? Спасибо.
У меня есть класс, в который встроены некоторые другие классы с помощью аннотации @IndexedEmbedded. Вот упрощенная версия моего сопоставления классов.
Class A
@Entity(name = "classA")
@Indexed
public class classA extends Model {
private int id;
private String name;
private ClassB place;
...
some constructors
...
@Id
@GeneratedValue
@DocumentId
public int getId() {
return id;
}
@Column(name = "name")
@Field(analyze = Analyze.NO, store = Store.YES) // only used for sorting
public String getName() {
return name;
}
@IndexedEmbedded
@ManyToOne
@JoinColumn(name = "place_id")
public ClassB getPlace() {
return place;
}
...
}
Class B
@Entity(name = "classB")
public class classB extends Model {
private int id;
private String description;
...
some constructors
...
@Id
@GeneratedValue
public int getId() {
return id;
}
@Fields({
@Field,
@Field(name = "description_sort", analyze = Analyze.NO, store = Store.YES)
})
@ContainedIn
@Column(name = "description")
public String getDescription() {
return description;
}
...
}
И методы индексации следующие:
fullTextEntityManager.createIndexer()
.purgeAllOnStart(true)
.optimizeAfterPurge(true)
.optimizeOnFinish(true)
.batchSizeToLoadObjects(25)
.threadsToLoadObjects(8)
.startAndWait();