har*_*are 25 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>
Run Code Online (Sandbox Code Playgroud)
像这样的领域的一个例子:
<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" />
Run Code Online (Sandbox Code Playgroud)
我试过像这样使用CopyField:
<copyField source="destANYStr" dest="destANYStrCI" />
Run Code Online (Sandbox Code Playgroud)
但是,显然在调用任何分析器之前会在源和目标上调用CopyField,所以即使我通过分析器指定了dest不区分大小写,也会保留从源字段复制的值的大小写.
我希望在创建记录时避免从客户端重新传输字段中的值.
har*_*are 53
由于没有来自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>
Run Code Online (Sandbox Code Playgroud)
destANYStrCI字段将保存一个案例保留值,但将提供不区分大小写的字段以进行搜索.CAVEAT:不能进行不区分大小写的通配符搜索,因为通配符短语绕过查询分析器,并且在与索引匹配之前不会小写.这意味着通配符短语中的字符必须小写才能匹配.
是的,没错.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>
Run Code Online (Sandbox Code Playgroud)
它不起作用,我们必须使用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>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31750 次 |
| 最近记录: |