Solr的DataImportHandler是否能够忽略空字符串字段?

3
我将使用Solr的DataImportHandler从数据库中导入数据。如果某列没有值,则其中一些记录将具有空字符串。
目前,我拥有的配置会生成如下所示的Solr文档:
{
    "x": "value",
    "y": "",
    "z": 2
}

然而,我希望忽略所有没有值的字段,使得可以创建这样的文档:

{
    "x": "value",
    "z": 2
}

在DataImportHandler的配置文件中,是否有我可以定义的内容,能够让我得到所需的结果?


查询返回的实际值是什么?NULL 还是空字符串? - MatsLindh
@fiskfisk 数据库返回了一个空字符串。 - robingrindrod
1
那么你的意思是,你想将空字符串进行索引,要么返回null(在SQL中使用IF(...)),要么更改表定义。我非常确定NULL值不会得到一个条目。 - MatsLindh
@fiskfisk 我无法控制数据库,但在 SQL 中放置一个检查是我没有考虑过的。但理想情况下,我希望找到一个作为 DataImportHandler 配置一部分的解决方案,这样如果数据源发生变化(例如从 CSV 导入),它仍然可以工作。如果无法实现这一点,那么使用 SQL 是一个不错的选择。谢谢。 - robingrindrod
2个回答

5
Solr的一个鲜为人知的特性是,您可以插入UpdateRequestProcessor来在DIH之后运行。而且,有专门解决此问题的URP可供使用。
因此,您可以像这样操作:
<updateRequestProcessorChain name="skip-empty">
    <!--  Next two processors affect all fields - default configuration -->
    <processor class="TrimFieldUpdateProcessorFactory" /> <!--  Get rid of leading/trailing spaces. Also empties all-spaces fields for next filter-->
    <processor class="RemoveBlankFieldUpdateProcessorFactory" /> <!--  Delete fields with no content. More efficient and allows to query for presence/absence of field -->

    <processor class="solr.LogUpdateProcessorFactory" />
    <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

显然,在 DIH 处理程序的定义中,还要引用此链:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
  <lst name="defaults">
    ....
    <str name="update.chain">skip-empty</str>
  </lst>
</requestHandler>

您可以在http://solr-start.com上查看UpdateRequestProcessors的完整列表


2
你可以按照我在上面的评论中建议的那样,用SQL来完成这个任务。但如果你想在DIH处理器链中有一个解决方案,使用ScriptTransformer是一个可能的选择。 ScriptTransformer将允许你编写一个小的JavaScript脚本来检查任何列是否为空字符串,并使用row.remove(fieldname)完全删除该字段。
如果你想改为使用纯Java编写,你也可以创建一个可重复使用的自定义转换器来用于DIH。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接