添加基于文件路径的动态字段

Add dynamic field based of file path

我正在使用 DIH 和 Tika 为不同语言的文档编制索引。

每种语言都有一个文件夹(例如 /de/file001.pdf),我想从路径中提取语言,然后动态添加特定于语言的 solr 字段(例如 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>

这不起作用,因为行包含 'text' 字段但不包含 'lang' 字段。

该方法是正确的,但问题是您使用的行的作用域仅为当前行。

为了访问父行,您必须使用您收到的上下文变量作为脚本函数的第二个实际参数。 Context 变量具有 ContextImpl implementation and on each script invocation, Solr ScriptTransformer will send you as second parameter (see transformRow) 相同的 Context 实例。

以下脚本将允许您从父行中提取字段值,应该可以解决您的问题:

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