gpt4 book ai didi

solr - 如何将数据从一个solr core导入到另一个solr实例

转载 作者:行者123 更新时间:2023-12-05 01:46:09 28 4
gpt4 key购买 nike

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

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

我是 Solr 的新手,希望我能提供一些帮助。

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

我的问题是:

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

在此先感谢您提供任何类型的帮助或信息。

最佳答案

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

  1. 防火墙阻止 QA 和生产之间的所有 http(s) 流量
  2. 由于大量写入和 Zookeeper 设置超时,无法创建快照

所以我创建了一个解决方案,只需通过选择处理程序检索生产服务器上的所有文档并将其转储到 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 文件中转储的索引,因此您可以在其中定义所有索引。

在我的一次搜索中,我最终找到了这个问题,这里的答案对我的导入有一些帮助,但不完全是。你看,如果将 Duvo 和 Segfaulter 的示例复制粘贴到 SOLR 中,它们将不起作用。例如,如果您没有使用正确的大小写,则 requestHandler 标记将被 SOLR 忽略。

这是我添加到 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 启动了完全导入,但您也可以通过数据导入请求触发它。

xsl 转换由默认的 updateXml.xsl 执行,因此它将理解 SOLR 创建的转储输出并将其自动转换为索引架构。至少,如果生产和 QA 之间的模式相同。 ;)

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

关于solr - 如何将数据从一个solr core导入到另一个solr实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com