Java Hibernate搜索未根据对“的更改重新编制索引”;“计算的”;价值观

Java Hibernate搜索未根据对“的更改重新编制索引”;“计算的”;价值观,java,hibernate,hibernate-search,Java,Hibernate,Hibernate Search,我们在整个应用程序中使用Hibernate Search(4.1)来管理资源的搜索和索引,但有时需要管理索引中的“计算”值,例如,对@IndexEmbedded或@Field的调用附加到没有实际属性的getter: public class Resource { @ManyToMany(...) private List<Keyword> keywords = new ArrayList<Keyword>();

我们在整个应用程序中使用Hibernate Search(4.1)来管理资源的搜索和索引,但有时需要管理索引中的“计算”值,例如,对@IndexEmbedded或@Field的调用附加到没有实际属性的getter:

    public class Resource {
            @ManyToMany(...)
            private List<Keyword> keywords = new ArrayList<Keyword>();


            public List<Keyword> getKeywords() {
                    return keywords;
            }

            public List<Keyword> setKeywords(List<Keyword> keyword>) {
                    this.keywords=keywords;
            };


            @IndexedEmbedded
            public List<Keyword> getIndexedKeywords() {
                    List<Keyword> toReturn = new ArrayList<Keyword>();
                    for (Keyword keyword: getKeywords()) {
                            if (keyword.isIndexed) {
                                    toReturn.add(keyword);
                            }
                    }
                    return toReturn;
            }

    }
公共类资源{
@许多(…)
私有列表关键字=新建ArrayList();
公共列表getKeywords(){
返回关键字;
}
公共列表设置关键字(列表关键字>){
这个。关键词=关键词;
};
@指数化
公共列表getIndexedKeywords(){
List toReturn=new ArrayList();
对于(关键字:getKeywords()){
如果(关键字.IsIndex){
toReturn.add(关键字);
}
}
回归回归;
}
}

public void saveResource(资源、集合关键字){
resource.getKeywords().retainal(关键字);
resource.getKeywords().addAll(关键字);
session.saveOrUpdate(资源);
//将正确触发数据库中的持久化,但不会触发重新索引
};
但是调用saveResource不会导致HibernateSearch重新编制索引。是吗?

HibernateSearch 4.1(或3.4之后的任何版本)使用“智能”检查来查看是否需要重新编制索引,这与对Hibernate的持久化字段的@IndexedEmbedded调用相匹配。如果这些不匹配,则Hibernate Search不会对对象重新编制索引,因为检查没有看到任何匹配的内容,因此不会调用重新编制索引。这可能是因为HibernateSearch必须对索引字段执行大量的反射和内省,以确定基础值是否已更改,或者计算并存储每次调用的结果,以便确定值是否已更改,因此,这两种方法都会减慢重新编制索引的过程和/或使用存储的哈希值或整个结果值使lucene索引膨胀。可能最好只是污染导致重新索引的字段,或者在末尾手动重新索引对象

public void saveResource(Resource resource, Collection<Keyword> keywords) {
        resource.getKeywords().retainAll(keywords);
        resource.getKeywords().addAll(keywords);
        session.saveOrUpdate(resource);
        // will trigger a persist in the database correctly, but will not trigger a reindex
};