如何在SOLR中创建字符串字段的不区分大小写的副本?

时间:2010-01-12 23:20:57

标签: solr case-insensitive

如何以不区分大小写的形式创建字符串字段的副本?我想使用典型的“字符串”类型和不区分大小写的类型。类型的定义如下:

    <fieldType name="string" class="solr.StrField"
        sortMissingLast="true" omitNorms="true" />

    <!-- A Case insensitive version of string type  -->
    <fieldType name="string_ci" class="solr.StrField"
        sortMissingLast="true" omitNorms="true">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>           
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType> 

这个领域的一个例子如下:

<field name="destANYStr" type="string" indexed="true" stored="true"
    multiValued="true" />
<!-- Case insensitive version -->
<field name="destANYStrCI" type="string_ci" indexed="true" stored="false" 
    multiValued="true" />

我尝试使用CopyField,如下所示:

<copyField source="destANYStr" dest="destANYStrCI" />

但是,显然在调用任何分析器之前会在source和dest上调用CopyField,所以即使我通过分析器指定了dest不区分大小写,也会保留从源字段复制的值的情况。

我希望在创建记录时避免从客户端重新传输字段中的值。

2 个答案:

答案 0 :(得分:51)

没有来自SO的答案,我跟进了SOLR用户列表。我发现即使考虑到copyField的影响,我的string_ci字段也没有按预期工作。 Ahmet Arslan解释了为什么“string_ci”字段应该使用solr.TextField而不是solr.StrField:

  

来自apache-solr-1.4.0 \ example \ solr \ conf \ schema.xml:

     

“未分析StrField类型,但逐字索引/存储。”

     

“solr.TextField允许指定自定义文本分析器,指定为标记器和令牌过滤器列表。”

通过他自己提供的示例和稍微调整,以下字段定义似乎可以解决问题,现在CopyField也按预期工作。

    <fieldType name="string_ci" class="solr.TextField"
        sortMissingLast="true" omitNorms="true">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>           
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType> 

destANYStrCI字段将保存一个案例保留值,但会提供一个不区分大小写的字段来搜索。 CAVEAT:不能进行不区分大小写的通配符搜索,因为通配符短语绕过查询分析器,并且在与索引匹配之前不会小写。这意味着通配符短语中的字符必须小写才能匹配。

答案 1 :(得分:7)

是的,是的。 LowerCaseFilterFactory不适用于String数据类型。我们只能在Text字段中应用LowerCaseFilterFactory。

如果你尝试这样做

<!-- Assigning customised data type -->
<field name="language" type="text_lower" indexed="true" stored="true"  multiValued="false" default="en"/>  

<!-- Defining customised data type for lower casing. -->
<fieldType name="text_lower" class="solr.String" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

它不起作用,我们必须使用TextField。

尝试这种方式,它应该工作。只需将fieldType从String更改为TextField

即可

<!-- Assigning customised data type -->
<field name="language" type="text_lower" indexed="true" stored="true"  multiValued="false" default="en"/>  

<!-- Defining customised data type for lower casing. -->
<fieldType name="text_lower" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>