27

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

    <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" />

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

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

4

2 回答 2

54

在 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:不能进行不区分大小写的通配符搜索,因为通配符短语绕过查询分析器并且在匹配索引之前不会被小写。这意味着通配符短语中的字符必须小写才能匹配。

于 2010-01-13T23:00:14.903 回答
7

是的,没错。LowerCaseFilterFactory 不适用于 String 数据类型。我们只能在文本字段上应用 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 从更改StringTextField

<!-- 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>

于 2013-10-21T02:22:01.373 回答