9

我正在尝试使用 Solr 搜索一些 FirstName 为的记录;

abcd
Abcd
abcD
ABcd
abCd
abCD

现在我正在尝试使用通配符支持进行搜索。我需要了解搜索在区分大小写方面究竟是如何工作的。

例如,如果我将 FirstName 参数作为 ab* Vs Ab* 传递,将返回哪些记录?

有什么方法可以使/强制搜索区分大小写或不区分大小写?

4

4 回答 4

8

这取决于您如何在 schema.xml 中定义字段。如果在索引和查询时使用LowerCaseFilterFactory,那么所有查询都将不区分大小写。否则它将区分大小写。

<filter class="solr.LowerCaseTokenizerFactory"/>
于 2012-07-17T09:06:21.707 回答
7

您可以在架构中配置它。例如:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="query">
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

表示该字段被认为是小写的查询,这给人的印象是不区分大小写的搜索。

于 2012-07-17T09:08:09.597 回答
5

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"/>
于 2016-05-27T12:25:02.983 回答
2

默认情况下,一个值与存储的值完全匹配。如果您希望字段不区分大小写,通常的方法是使用小写过滤器的字段类型,使所有索引内容的大小写相同,实际上使搜索不区分大小写(因为查询值也将小写)。

示例内容对 'text' 和 'text_en' 字段类型执行此操作:

<filter class="solr.LowerCaseFilterFactory"/>

然而,在某些特定领域,自动处理通配符查询的小写可能会导致麻烦,并且在 Solr 3.6 和 4.0 中引入了 MultitermQueryAnalysis 来处理这些情况。如果字段已经小写,3.6 和 4.0 应该以正确的方式自动进行通配符搜索。

如果您在 3.6 之前没有获得正确的行为,我建议在使用通配符时将查询中的名称小写(只要您在索引时也应用了 LowerCaseFilterFactory)。

于 2012-07-17T09:10:27.730 回答