Kyn*_*e H 5 java indexing jpa hibernate-mapping hibernate-search
我目前正在开发一个项目,以使用 JPA 2.1 保存数据并使用休眠搜索 4.5.0.final 搜索实体。
映射类和索引后,搜索工作正常。
但是,当我将classB的值描述从“someStr”更改为“anotherStr”时。数据库也相应更新了,但是当我使用Luke检查索引时,索引中的classA.classB.description没有更新,并且无法通过关键字“anotherStr”搜索数据,但可以通过关键字“someStr”进行搜索。
在我重新索引整个数据库后,它终于更新了。
根据 Hibernate 搜索网站,
简短的回答是索引是自动的:Hibernate Search 将透明地索引每个通过 Hibernate ORM 持久化、更新或删除的实体。它的任务是保持索引和你的数据库同步,让你忘记这个问题。
但这在我的情况下不起作用。我不确定我是否遗漏了一些细节,或者我需要自己处理此类问题。
我还尝试按照this one的建议在classB上添加注释@Indexed ,但它仍然没有解决我的问题。
据我所知,解决方案是定期重新索引数据库。但是重新索引会禁用搜索功能,并且在大多数情况下这不是一个选项。
有人可以给一些建议吗?谢谢。
我有一个类,它通过使用 @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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
索引方法如下:
fullTextEntityManager.createIndexer()
.purgeAllOnStart(true)
.optimizeAfterPurge(true)
.optimizeOnFinish(true)
.batchSizeToLoadObjects(25)
.threadsToLoadObjects(8)
.startAndWait();
Run Code Online (Sandbox Code Playgroud)
您错误地放置了 ContainedIn 注释。根据 Hibernate 搜索文档:
当心。由于使用 @IndexedEmbedded 技术时 Lucene 索引中的数据是非规范化的,因此 Hibernate Search 需要了解 Place 对象中的任何更改以及 Address 对象中的任何更改,以使索引保持最新。为了确保 Place Lucene 文档在地址更改时得到更新,您需要使用 @ContainedIn 标记双向关系的另一端。
在您的示例中,您需要:
在你的情况下:
ClassB {
private Set<ClassA> linkedObjects;
....
@OneToMany(mappedBy="place")
@ContainedIn
public Set<ClassA> getLinkedObjects() {
return linkedObjects;
}
....
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2071 次 |
| 最近记录: |