如何以不区分大小写的形式创建字符串字段的副本?我想使用典型的“字符串”类型和不区分大小写的类型。类型定义如下:
<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 不区分大小写,但从源字段复制的值的大小写被保留。
我希望避免在创建记录时从客户端重新传输字段中的值。
最佳答案
由于没有得到 SO 的答复,我跟进了 SOLR 用户列表。在考虑 copyField 的影响之前,我发现我的 string_ci 字段没有按预期工作。 Ahmet Arslan 解释了为什么“string_ci”字段应该使用 solr.TextField 而不是 solr.StrField:
From apache-solr-1.4.0\example\solr\conf\schema.xml :
"The StrField type is not analyzed, but indexed/stored verbatim."
"solr.TextField allows the specification of custom text analyzers specified as a tokenizer and a list of token filters."
通过他提供的示例和我自己的轻微调整,以下字段定义似乎可以解决问题,现在 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:不区分大小写的通配符搜索无法进行,因为通配符短语绕过查询分析器并且在与索引匹配之前不会被小写。这意味着通配符短语中的字符必须小写才能匹配。
关于solr - 如何在 SOLR 中创建不区分大小写的字符串字段副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2053214/