为什么Hibernate搜索不提供新插入的记录?

为什么Hibernate搜索不提供新插入的记录?,hibernate,lucene,hibernate-search,Hibernate,Lucene,Hibernate Search,我不熟悉hibernate Lucene搜索。在我的应用程序中,我知道hibernate Lucene不知道事务的一些旧数据。因此,对于这些旧数据,我已经手动创建了索引,因此它可以像一个符咒一样工作,但不会为新插入/更新的记录提供结果。但如果我在这些记录出现时再次进行手动索引。我认为通过hibernate ORM索引插入/更新的记录将自动更新,对吗??。如果是,这就是为什么不来。请帮我一些建议 这是我的片段 fullTextSession.createIndexer().startAndWait

我不熟悉hibernate Lucene搜索。在我的应用程序中,我知道hibernate Lucene不知道事务的一些旧数据。因此,对于这些旧数据,我已经手动创建了索引,因此它可以像一个符咒一样工作,但不会为新插入/更新的记录提供结果。但如果我在这些记录出现时再次进行手动索引。我认为通过hibernate ORM索引插入/更新的记录将自动更新,对吗??。如果是,这就是为什么不来。请帮我一些建议

这是我的片段

fullTextSession.createIndexer().startAndWait();
我的搜索代码:

MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "skills.skill","role" },
                new StandardAnalyzer());
parser.setDefaultOperator(Operator.OR);
org.apache.lucene.search.Query luceneQuery = null;
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Student.class).get();
BooleanQuery boolQuery = new BooleanQuery();    
boolQuery.add(qb.keyword().onField("vstatus").matching(1).createQuery(), BooleanClause.Occur.MUST);
boolQuery.add(qb.range().onField("percentage").from(80).to(100).createQuery(),
                BooleanClause.Occur.MUST);
FullTextQuery createFullTextQuery = fullTextSession.createFullTextQuery(boolQuery, Student.class);
        createFullTextQuery.setProjection("studentId", "firstName","lastName","personal.city",);

return createFullTextQuery.list();
下面是我的映射实体

@Entity
@Table(name="student")
@Component
@Indexed(index="student")
public class Student        
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="student_id")
    private long studentId;     


    @Column(name="first_name")
    @Field(store=Store.YES)
    private String firstName;


    @Column(name="last_name")
    @Field(store=Store.YES)
    private String lastName;

    @Column(name="visibility_status",columnDefinition="TINYINT")
    @Field(analyze=Analyze.YES,index=Index.YES)
    private int vstatus;


    @OneToOne(mappedBy="student",cascade=CascadeType.ALL)
    @IndexedEmbedded
    private ProfileSummary profileSummary;

    @OneToOne(mappedBy="student",cascade=CascadeType.ALL)
    @IndexedEmbedded
    private PersonalInfo personal;


    @OneToMany(mappedBy="student",cascade=CascadeType.ALL)
    @IndexedEmbedded
    private List<StudentSkills> StudentSkills = new ArrayList<StudentSkills>();

    //setters & getters
}
========================

@Entity
@Table(name="profile_summary")
@Indexed(index="ProfileSummary")
@AnalyzerDef(name = "summaryAnalyzer",
tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
filters = {
  @TokenFilterDef(factory = LowerCaseFilterFactory.class),
})
public class ProfileSummary implements Serializable
{
    private static final long serialVersionUID = 4672310608280406464L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="profile_summary_id")
    private long ProfileSummaryId;

    @OneToOne
    @JoinColumn(name="student_student_id")
    private Student student


    @Column(name="profile_percentage")
    @Analyzer(definition = "summaryAnalyzer")
    @Field(index=Index.YES, store=Store.NO)
    private int percentage ;        

}

@Entity
@Table(name="student_skills")
public class StudentSkills 
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="student_skill_id")
    private long studentSkillId;

    @ManyToOne
    @JoinColumn(name="student_student_id")
    private Student student

    @ManyToOne
    @JoinColumn(name="skills_skill_id")
    @IndexedEmbedded
    private Skills skills;

}
@实体
@表(name=“student”)
@组成部分
@索引(index=“学生”)
公立班学生
{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“student\u id”)
私立长期学生;
@列(name=“first_name”)
@字段(store=store.YES)
私有字符串名;
@列(name=“last_name”)
@字段(store=store.YES)
私有字符串lastName;
@列(name=“可见性\状态”,columnDefinition=“TINYINT”)
@字段(analyze=analyze.YES,index=index.YES)
私有内部状态;
@OneTONE(mappedBy=“student”,cascade=CascadeType.ALL)
@指数化
私人档案摘要;
@OneTONE(mappedBy=“student”,cascade=CascadeType.ALL)
@指数化
个人信息;
@OneToMany(mappedBy=“student”,cascade=CascadeType.ALL)
@指数化
private List StudentSkills=new ArrayList();
//二传手和接球手
}
========================
@实体
@表(name=“profile\u summary”)
@索引(index=“ProfileSummary”)
@AnalyzerDef(name=“summaryAnalyzer”,
tokenizer=@TokenizerDef(工厂=WhitespaceTokenizerFactory.class),
过滤器={
@TokenFilterDef(工厂=LowerCaseFilterFactory.class),
})
公共类ProfileSummary实现了可序列化
{
私有静态最终长serialVersionUID=4672310608280406464L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“profile\u summary\u id”)
私有长ProfileSummaryId;
@奥内托内
@JoinColumn(name=“student\u student\u id”)
私立学生
@列(name=“profile\u percentage”)
@分析器(定义=“summaryAnalyzer”)
@字段(index=index.YES,store=store.NO)
私人机构的int百分比;
}
@实体
@表(name=“学生技能”)
公共课学生技能
{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“学生技能id”)
私人长期学生技能;
@许多酮
@JoinColumn(name=“student\u student\u id”)
私立学生
@许多酮
@JoinColumn(name=“skills\u skill\u id”)
@指数化
私人技能;
}
类似地,我为技能添加了索引

  • 检查您的
    hibernate.search.indexing\u策略
    configuration属性。如果设置为
    手动
    ,则表示您禁用了自动索引。您应该将其设置为
    事件
  • 检查你的日志。在某些情况下,索引时可能会出现异步错误,这不会使事务失败,但仍然无法索引实体
  • 检查您的查询。更改参数时,它是否与体量索引实体匹配
  • 如果上述任何一项都不能解决问题,请告诉我们您是如何添加/更新实体的(处理
    EntityManager
    /
    会话的代码),以及您是如何管理事务的(Hibernate Search通常在提交事务时触发索引)

  • 我也遇到了同样的问题。我认为这也是原因之一。这取决于保存实体。如果您在您的案例中保存主实体,即学生。类@indexembedded足够了。如果您在child上执行Hibernate操作,则意味着您必须使用@indexembedded建立双向关系还有@ContainedIn。我认为您错过了关系另一端的@ContainedIn,这就是索引不更新的原因

    在概要文件摘要实体和学生技能实体中:

      @OneToOne
      @JoinColumn(name="student_student_id")
      @ContainedIn
      private Student student
    

    1.我没有提到任何与索引策略相关的属性。2.没有与事务相关的错误。实际上,我的问题是,在上面的代码段中,主要实体是Student.class,类似地,我还有一个名为DummyStudent.class的实体,具有相同的关系。我使用DummyStudent.class作为初始数据,而Student.class是通过我的spring应用程序提供的实际数据。为了存储虚拟数据,我创建了一个单独的GUI,该GUI将在Hibernate会话期间保持不变。DummyStudent.class在这两种情况下都起作用但同样的事情不适用于w.r.t学生