当通过休眠在数据库中发生任何更新时,lucene 索引未同步 [英] lucene index not getting sync when any update occurs in DB through hibernate

查看:14
本文介绍了当通过休眠在数据库中发生任何更新时,lucene 索引未同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下环境在 基于 Lucene 的 Hibernate Search 上研究一些 POC:

I am working on some POC stuff on Hibernate Search based on Lucene using below env:

  • hibernate-search-engine-4.4.2.Final.jar
  • lucene-core-3.6.2.jar
  • MySQL 5.5
  • 在域类上使用 @Indexed 注释.
  • 在字段上使用 @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO).
  • 使用 @IndexedEmbedded 覆盖不同域类的实例集合.
  • hibernate-search-engine-4.4.2.Final.jar
  • lucene-core-3.6.2.jar
  • MySQL 5.5
  • Use @Indexed annotation on domain class.
  • Use @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) over field.
  • Use @IndexedEmbedded over collection of Instance of different domain class.

我在应用程序启动时做了显式索引(因为这是用 Hibernate Search API 编写的,Hibernate Search 将透明地索引通过 Hibernate Core 持久化、更新或删除的每个实体,休眠搜索索引) 通过以下代码:

I did explicit indexing ONLY on start of application (as this is written in Hibernate Search API that Hibernate Search will transparently index every entity persisted, updated or removed through Hibernate Core,Hibernate Search Indexing) through below code:

private static void doIndex() throws InterruptedException {
    Session session = HibernateSearchUtil.getSession();

    FullTextSession fullTextSession = Search.getFullTextSession(session);
    fullTextSession.createIndexer().startAndWait();

    fullTextSession.close();
}

在索引 & 时工作正常搜索是在已经播种的 DB 以及 create &通过应用程序中的休眠核心删除操作.

It works fine when indexing & searching is done on already seeded DB as well as on create & delete operation through hibernate core within application.

但不是通过 Hibernate Core 对现有数据进行任何更新操作,因为当通过休眠搜索对此进行搜索时,我没有获取更新的数据.

不知道是 Hibernate Search 还是 lucene 出现问题的原因,是指索引没有得到更新或其他原因导致没有通过 Hibernate Search 获得更新的结果.

Don't know the reason that whether it is problem with Hibernate Search Or lucene, means either index is NOT getting updated or some other reason due to which not getting the updated result through Hibernate Search.

用户类别:

@Entity
@Table(name = "user")
@Indexed
public class User implements java.io.Serializable {

private static final long serialVersionUID = 5753658991436258019L;
private Integer idUser;

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

private Set<UserInfo> userInfos = new HashSet<UserInfo>(0);

public User() {
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "iduser", unique = true, nullable = false)
public Integer getIdUser() {
    return idUser;
}

public void setIdUser(Integer idUser) {
    this.idUser = idUser;
}

@Column(name = "name", nullable = false, length = 256)
public String getName() {
    return this.Name;
}

public void setName(String tenantName) {
    this.Name = tenantName;
}

@IndexedEmbedded
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserInfo> getUserInfos() {
    return userInfos;
}

public void setUserInfos(Set<UserInfo> userInfos) {
    this.userInfos = userInfos;
    }
}

用户信息类:

@Entity
@Table(name = "userInfo")
public class UserInfo implements java.io.Serializable {

private static final long serialVersionUID = 5753658991436258019L;
private Integer iduserInfo;
private User user;
private String address; 

public UserInfo() {
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "iduserInfo", unique = true, nullable = false)
public Integer getIduserInfo() {
    return iduserInfo;
}

public void setIduserInfo(Integer iduserInfo) {
    this.iduserInfo = iduserInfo;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false)
public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO, norms=Norms.NO)
@Column(name = "address", nullable = false, length = 256)
public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}
}

推荐答案

试试添加

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false)
@ContainedIn
public User getUser() {
   return user;
}

这篇关于当通过休眠在数据库中发生任何更新时,lucene 索引未同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆