Der Lucene-Index wird nicht synchronisiert, wenn eine Aktualisierung in der Datenbank im Ruhezustand erfolgt

Ich arbeite an ein paar POC-SachenSuche im Ruhezustand basierend auf Lucene mit unten env:

Hibernate-Search-Engine-4.4.2.Final.jarlucene-core-3.6.2.jarMySQL 5.5Verwenden@Indexed Anmerkung zur Domain-Klasse.Verwenden@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) über Feld.Verwenden@IndexedEmbedded über Sammlung von Instanzen verschiedener Domainklassen.

Ich habe explizite IndizierungNUR bei Bewerbungsbeginn(Da dies in der Hibernate Search-API geschrieben ist, indiziert die Hibernate Search transparent jede Entität, die über den Hibernate Core beibehalten, aktualisiert oder entfernt wird.)Indizierung der Suche im Ruhezustand) durch folgenden Code:

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

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

    fullTextSession.close();
}

Dies funktioniert einwandfrei, wenn die Indizierung und Suche für bereits gesetzte Datenbanken sowie für Erstellungs- und Löschvorgänge über den Kern des Ruhezustands in der Anwendung durchgeführt wird.

Aber NICHT bei Aktualisierungsvorgängen für vorhandene Daten über den Hibernate Core, da ich die aktualisierten Daten nicht erhalte, wenn ich diese über die Hibernate-Suche durchsuche.

Sie wissen nicht, warum ein Problem mit der Ruhezustands-Suche oder mit Lucene bedeutet, dass entweder der Index NICHT aktualisiert wird oder ein anderer Grund, warum das aktualisierte Ergebnis nicht über die Ruhezustands-Suche abgerufen wird.

Benutzerklasse:

@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;
    }
}

UserInfo-Klasse:

@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;
}
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage