如何将数据从一个solr核心导入另一个solr实例

时间:2016-05-11 21:42:35

标签: solr lucene data-import zend-search-lucene solr5

我需要将数据从一个Solr实例导入另一个实例完整数据和索引导入。

我在谷歌搜索并花了一些时间,但我找不到合适的解决方案。这个link有类似的问题,但我找不到合适的答案。

我是Solr的新手,希望我能得到一些帮助。

我有一个在远程盒子中运行的实时运行实例我需要在另一个数据中有类似的数据集。所以我认为应该可以完全导入数据。

我的问题是:

  • 现有Solr是否支持完整数据集导入或任何工具?或
  • 我需要为此目的编写一些自定义数据处理程序吗?

提前感谢任何帮助或信息。

3 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我必须将生产环境的副本复制到我们的质量检查环境中。我们面临两个问题:

  1. 防火墙阻止了质量检查和生产之间的所有HTTP流量
  2. 由于大量写入操作和Zookeeper设置超时,无法拍摄快照

因此,我创建了一个解决方案,方法是简单地通过选择处理程序检索生产服务器上的所有文档,然后将其转储到xml文件中,将文件复制到质量检查服务器中,然后将其放置在导入可以拾取它们的位置。要使它生效,我花了太多时间,这是由于我缺乏对SOLR的了解,而且还因为互联网上的大多数示例都是错误的,并且每个人都在互相复制。因此,我在这里分享我的解决方案。

我的转储文档脚本:

#!/bin/bash
SOURCE_SOLR_HOST='your.source.host'
SOLR_CHUNK_SIZE=10000
DUMP_DIR='/tmp/'

indexesfile='solr-indexes.txt'
for index in `cat $indexesfile`; do
  solrurl="http://${SOURCE_SOLR_HOST}:8983/solr/$index/select?indent=on&q=*:*&wt=xml"
  curl "${solrurl}&rows=10" -o /tmp/$index.xml
  numfound=`grep -i numfound /tmp/$index.xml | sed -e 's/.*numFound=\"\([0-9]*\)\".*/\1/'`
  chunks=$(expr $numfound / $SOLR_CHUNK_SIZE )
  for chunk in $( eval echo {0..$chunks}); do
    start_at=$(expr $chunk \* $SOLR_CHUNK_SIZE )
    curl "${solrurl}&rows=${SOLR_CHUNK_SIZE}&start=${start_at}" -o ${DUMP_DIR}solr/${index}_${chunk}.xml
  done
  rm /tmp/$index.xml
done

它正在读取要从solr-indexes.txt文件中转储的索引,因此您可以在其中定义所有索引。

在我进行的一次搜索中,我最终遇到了这个问题,这里的答案对我的导入有所帮助,但并非完全如此。您会看到,如果将Duvo和Segfaulter的示例复制粘贴到SOLR中,则它们将无效。例如,如果您使用的大小写不正确,则SOLR会忽略requestHandler标记。

这是我添加到solrconfig中的正确格式:

  <lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-7.5.0.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-extras-7.5.0.jar" />
  <requestHandler class="org.apache.solr.handler.dataimport.DataImportHandler" name="/dataimport">
  <lst name="defaults">
      <str name="config">data-config.xml</str>
  </lst>
  </requestHandler>

对于data-config.xml,我使用了类似的内容:

<dataConfig>
  <dataSource type="FileDataSource" />
  <document>
    <entity
      name="yourindexhere"
      processor="FileListEntityProcessor"
      baseDir="/solr-import/"
      fileName="yourindexhere_.*"
      preImportDeleteQuery="*:*"
      recursive="false"
      rootEntity="false"
      dataSource="null">
      <entity
        name="file"
        processor="XPathEntityProcessor"
        url="${yourindexhere.fileAbsolutePath}"
        xsl="xslt/updateXml.xsl"
        useSolrAddSchema="true"
        stream="true">
      </entity>
    </entity>
  </document>
</dataConfig>

我将所有转储都复制到/ solr-import /目录中,并将上述配置应用于每个索引配置。通过UI,我启动了完全导入,但是您也可以通过dataimport请求触发此操作。

xsl转换由默认的updateXml.xsl执行,因此它将了解SOLR创建的转储输出并将其自动转换为索引模式。至少,这就是生产和质量检查之间的架构是否相同。 ;)

FileListEntityProcessor还使用正则表达式来提取多个文件。这是必要的,因为我们的某些索引包含数百万个项目,如果您尝试一次转换所有项目,则Java进程将很快耗尽内存。因此,我将它们分块为每个文件10000行,发现性能最佳。

答案 1 :(得分:0)

我可以从我的研究中看到这一点。您可以使用数据导入处理程序将数据从一个SOLR实例提取到另一个实例,但是如果说它只能索引源索引中stored的字段。

了解更多详情,您可以阅读以下博客: http://blog.trifork.com/2011/11/08/importing-data-from-another-solr/

使用Data import Handler

中的XPathEntityProcessor

答案 2 :(得分:0)

您可以使用Solr DataImportHandler将数据从一个Solr实例导入另一个。

  1. 更新solrconfig.xml以配置DataImportHandler设置

    <requesthandler class="org.apache.solr.handler.dataimport.DataImportHandler" name="/dataimport">
    <lst name="defaults">
        <str name="config">solr-data-config.xml</str>
    </lst>
    

  2. 在data-config.xml中输入以下内容。

    <dataConfig>
    <document>
       <entity name="solr_doc" processor="SolrEntityProcessor" 
        query="mimeType:pdf" 
        url="http://your.solr.server:8983/solr/your-core">
       </entity>
    </document>
    </dataConfig>
    
  3. 转到目标Solr管理控制台,单击DataImport,选择&#34; solr_doc&#34;从Entity下拉列表中,单击Execute。

  4. 我发现以下链接很有用

    http://blog.trifork.com/2011/11/08/importing-data-from-another-solr/ https://wiki.apache.org/solr/DataImportHandler#SolrEntityProcessor