2016-07-22 13 views
2

私はDIHとTikaを使用して、異なる言語のドキュメントをインデックスしています。ファイルパスに基づく動的フィールドの追加

言語ごとにフォルダがあります(例:/de/file001.pdf)。パスから言語を抽出し、言語固有のソルフィールド(例:text_de)を動的に追加したいとします。

は、ここに私の未遂ソリューションです:

<dataConfig> 
    <script><![CDATA[ 
    function addField(row) { 
     row.put('text_' + row.get('lang'), row.get('text')); 
     return row; 
    } 
    ]]></script> 
    <dataSource type="BinFileDataSource" /> 
    <document> 
     <entity name="files" dataSource="null" rootEntity="false" 
      processor="FileListEntityProcessor" 
      baseDir="/tmp/documents" fileName=".*\.(doc)|(pdf)|(docx)" 
      onError="skip" 
      recursive="true" 
      transformer="RegexTransformer" query="select * from files"> 

     <field column="fileAbsolutePath" name="id" /> 
     <field column="lang" regex=".*/(\w*)/.*" sourceColName="fileAbsolutePath"/> 

     <entity name="documentImport" 
      processor="TikaEntityProcessor" 
      url="${files.fileAbsolutePath}" 
      format="text" 
      transformer="script:addField"> 

      <field column="date" name="date" meta="true"/> 
      <field column="title" name="title" meta="true"/> 
     </entity> 

    </entity> 
</document> 

行が「テキスト」フィールドではなく、「LANG」フィールドが含まれているので、これは動作しません。

答えて

1

しかし、問題は、現在の行だけの有効範囲を持つ行を使用しているということです。

親行にアクセスするには、スクリプト関数の第2引数として受け取るコンテキスト変数を使用する必要があります。 Context変数はContextImplの実装を持ち、各スクリプト呼び出しで、Solr ScriptTransformerは同じコンテキストインスタンスを2番目のパラメータ(transformRow参照)として送信します。

次のスクリプトを使用すると、親行からフィールドの値を抽出することができますし、あなたの問題に対処する必要があります。

<dataConfig> 
<script><![CDATA[ 
    function addField(row, context) { 
    var lang = context.getParentContext().resolve('files.lang'); 
    row.put('text_' + row.get('lang'), row.get('text')); 
    return row; 
} 
]]></script> 
関連する問題