【问题标题】:Why Hibernate Search is not giving newly inserted records?为什么 Hibernate Search 不提供新插入的记录?
【发布时间】:2017-09-29 06:47:49
【问题描述】:

我是休眠 Lucene 搜索的新手。在我的应用程序中,我有一些旧数据,我知道休眠 Lucene 不知道事务。所以对于那些旧数据,我手动创建了索引,所以它就像一个魅力,但它没有为新插入/更新的记录提供结果。但是,如果我在这些记录即将到来时再次进行手动索引。我认为通过休眠 ORM 索引插入/更新的记录将自动更新,对吗??如果是的意思是这里为什么它不来。请帮助我一些建议。

这是我的sn-p

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 lucene hibernate-search


    【解决方案1】:

    我遇到了同样的问题。我认为这也是原因之一。这取决于保存实体。如果你在你的情况下保存主要实体,即 Student.class@IndexedEmbedded .如果您在子节点上执行休眠操作意味着您必须使用@IndexedEmbedded 和@ContainedIn 建立双向关系。我认为您在关系的另一端错过了@ContainedIn,这就是索引不更新的原因。

    在个人资料摘要实体以及 StudentSkill 实体中:

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

    【讨论】:

      【解决方案2】:
      1. 检查您的hibernate.search.indexing_strategy 配置属性。如果设置为manual,则表示您禁用了自动索引。您应该将其设置为 event
      2. 检查您的日志。在某些情况下,编制索引时可能会出现异步错误,这不会导致您的事务失败,但仍无法为您的实体编制索引。
      3. 检查您的查询。更改参数时,它是否与您的海量索引实体匹配?
      4. 如果以上方法都不能解决问题,请告诉我们您添加/更新实体的具体方式(处理 EntityManager/Session 的代码),以及您如何管理事务(Hibernate Search 通常在以下情况下触发索引您的交易已提交)

      【讨论】:

      • 1.我没有提到任何与 indexing_strategy 相关的属性。 2.并且没有与交易相关的错误。实际上我的问题是,在上面的sn-p主要实体是Student.class,同样我还有一个名为DummyStudent.class的实体具有相同的关系。我正在使用DummyStudent .class 用于初始数据,Student.class 是通过我的 Spring 应用程序传入的实际数据。为了存储虚拟数据,我创建了一个单独的 GUI,它将通过 Hibernate 会话持续存在。DummyStudent.class 在这两种情况下都有效。但同样的事情不是与学生一起工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2017-04-03
      • 2019-06-19
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多