添加基于文件路径的动态字段
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>
我正在使用 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>