1

所以我一直在通过混合 Spring Beans xml 配置和 Lucene 来测试我的一个小实验(或者我认为这更像是我懒得将所有这些都放入 java 代码中)。

基本上,我不必编写所有先决条件来制作 IndexWriter,我只是将它的一个实例注入到一个类中。(是的,我就是这么懒)

但是,我在尝试通过 bean 实例化 SimpleFSDirectory 时遇到了一些困难,特别是,我希望我的 Lucene 索引位于相对于 web-app 的路径中。(也许 /WEB-INF/lucene-indexes 什么的)

我目前的配置是这样的:

<bean id="standardAnalyzer" class="org.apache.lucene.analysis.standard.StandardAnalyzer">
    <!-- org.apache.lucene.util.Version -->
    <constructor-arg>
        <value>LUCENE_44</value>
    </constructor-arg>
</bean>

<bean id="fileDir" class="java.io.File">
<constructor-arg index="0">
        <value>classpath:/test-lucene-store</value>
    </constructor-arg>
</bean>

<bean id="directory" class="org.apache.lucene.store.SimpleFSDirectory">
    <constructor-arg index="0">
        <ref bean="fileDir"/>
    </constructor-arg>
</bean>

<bean id="indexWriterConfig" class="org.apache.lucene.index.IndexWriterConfig">
    <constructor-arg index="0">
        <value>LUCENE_44</value>
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="standardAnalyzer" />
    </constructor-arg>
</bean>

<bean id="indexWriter" class="org.apache.lucene.index.IndexWriter">
    <constructor-arg index="0">
        <ref bean="directory" />
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="indexWriterConfig" />
    </constructor-arg>
</bean>

我的测试日志说这classpath:**不是一个有效的路径,但是如果我简单地使用/lucene-store,索引是在D://lucene-store(远离预期目标)创建的

你们中有人知道实现目标的方法吗?

4

1 回答 1

1

使用java.io.File实现文件系统位置,而不是classpath条目。当然,你总是可以参考一个爆炸的 .war 并做这样的事情(在 Tomcat 上):

<value>#{ systemProperties['catalina.base'] }/webapps/myapp.war/WEB-INF/lucene-store</value>

但是,更灵活的方法是将值保存在外部位置(例如属性文件):

<value>#{ myConfig['lucene-store-root'] }</value>

...甚至使用java.io.tmpdir系统属性进行测试:

<value>#{ systemProperties['java.io.tmpdir'] }/lucene-store</value>

您还可以切换到不同的目录实现(示例)。

于 2013-08-29T07:00:53.933 回答