我正在尝试使用 Solr 搜索一些 FirstName 为的记录;
abcd
Abcd
abcD
ABcd
abCd
abCD
现在我正在尝试使用通配符支持进行搜索。我需要了解搜索在区分大小写方面究竟是如何工作的。
例如,如果我将 FirstName 参数作为 ab* Vs Ab* 传递,将返回哪些记录?
有什么方法可以使/强制搜索区分大小写或不区分大小写?
这取决于您如何在 schema.xml 中定义字段。如果在索引和查询时使用LowerCaseFilterFactory,那么所有查询都将不区分大小写。否则它将区分大小写。
<filter class="solr.LowerCaseTokenizerFactory"/>
您可以在架构中配置它。例如:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="query">
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
表示该字段被认为是小写的查询,这给人的印象是不区分大小写的搜索。
solr 模式中的默认定义字段的工作方式非常不同。
数据类型'string'
将单词存储为不完整的确切字符串。
虽然'text_general'
通常执行标记化和二次处理(例如不区分大小写和整个字符串匹配)。当我们想要匹配句子的一部分时,它对于所有场景都非常有用。
如果以下示例“Search into the sentence”被索引到两个字段,我们必须准确搜索 Search into the sentence 才能从字符串字段中获得命中,而在 text_general 的情况下它将返回不同的结果。
这里卖家名称将在搜索字符串中完全匹配,而产品名称将搜索到上面的整个句子中。
例子:
<field name="seller_name" type="string" indexed="true" stored="true"/>
<field name="product_name" type="text_general" indexed="true" stored="true"/>
默认情况下,一个值与存储的值完全匹配。如果您希望字段不区分大小写,通常的方法是使用小写过滤器的字段类型,使所有索引内容的大小写相同,实际上使搜索不区分大小写(因为查询值也将小写)。
示例内容对 'text' 和 'text_en' 字段类型执行此操作:
<filter class="solr.LowerCaseFilterFactory"/>
然而,在某些特定领域,自动处理通配符查询的小写可能会导致麻烦,并且在 Solr 3.6 和 4.0 中引入了 MultitermQueryAnalysis 来处理这些情况。如果字段已经小写,3.6 和 4.0 应该以正确的方式自动进行通配符搜索。
如果您在 3.6 之前没有获得正确的行为,我建议在使用通配符时将查询中的名称小写(只要您在索引时也应用了 LowerCaseFilterFactory)。