簡體   English   中英

如何將數據從一個 solr 核心導入到另一個 solr 實例

[英]How to import data from one solr core to another solr instance

我需要將數據從一個 Solr 實例導入到另一個實例完整數據和索引導入。

我已經在谷歌搜索並花了一些時間,但我沒有找到合適的解決方案。 這個鏈接有類似的問題,但我找不到正確的答案。

我是 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 中,它們將不起作用。 例如,如果您不使用正確的大小寫,則 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 啟動了完全導入,但您也可以通過數據導入請求觸發此操作。

xsl 轉換由默認的 updateXml.xsl 執行,因此它將理解 SOLR 創建的轉儲輸出並將其自動轉換為索引模式。 至少,如果生產和 QA 之間的模式相同。 ;)

FileListEntityProcessor 還使用正則表達式來攝取多個文件。 這是必要的,因為我們的一些索引包含數百萬個項目,如果您嘗試一次轉換所有項目,Java 進程將很快耗盡內存。 所以我將它們分塊到每個文件 10000 行,我發現它提供了最好的性能。

您可以使用 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

從我的研究來看,這是可能的。 您可以使用數據導入處理程序將數據從一個 SOLR 實例拉入另一個實例,但是話雖如此,它只能索引存儲在源索引中的字段。

有關更多詳細信息,您可以閱讀以下博客: http : //blog.trifork.com/2011/11/08/importing-data-from-another-solr/

數據導入處理程序中使用 XPathEntityProcessor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM