Solr:更改Windows中的数据目录

我试图改变我的Solr核心的数据直接从实例目录下的默认“数据”目录。 我使用绝对path,因为我的Solr核心的实例和conf目录被埋在其他地方(在我的GitHub目录中)。 我认为这将是core.properties中指定这个容易:

dataDir=C:\foo\bar\my_new_data_directory 

在'my_new_data_directory'目录里面有以下的Solr目录:

 - index - tlog 

我正在使用Windows,启动Solr时出现以下错误:

 ERROR - 2014-01-17 12:40:34.578; org.apache.solr.core.CoreContainer; Unable to create core: collection1 org.apache.solr.common.SolrException at org.apache.solr.core.SolrCore.<init>(SolrCore.java:680) at org.apache.solr.core.SolrCore.<init>(SolrCore.java:625) at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:557) at org.apache.solr.core.CoreContainer.create(CoreContainer.java:592) at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:271) at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:263) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: The filename, directory name, or volume label syntax is incorrect at java.io.WinNTFileSystem.canonicalize0(Native Method) at java.io.Win32FileSystem.canonicalize(Unknown Source) at java.io.File.getCanonicalPath(Unknown Source) at org.apache.solr.core.StandardDirectoryFactory.normalize(StandardDirectoryFactory.java:47) at org.apache.solr.core.DirectoryFactory.getDataHome(DirectoryFactory.java:246) at org.apache.solr.core.SolrCore.<init>(SolrCore.java:677) ... 13 more 

它看起来像我没有正确指定文件path。 它应该如何指定?

由于变量替换工作不正常,我停止使用core.properties几个版本,但是我可以在sorl.xml中执行此操作:

  <core name="core0" instanceDir="core0" dataDir="c:\temp\data" /> 

索引路径得到适当的拾取。

我认为这需要在这样的tomcat(或同等)指定:

 export JAVA_OPTS="$JAVA_OPTS -Dsolr.data.dir=C:\foo\bar\my_new_data_directory" 

solrconfig.xml像这样查找它:

 <dataDir>${solr.data.dir:}</dataDir> 

我也注意到有些人这样做:

打开solrconfig.xml

 <dataDir>${solr.data.dir}</dataDir> by following <dataDir>${solr.data.dir:/opt/solr/example/solr/data}</dataDir> 

这不是最优雅的,但是我可以正确地工作的唯一方法是将完整路径硬编码到solrconfig.xml中,如下所示:

 <dataDir>C:/foo/bar/my_new_data_directory/core1</dataDir> 

更新(2014-02-14)

我意识到,我可以结合几种方法来获得所需的结果。

启动Solr时,我可以包含这个参数:

 data.dir=C:/foo/bar/my_new_data_directory/ 

然后在solrconfig.xml中,我可以在启动时将参数设置为我的数据目录的前缀:

 <dataDir>${solr.data.dir:}core1</dataDir> 

这会将数据目录设置为:C:/ foo / bar / my_new_data_directory / core1

使用这种技术,我可以在不使用硬编码的情况下在solrconfig.xml中支持多个内核:

 C:/foo/bar/my_new_data_directory/core1 C:/foo/bar/my_new_data_directory/core2 

核心名称不是在路径中硬编码,您可以使用内置的${solr.core.name}变量,该变量应该自动设置为核心名称。

我使用它来推广Solr实例和核心中的一些主/从复制路径,并且工作良好。

我也用它作为一个建议索引,似乎没有默认为相同的数据目录作为核心的主要索引(我会说这个错误)。 所以我们用这样的东西来硬编码该提示器的索引目录(这是中缀分析器的可选值,但是这个概念适用于solrconfig.xml任何地方):

 <str name="indexPath">C:/indexes/${country}/${solr.core.name}/data/suggest_tag</str> 

${country}值是在solrcore.properties创建的,例如country=US ,所以我们可以在不同的solr实例之间概括这个设置。 这可能会给你更多的想法,可以做些什么。

我相信solrcore.properties / core.properties的正确语法是:

 solr.data.dir=/path/foo/here 

要么:

 solr.data.dir=C:\\foo\\bar\\data 

在Windows上我认为你应该使用上面的双反斜杠。

如果这不起作用,错误:

java.io.IOException:文件名,目录名称或卷标语法不正确

可能与已经修复的SOLR-4810错误有关。