2017-09-29 13 views
1

私はLucene検索を休止するのが初めてです。私のアプリケーションでは、私は冬眠Luceneがトランザクションを認識していない古いデータがあります。その古いデータでは、インデックスを手動で作成しているので、魅力的に機能していますが、新しく挿入/更新されたレコードの結果は得られません。しかし、その時点で手動でインデックスを作成している場合は、そのレコードが来ています。私はハイバネートORMインデックスを介して挿入/更新されるレコードは自動的に更新されると私は思う?はい、ここに来ていない理由を意味する場合は、私にいくつかの提案を助けてください。なぜHibernate Searchは新しく挿入されたレコードを与えていないのですか?

これは私の検索コード私のスニペット

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; 

} 

Similary私のマッピング実体である私は、スキル

答えて

1

はreason.Itのこのも1がStudent.classが十分に@IndexedEmbeddedつまり、あなたの場合には、メインエンティティを保存しているentity.Ifの保存に依存すると思います。子としてHibernate Operationsを実行している場合は、@IndexedEmbeddedと@ ContainedInを使用して双方向関係を確立する必要があります。他のsiで@ContainedInを見つけられなかったと思いますインデックスが更新されていない理由です。

プロファイルの概要エンティティで

と同様StudentSkillエンティティ上:

@OneToOne 
    @JoinColumn(name="student_student_id") 
    @ContainedIn 
    private Student student 
0
    用のインデックスを追加しました
  1. hibernate.search.indexing_strategy設定プロパティを確認してください。 manualに設定されている場合は、自動インデックス設定が無効になっています。これをeventに設定する必要があります。
  2. ログを確認してください。場合によっては、インデックス作成中に非同期エラーが発生することもありますが、トランザクションが失敗することはありませんが、依然としてエンティティのインデックスには失敗します。
  3. クエリを確認してください。パラメータを変更すると、マスインデックスされたエンティティと一致しますか?
  4. 上記のいずれも問題が解決しない場合は、エンティティの追加/更新(コードEntityManager/Session)とトランザクションの管理方法を教えてください(Hibernate Searchは通常、トランザクションがコミットされたときにインデックスを作成します)私はproblem.Iの同じ種類に直面していました
+0

1.Iはindexing_strategyに関連するすべてのプロパティを言及していません。 2.Andトランザクションに関連するエラーはありません。実際には私の問題は何ですか、上のスニペットの主なエンティティはStudent.classです。同じような関係のDummyStudent.classというエンティティがもう1つあります.DummyStudent.classを使用しています私の春のアプリケーションを介して来ている実際のデータです。ダミーデータを格納するために私はHibernate session.DummyStudent.classを介して永続的な別のGUIを作成しました両方の場合に働いています。同じことwrt学生 –

関連する問題