首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Hibernate搜索从索引中省略一些对象?

如何使用Hibernate搜索从索引中省略一些对象?
EN

Stack Overflow用户
提问于 2011-09-27 21:39:33
回答 2查看 907关注 0票数 0

我们想在Hibernate数据库上启用全文搜索,只搜索特定实体的一些对象。有没有办法阻止hibernate search索引这个实体的一些实例?我们不想过滤搜索结果,我们只想让一些实例根本不被索引。

举个例子:我们有一个数据库,里面有在职和退休的员工。我们不需要能够搜索退休员工。我们是一家非常古老的IT公司,成立于1695年,因此我们有大约200万名退休员工,我们非常喜欢,但不想索引,只有10个活跃的。有没有一种方法可以告诉Hibernate Search只对退休= false的员工进行索引?

你好,Jochen

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 15:35:45

我不认为你应该在你的事件监听器中直接使用IndexReader。相反,您应该扩展(或编写一个新版本)现有的,并在回调方法中检查您的实体,这取决于已停用的字段调用或不调用processWork。

如果你想使用Hibernate Search4(以及Hibernate Core4),你还需要一个定制的HibernateSearchIntegrator。

此解决方案是可行的,但在HSEARCH-471实施之前,应将其视为临时解决方案。

票数 0
EN

Stack Overflow用户

发布于 2011-09-27 22:34:52

您将需要一个PreUpdateEventListener,在此侦听器中,检查实体并确定是否要将其添加到lucene索引中。

这段代码不一定能正常工作,但希望您能理解。

代码语言:javascript
复制
public class LuceneUpdateListener implements PreUpdateEventListener {

    protected FSDirectory directory; // = path to lucene index

    public boolean onPreUpdate(PreUpdateEvent event)  {
        if (event.getEntity() instanceof Employee ) {

                try {       

                    Employee employee = (Employee) event.getEntity();

                    //Remove on update
                    remove((Employee) event.getEntity(), (Long) event.getId(), directory);

                    //Add it back if this instance should be indexed
                    try { 
                        if (employee.shouldBeIndexed()) {
                            add((Employee) event.getEntity(), (Long) event.getId(), directory);                         
                        }
                    } 
                    catch (Exception e) {

                    }
                } 
                catch (Exception e) {
                    throw new CallbackException(e.getMessage());
                }
            }
        }
        return false;
    }


    protected synchronized void add(Employee employee, Id employeeId, FSDirectory directory) {
          try{
            IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), false);
            Document d = LuceneDocumentFactory.makeDocument(employee);
            writer.addDocument(d);
            writer.close();
            directory.close();
            }
            catch(Exception e) { 

            }
    }

    protected synchronized void remove(Long id, FSDirectory directory) throws IOException {
            try {
                IndexReader ir = IndexReader.open(directory); 
                ir.deleteDocuments(new Term("id", id.toString()));
                ir.close();
            }        
            catch(Exception e) {                
            }   
    }

    public FSDirectory getDirectory() {
            return directory;
    }

    public void setDirectory(FSDirectory directory) {
        this.directory = directory;
    }

}

为了在hibernate事件之外索引这些对象,您可以从该类中提取逻辑,并批量处理您的员工。

另外,别忘了注册你的监听器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7570122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档