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