Myblog1.5七夕版发布了 xubuntu下stardict发音的问题
Aug 23

Compass是对lucene进行封装的java项目,使得在spring,hibernate这种环境下非常容易的实现全文检索,也极大的提高了效率。所以在myblog里面我也使用了compass作为全文索引。
从Compass的samples里面的petclinic里面可以找到Compass的配置。
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <property name="resourceLocations">
            <list>
                <value>classpath:org/compass/sample/petclinic/petclinic.cmd.xml</value>
                <value>classpath:petclinic.cpm.xml</value>
            </list>
        </property>
        <property name="compassSettings">
            <props>
                <prop key="compass.engine.connection">file://${user.home}/compass/petclinic</prop>
                <prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
            </props>
        </property>
        <property name="transactionManager">
            <ref local="transactionManager" />
        </property>
    </bean>

这里配置的索引位置是用的系统的绝对路径,可能大部分的人还是希望索引能放到项目的一个子目录里面,就是使用相对路径的方式。但是如果直接修改 <prop key="compass.engine.connection">file://${user.home}/compass/petclinic</prop> 为 <prop key="compass.engine.connection">/compass/petclinic</prop> 这样是不行的。刚开始我也是这样修改的。其实我们看一下LocalCompassBean的源代码就知道怎么做了。
        if (this.compassSettings != null) {
            config.getSettings().addSettings(this.compassSettings);
        }
       ......
        if (config.getSettings().getSetting(CompassEnvironment.CONNECTION) == null && connection != null) {
            config.getSettings().setSetting(CompassEnvironment.CONNECTION, connection.getFile().getAbsolutePath());
        }

  这里可以看到如果你配置compassSettings的时候配置过compass.engine.connection的话compass就会使用你配置的值也就是绝对路径。如果你没有配置就会去读connection的值,而connection的类型是org.springframework.core.io.Resource,这个是spring封装的资源类,提供很多种访问方式 file classpath ,这里就可以使用相对路径了。去掉compassSettings里面的compass.engine.connection 的配置,加上connection的配置就可以实现相对路径了。比如myblog里面的配置
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <property name="resourceDirectoryLocations">
            <list>
                <value>classpath:com/jdkcn/compass</value>
            </list>
        </property>
        <property name="connection">
            <value>/lucene/indexes</value>
        </property>
        <property name="compassSettings">
            <props>
                <prop key="compass.transaction.factory">
                    org.compass.spring.transaction.SpringSyncTransactionFactory
                </prop>
            </props>
        </property>
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
    </bean>

webapp启动之后compass就会在你的应用的/lucene/indexes目录下建立索引了。


Like others

5 Responses to “如何配置compass的索引位置为相对路径”

  1. Leo Says:

    您好,
           很冒昧的给你留言。我想用compass做一个站内的搜索引擎,但不知道怎么下手,能给点建议吗?
            谢谢了!

  2. 莫多(somebody) Says:

    不知道你要索引的是静态文件还是数据库里的内容。如果你是索引的数据库的内容的话,你可以下载myblog的代码看看里面compass的部分。谢谢支持。

  3. Sutra Says:

    我发现Leo问的问题好像问过我,而且我的回复和莫多的回复出奇的一致,哈哈哈哈。

  4. vincent Says:

    我想用compass实现高级搜索。请给点建议,谢谢

  5. 莫多(somebody) Says:

    你能说说怎样的高级搜索么?

Leave a Reply

Identifying Code