为什么 Hibernate Search 不提供新插入的记录?
Why Hibernate Search is not giving newly inserted records?
我是 hibernate Lucene 搜索的新手。在我的应用程序中,我有一些旧数据,我知道 hibernate Lucene 不知道事务。因此,对于那些旧数据,我手动创建了索引,因此它工作起来非常棒,但它没有给出新 inserted/updated 记录的结果。但是,如果我在这些记录到来时再次进行手动索引。我认为通过休眠 ORM 索引 inserted/updated 的记录将自动更新,对吗??。如果是这里意味着为什么它不是 coming.Please 帮我一些建议。
这是我的代码片段
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;
}
同样我为技能添加了索引
- 检查您的
hibernate.search.indexing_strategy
配置 属性。如果设置为 manual
,则表示您禁用了自动索引。您应该将其设置为 event
.
- 检查你的日志。在某些情况下,索引时可能会出现异步错误,这不会使您的交易失败,但仍然无法索引您的实体。
- 检查您的查询。更改参数时,它是否与您的质量索引实体匹配?
- 如果上述 none 解决了问题,请告诉我们您 add/update 实体(处理
EntityManager
/Session
的代码)的具体情况,以及你如何管理你的事务(Hibernate Search 通常在你的事务被提交时触发索引)
我遇到了同样的问题 problem.I 认为这也是 reason.It 之一将取决于保存 entity.If 你在你的情况下保存主要实体,即 Student.class@IndexedEmbedded enough.Where 就好像你在 child 上执行 Hibernate 操作意味着你必须通过使用 @IndexedEmbedded 和 @[=23 建立 bi-directional 关系=] 认为您在关系的另一端错过了 @ContainedIn,这就是索引未更新的原因。
在 Profile Summary 实体以及 StudentSkill 实体中:
@OneToOne
@JoinColumn(name="student_student_id")
@ContainedIn
private Student student
我是 hibernate Lucene 搜索的新手。在我的应用程序中,我有一些旧数据,我知道 hibernate Lucene 不知道事务。因此,对于那些旧数据,我手动创建了索引,因此它工作起来非常棒,但它没有给出新 inserted/updated 记录的结果。但是,如果我在这些记录到来时再次进行手动索引。我认为通过休眠 ORM 索引 inserted/updated 的记录将自动更新,对吗??。如果是这里意味着为什么它不是 coming.Please 帮我一些建议。
这是我的代码片段
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;
}
同样我为技能添加了索引
- 检查您的
hibernate.search.indexing_strategy
配置 属性。如果设置为manual
,则表示您禁用了自动索引。您应该将其设置为event
. - 检查你的日志。在某些情况下,索引时可能会出现异步错误,这不会使您的交易失败,但仍然无法索引您的实体。
- 检查您的查询。更改参数时,它是否与您的质量索引实体匹配?
- 如果上述 none 解决了问题,请告诉我们您 add/update 实体(处理
EntityManager
/Session
的代码)的具体情况,以及你如何管理你的事务(Hibernate Search 通常在你的事务被提交时触发索引)
我遇到了同样的问题 problem.I 认为这也是 reason.It 之一将取决于保存 entity.If 你在你的情况下保存主要实体,即 Student.class@IndexedEmbedded enough.Where 就好像你在 child 上执行 Hibernate 操作意味着你必须通过使用 @IndexedEmbedded 和 @[=23 建立 bi-directional 关系=] 认为您在关系的另一端错过了 @ContainedIn,这就是索引未更新的原因。
在 Profile Summary 实体以及 StudentSkill 实体中:
@OneToOne
@JoinColumn(name="student_student_id")
@ContainedIn
private Student student