0

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

我正在尝试使用solr.TrimFilterFactory. 在我的 Solrschema.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>

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

4

3 回答 3

4

Solr 分析器/过滤器不会修改存储的值。
只有索引值会被修改。
所以TrimFilterFactory不会改变存储的值,并且会返回与输入相同的值。

如果使用 DIH,请检查ScriptTransformer以在将值馈送到 Solr 之前对其进行修改。

于 2013-01-31T09:58:40.113 回答
1

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

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

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

   <processor class="solr.LogUpdateProcessorFactory" />
   <processor class="solr.RunUpdateProcessorFactory" />    
</updateRequestProcessorChain>
于 2016-02-16T17:06:19.987 回答
0

我正在根据以上 Solr 8.4 和最新版本详细说明此解决方案。他们制作的很容易实现。

我有同样的问题,我的大部分字段都有尾随空格,并且在数百万个数据文档中我有很多这样的字段。

我在SolrConfig.xml中添加了下面的行 搜索现有的下面的标签并添加 TrimFieldUpdateProcessorFactory 如下所示。只有一行。

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

</updateRequestProcessorChain>

希望这很容易。

于 2020-05-26T21:49:49.290 回答