如何在不区分大小写的表单中创建字符串字段的副本?我想使用典型的"string“类型和不区分大小写的类型。类型的定义如下:
<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" />
但是,显然在调用任何分析器之前,都会在源和dest上调用CopyField,所以即使我通过分析器指定了dest是不区分大小写的,从源字段复制的值的大小写也会保留下来。
我希望避免在创建记录时从客户端重新传输字段中的值。
发布于 2010-01-14 07:00:15
在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字段将存储一个保留大小写的值,但将提供一个不区分大小写的字段以供搜索。注意:无法执行不区分大小写的通配符搜索,因为通配符短语会绕过查询分析器,并且在与索引匹配之前不会小写。这意味着通配符短语中的字符必须为小写才能匹配。
发布于 2013-10-21 10:22:01
是的,没错。LowerCaseFilterFactory不适用于字符串数据类型。我们只能在文本字段上应用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
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"/>