我正在尝试对我的solr系统运行以下查询:
((((subtype:place) AND name:fis*) AND addressPostal:98007) AND addressLine1:14320\ 21*)
此查询旨在搜索名称为fis
的前3个字符且地址的前8个字符为14320 21
的商家。
这不返回任何匹配项。但是,如果我将fis*
更改为Fis*
,则会返回正确的匹配项。经过进一步调查后,字符串类型似乎区分大小写。
然后我尝试定义我的字段以便它们不区分大小写,允许通配符搜索(或者至少从搜索开始),而不是在空格上中断。不幸的是我失败了。
我到目前为止最接近的是:
<fieldType name="lowerCaseString" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
有了这个,我可以((((subtype:place) AND name:fis*) AND addressPostal:98007) AND addressLine1:14320*)
得到正确的匹配,但由于空间的原因,我无法完成地址搜索的全部8个字符(因为大多数地址在第一个空格之前只有几位数字) ,这是一个重大问题。)
addressLine1搜索也需要不区分大小写,因为我需要st == ST == St
。
我该如何做到这一点?
答案 0 :(得分:1)
使用KeywordTokenizerFactory创建一个文本字段。此标记生成器没有实际的标记,因此整个输入字符串将保留为单个标记。所以它就像是一个小写的字符串字段:
<fieldType name="lowerCaseString" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
答案 1 :(得分:0)
一个简单的解决方案是将字段的类型保持为字符串,但在索引数据时将值设置为小写。然后从客户端小写查询。