1

我们在整个应用程序中使用 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;
            }

    }

...

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
};

但调用 saveResource 不会导致 HibernateSearch 重新索引。不应该吗?

4

1 回答 1

0

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

于 2012-08-09T20:23:16.297 回答