当前位置: 首页 > 知识库问答 >
问题:

Lucene索引未用Hibernate Search和Spring数据更新

孙莫希
2023-03-14
@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;
}
@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;
}
@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 DataCrudRepository类的@RestController类进行更新时,索引只在更改DataSheet的直接字段(例如名称或描述)时更改。将某些内容更改为DatasheetDocument实例不会更新索引。你知道为什么会这样吗?

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

@ManyToOne
@ContainedIn
private Datasheet m_datasheet;

对于制造商:

@ManyToMany
@ContainedIn
private Set<DatasheetDocument> m_datasheetDocuments;

但这于事无补。

我使用的是Spring Boot1.0.1,其中包括Hibernate4.3.1。我添加了Hibernate Search 4.5.1。我看到Lucense 3.6.2也是以传递性方式添加的。

共有1个答案

谷星文
2023-03-14

你肯定需要后面的参考资料。没有它们,特别是没有@ContainedIn,搜索就无法知道它必须在DatasheetDocument实例更改时更新数据表索引。

你有没有把mappedBy添加到一对多的一边?

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

另外,如何更新DatasheetDocument?你能出示代码吗?不管是哪种方式,首先都需要使关联成为双向的。

 类似资料:
  • 假设我有两组对象“Questions”和“Users”,它们共享一个关系。 什么是最好的方法索引我的对象,以允许最新的变化反映在lucene IDEX? 是否应该为用户和问题提供单独的文档,并让lucene根据需要获取所需的问题/用户详细信息? 还是,走数据传输对象的方式?当发生更改时,只需删除这些文档并重新索引?

  • bugu-mongo 2.x版本集成了Lucene的功能。当往MongoDB中新增一个Document时,能自动为该Document建立Lucene索引。相应的,当MongoDB中的Document被修改、删除时,对应的Lucene索引也会修改、删除。 另外,bugu-mongo还提供了对Lucene搜索的支持。根据Lucene索引进行搜索的时候,搜索结果能自动转换成对应的Entity对象。 在L

  • 我正在使用: neo4j 2.0。1 我有一个具有属性名称的节点人员,我想用Lucene语法搜索该属性。我在我的存储库中使用findByNamelike方法,它非常适合像value*或*value或*etc这样的查询。 但是我需要这样的查询{A*TO D*}。我发现了一个弃用的方法findAllByQuery(名称,查询),用这个方法我可以实现我的需求。 > 我还注意到,如果我从cypher创建节

  • 我正在使用spring数据elasticsearch来执行CRUD操作。 我有一个扩展Elasticsearch chRepository的自定义存储库。 最终,ElasticsearchRepository扩展了CrudRepository,这意味着可以更新现有记录。 问题是,你是如何做到这一点的?我还没有找到一个名为“update()”的方法 我认为做以下事情会有用(代码从https://gi

  • null 我发现在lucene Wiki中:lucene中没有直接更新程序...我还发现在lucene 4.1.0中,文档可以用UpdateDocument更新... 我已经尝试过IndexWriter.UpdateDocument(Term,Document),但在使用filter执行搜索时,我从我的一个方法中得到了NPE,正如1-4中所述,当我更新索引时不会发生什么。有人有过类似的问题吗?如何

  • 问题内容: 在不使索引离线的情况下备份Lucene索引的最佳实践是什么(热备份)? 问题答案: 您不必停止IndexWriter即可备份索引。 只需使用SnapshotDeletionPolicy,它就可以“保护”给定的提交点(及其包含的所有文件),以免被删除。然后,将该提交点中的文件复制到您的备份中,最后释放该提交。 如果备份需要一段时间才能运行,这很好- 只要您不使用SnapshotDelet