在运行时更改hibernate索引位置(lucene)时索引不会存储在新位置

时间:2014-07-07 04:41:01

标签: java hibernate hibernate-search

我在我的应用程序中要求我们需要在用户的基础上存储索引,所以我试图在运行时更改位置,但索引不会存储在新位置,如果我在配置文件中给出相同的位置然后它正在存储

我使用以下代码更改位置

LocalSessionFactoryBean localSessionFactoryBean

localSessionFactoryBean.getConfiguration() .setProperty("hibernate.search.default.indexBase", "New_loc") 
localSessionFactoryBean.getObject().getCurrentSession() //on this session object i am doing DAO opertation .

我在配置文件中给出的休息配置。我投入了3天的时间来找到解决方案,但没有成功。任何帮助将非常感激。 我的会话代码如下:

protected Session getSession() {

        Configuration conf=sessionFactory.getConfiguration();


        conf.setProperty("hibernate.search.default.indexBase","c:\\testdata" /*CustomerContextHolder.getFile()!=null?CustomerContextHolder.getFile():defaultFileLocation*/);

        ContextHolder.getOrBuildSearchFactory(conf);
        return sessionFactory.getObject().getCurrentSession();
        //  sessionFactory.getObject().openSession();
    }

和Bean正在关注

              

<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
        <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>  <!-- Options are [validate, create, update, create-drop] -->
         <!-- <prop key="hibernate.current_session_context_class">thread</prop> -->

        <!-- Connection pool size -->
        <prop key="hibernate.connection.pool_size">${hibernate.connection.pool_size}</prop>

    issue -->
        <prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.impl.FSDirectoryProvider</prop>
        <prop key="hibernate.search.default.locking_strategy">single</prop>
    <prop key="hibernate.search.default.indexBase">c:\abc</prop>
        <prop key="hibernate.search.lucene_version">LUCENE_35</prop>
    </props>

</property>

更新代码:

Session getSession() {

        Configuration conf=sessionFactory.getConfiguration();

                conf.setProperty("hibernate.search.default.indexBase","c:\\testdata");
        //conf.configure(); Need to commented otherwise shwoing duplicate Property

        ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(
                conf.getProperties()).buildServiceRegistry();
        return   (Session) conf.buildSessionFactory(serviceRegistry).openSession();

    }

3 个答案:

答案 0 :(得分:2)

尝试这样做:(对于Hibernate 4.x)

Configuration cfg = localSessionFactoryBean.getConfiguration();
cfg .setProperty("hibernate.search.default.indexBase", "New_loc");
cfg.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(
            cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);

答案 1 :(得分:1)

我不确定这种动态变化的索引库是否有效。重建工厂似乎也很狡猾。您是否看过索引分片 - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#advanced-features-dynamic-sharding。这应该允许您根据让我们说的用户ID分割数据。

如果分片无法解决您的问题,您可以优化实际的用例。也许有另一种解决方案。

答案 2 :(得分:0)

经过多次努力之后我终于找到了原因。如果我在每次数据库写入后关闭sesson,那么只有索引文件会存储在新的位置。但这不是有效的方法,但这是它是如何工作的