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

问题描述 投票:1回答:3

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

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

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

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

我的问题是:

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

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

solr lucene data-import zend-search-lucene solr5
3个回答
1
投票

我有一个类似的问题,我必须从生产到QA环境制作副本。我们面临两个问题:

  1. 防火墙阻止QA和生产之间的所有http流量
  2. 由于大量写入和Zookeeper设置超时,快照是不可能的

所以我创建了一个解决方案,只需通过select处理程序检索生产服务器上的所有文档,然后将其转储到xml文件中,将文件复制到QA服务器,然后将它们放在导入可以拾取它们的位置。为了让这个工作花了我太多时间,这是由于我缺乏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文件转储的索引,因此您可以在其中定义所有索引。

在我的一次搜索过程中,我最终得到了这个问题,这里的答案对我有所帮助,但并非完全如此。你看,如果你把它们复制粘贴到SOLR中,Duvo和Segfaulter的例子就不起作用了。例如,如果您不使用正确的大小写,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行,我发现它提供了最佳性能。


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,从Entity下拉列表中选择“solr_doc”,然后单击Execute。

我发现以下链接很有用

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


0
投票

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

有关详细信息,请阅读以下博客:http://blog.trifork.com/2011/11/08/importing-data-from-another-solr/

Data import Handler中使用XPathEntityProcessor

© www.soinside.com 2019 - 2024. All rights reserved.