2016-07-22 28 views
2

Ich verwende DIH und Tika, um Dokumente in verschiedenen Sprachen zu indizieren.Dynamisches Feld basierend auf Dateipfad hinzufügen

Es gibt einen Ordner für jede Sprache (z. B. /de/file001.pdf), und ich möchte die Sprache aus dem Pfad extrahieren und dann das sprachspezifische solr-Feld dynamisch hinzufügen (z. B. text_de).

Hier ist meine versuchte Lösung:

<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> 

Dies funktioniert nicht, weil Zeile mit dem 'Text' Feld enthält aber nicht das 'lang' Feld.

Antwort

1

Der Ansatz ist korrekt, das Problem besteht jedoch darin, dass Sie eine Zeile verwenden, die nur die aktuelle Zeile als Bereich enthält.

Um auf die übergeordnete Zeile zugreifen zu können, müssen Sie die Kontextvariable verwenden, die Sie als zweiten tatsächlichen Parameter zur Skriptfunktion erhalten. Die Context-Variable hat die ContextImpl -Implementierung und bei jedem Skriptaufruf sendet Solr ScriptTransformer Ihnen als zweiten Parameter (siehe transformRow) dieselbe Context-Instanz.

Das folgende Skript ermöglicht es Ihnen, Feldwert aus der übergeordneten Zeile zu extrahieren und Ihr Problem lösen soll:

<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>