【问题标题】:Lucene index not updated with Hibernate Search and Spring Data未使用 Hibernate Search 和 Spring Data 更新 Lucene 索引
【发布时间】:2014-04-14 15:04:11
【问题描述】:

我正在使用 Spring Boot 和 Spring Data 开始使用 Hibernate Search/Lucene,但我遇到了索引未更新的问题(使用 Luke 工具检查)。

我的域中有 3 个课程。这是Datasheet,我的根实体:

@Entity
@Indexed
public class Datasheet
{

    @Id
    @GeneratedValue()
    private long m_id;

    @Field(name="name")

    private String m_name;

    @Field(name="description")
    private String m_description;

    @IndexedEmbedded(prefix = "documents.")
    @OneToMany(cascade = CascadeType.REMOVE)
    private Set<DatasheetDocument> m_documents;
}

然后DatasheetDocument:

@Entity
public class DatasheetDocument
{
    @Id
    @GeneratedValue()
    private long m_id;

    private String m_originalFileName;

    @Field(name="componentName")
    private String m_componentName;

    @IndexedEmbedded(prefix = "manufacturer.")
    @ManyToOne
    private Manufacturer m_manufacturer;
}

最后是Manufacturer:

@Entity
public class Manufacturer
{
    @Id
    @GeneratedValue()
    private long m_id;

    @Field(name="name", analyze = Analyze.NO)
    private String m_name;

    private String m_website;
}

当我在索引器 (org.hibernate.search.MassIndexer) 上显式调用 startAndWait() 时,索引中的所有内容都符合预期。它包含字段namedescriptiondocuments.componentNamedocuments.manufacturer.name

但是,当我现在通过调用 Spring Data CrudRepository 类的 @RestController 类进行更新时,索引会在更改 直接字段 Datasheet(例如名称或描述)。将某些内容更改为 DatasheetDocument 实例不会更新索引。知道为什么会这样吗?

请注意,我已尝试向父级添加反向引用。对于DatasheetDocument

@ManyToOne
@ContainedIn
private Datasheet m_datasheet;

对于Manufacturer

@ManyToMany
@ContainedIn
private Set<DatasheetDocument> m_datasheetDocuments;

但这无济于事。

我正在使用包含 Hibernate 4.3.1 的 Spring boot 1.0.1。我添加了 Hibernate Search 4.5.1。我看到 Lucense 3.6.2 也被传递添加。

【问题讨论】:

    标签: java hibernate lucene hibernate-search spring-boot


    【解决方案1】:

    您肯定需要反向引用。没有它们,特别是没有 @ContainedIn,搜索无法知道它必须在 DatasheetDocument 实例更改时更新 Datasheet 索引.

    您是否已将 mappedBy 添加到一对多端?

    @OneToMany(cascade = CascadeType.REMOVE, mappedBy="m_datasheet")
    private Set<DatasheetDocument> m_documents;
    

    另外,如何更新DatasheetDocument?你能显示代码吗?无论哪种方式,您都需要从双向开始。

    【讨论】:

      【解决方案2】:
      FullTextSession fullTextSession = Search.getFullTextSession(session);
      fullTextSession.openSession()
      
       Object customer = fullTextSession.load( Datasheet.class, datasheetDocument.getDatasheet.getId() );
      fullTextSession.index(customer);
      fullTextSession.flushIndex();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 2013-01-11
        • 1970-01-01
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多