【发布时间】:2018-06-01 03:52:42
【问题描述】:
我刚刚开始研究 Solr。有一个电话字段,它已在如下架构中定义
<field docValues="true" indexed="true" multiValued="true" name="phones" stored="true" type="StrField"/>
据我了解,字符串字段将尝试进行完全匹配,但用户可以使用任何格式来搜索带有特殊字符(如 (111) 111-1111)的电话号码。因此,我使用 ClientUtils.escapeQueryChars 为特殊字符添加斜线,但搜索未产生任何结果。我一直试图理解为什么以及是否有任何标准不能为字符串字段转义特殊字符?我不认为标记器很重要,因为它是字符串字段并且我使用 edismax 解析器。有什么想法吗?
【问题讨论】:
-
我不确定您所说的“但用户可以使用任何格式搜索电话号码”是什么意思。字符串字段将仅给出完全匹配。它必须在每一种方式上都相同才能获得成功。因此,如果您已将
(111) 111-1111编入索引,那么这是唯一会在搜索时获得成功的值。 -
我明白这一点。但如果我逃避角色不应该工作。当我调试我在查询中设置的最终值是 (111)111\-1111 时,我没有看到任何结果。但是,如果我搜索为 1111111111,那么我会看到它。所以我的问题是,如果我转义特殊字符,为什么我看不到预期的结果。
-
StrField 在您的架构中定义为什么?你索引的价值是多少?
1111111111不应与值为(111) 111-1111的字符串字段匹配。 debugQuery 显示什么?分析页面显示什么? -
StrField 定义为`
`。我知道 1111111111 与 (111)111-1111 不匹配,但在转义特殊字符 (111)111\-1111 后,我不确定为什么看不到匹配项。在分析页面中,我看到 start:0、end:12、type:word、position:1 和 raw_bytes 中的值。我看到的一件事是,如果我在电话字段中使用特殊字符(括号和连字符)并使用模糊搜索(~),那么它在转义特殊字符后会起作用。但是如果我不使用模糊搜索,那么我将无法搜索完全匹配的特殊字符。 -
您的查询字符串到底是什么样的?