将文档添加到Solr时修剪字段

时间:2013-01-31 09:24:48

标签: solr indexing trim dataimporthandler

我正在使用Solr的DataImportHandler来索引数据库中的某些数据。但是,数据库表方案使用CHAR - 字段,因此它们具有固定宽度并具有一些尾随空格。

我正在尝试使用solr.TrimFilterFactory删除这些尾随空格(修剪它们)。 在我的Solr schema.xml中,我使用以下字段类型来索引数据:

<fieldType name="string" class="solr.TextField" sortMissingLast="true" omitNorms="true">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.TrimFilterFactory" updateOffsets="true" />
    </analyzer>
</fieldType>

所以现在我正在添加一个文档:

<add>
    <doc>
        <field name="test">Test       </field>
    </doc>
</add>

我希望删除测试字段中的尾随空格,但是当我查询:test:Test*时,我得到:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">0</int>
    </lst>
    <result name="response" numFound="1" start="0">
        <doc>
            <str name="test">Test       </str>
        </doc>
    </result>
</response>

如您所见,不删除尾随空格。我必须做错事或误解过滤器的概念。但我的期望是查询将返回:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">0</int>
    </lst>
    <result name="response" numFound="1" start="0">
        <doc>
            <str name="test">Test</str>
        </doc>
    </result>
</response>

所以我的问题是如何确保在索引这些文档时,所有尾随空格都被删除。

3 个答案:

答案 0 :(得分:3)

Solr分析仪/过滤器不会修改存储值 仅修改索引值 因此TrimFilterFactory不会更改存储的值,并返回与输入相同的值。

如果使用DIH,请检查ScriptTransformer以在将值输入Solr之前修改该值。

答案 1 :(得分:1)

使用较新版本的solr,您可以使用TrimFieldUpdateProcessorFactory

<updateRequestProcessorChain name="skip-empty" default="true">

   <processor class="TrimFieldUpdateProcessorFactory" />
   <processor class="RemoveBlankFieldUpdateProcessorFactory" /> 

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

答案 2 :(得分:0)

我正在基于上述Solr 8.4和最新版本详细说明此解决方案。它们制作起来非常容易实现。

我遇到了同样的问题,即我的大多数字段都带有尾部空格,并且在数以百万计的数据文档中,我有很多类似的字段。

我在 SolrConfig.xml 中添加了以下内容 搜索现有的以下标签,然后添加TrimFieldUpdateProcessorFactory,如下所示。仅一行。

<updateRequestProcessorChain .....>
  <processor class="TrimFieldUpdateProcessorFactory" />

</updateRequestProcessorChain>

希望如此简单。