Solr:如何在string类型字段中忽略大小写搜索记录?
我来帮你搞定这个Solr大小写不敏感搜索的问题~你的核心问题在于当前app_name字段的配置没有处理大小写转换,导致只有精确匹配(大小写一致)才能命中结果。下面是具体的解决步骤:
1. 先排查字段类型的问题
首先去你的Solr配置文件(schema.xml或者managed-schema)里看app_name字段的定义。如果它用的是string类型,那这就是根源:
<field name="app_name" type="string" indexed="true" stored="true"/>
string类型是精确匹配类型,不会对文本做任何分词、大小写转换处理,所以只能和原字符串(比如atm)完全一致才能搜到。
2. 配置支持大小写不敏感的字段类型
你需要给app_name设置一个带小写转换过滤器的文本字段类型,这样索引和查询时都会自动把文本转成小写,实现大小写无关搜索。
方法一:直接修改原字段类型
在配置文件里添加一个自定义字段类型:
<fieldType name="text_lowercase" class="solr.TextField"> <analyzer> <!-- 按空格分词,不需要分词的话可以换成KeywordTokenizerFactory --> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <!-- 关键:添加小写转换过滤器 --> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
然后把app_name的类型改成这个新类型:
<field name="app_name" type="text_lowercase" indexed="true" stored="true"/>
方法二:用复制字段(不修改原字段)
如果你不想改动原字段的配置,可以新增一个专门用于大小写不敏感搜索的字段,通过复制字段同步数据:
<!-- 新增处理小写的字段 --> <field name="app_name_lower" type="text_lowercase" indexed="true" stored="false"/> <!-- 把app_name的内容复制到这个新字段 --> <copyField source="app_name" dest="app_name_lower"/>
之后查询时就用app_name_lower字段,比如q=app_name_lower:ATM。
3. 重新索引数据
修改完配置后,必须重新索引所有数据!因为新的字段类型需要对原有记录重新做大小写转换处理,否则旧数据还是用原来的规则索引,新配置不会生效。你可以通过Solr的数据导入工具重新导入,或者删除现有数据后重新提交所有记录。
4. 临时应急方案(不修改配置)
如果暂时没法改配置重新索引,也可以用Solr的函数查询临时实现:
q=lower(app_name):atm
这个方法会在查询时把app_name的字段值转成小写再匹配,但性能不如提前在索引时处理,只适合临时测试用。
现在测试一下,不管你搜app_name:ATM、app_name:Atm还是app_name:atm,都应该能返回那条app_name为"atm inspection"的记录啦~
内容的提问来源于stack exchange,提问作者Shubham Yelikar

