当 Solr 查询包含“@”字符时,它无法按预期工作

Solr query not working as expected when it contains the `@` character

我有一个名为 email_txttext_general 字段,其中包含 abc@xyz.com 类型的电子邮件列表, 我正在尝试创建一个只搜索用户名而忽略域的查询。

我的查询看起来像这样:

email_txt:*abc*@*

这会产生 0 个结果。我希望收到用户名包含 abc 的结果,例如 abcdefg@xyz.comfooabc@xyzbuzz.combarabcefg@fizzxyz.comabc@fizz.com。是的,我相信我有那种类型的数据,即使我尝试 email_txt:*@*.

它也不起作用

如果我尝试类似的操作:

email_txt:*abc*

它有效,并产生多个结果,包括上面的所需结果,但也包括域包含 abc 的情况,如 fizz@helpmeabc.com,这是不需要的。

我查看了 documentation(以防万一我发疯了),它确认 @ 不是特殊字符。即便如此,我还是试图像这样逃避它(以防万一,要疯了):

email_txt:*abc*\@*

现在是真正的问题。 @ 是特殊字符吗?如果是这样,如何转义,如果不是,我在查询中做错了什么?我真的不知道我的逻辑是否有缺陷,或者我是否遗漏了什么。

注意:我使用的是 solr 版本 6.3.0,文档适用于 6.6(最接近的可用版本)

当您使用 StandardTokenizer(默认字段类型 text_generaltext_en 等默认使用)时,内容将在 @ 标志出现。这意味着对于您的示例,实际上存储了两个或三个标记,(izzhelpmeabc.com) 或 (izzhelpmeabccom) .

通配符匹配是针对标记本身应用的(除非使用复杂的短语查询解析器),其中没有发生标记化和过滤(多术语感知过滤器除外,例如小写过滤器)。

效果是您的查询 *abc*@* 尝试匹配包含 @ 的标记,但是由于您在索引时的处理在 @ 上拆分并根据标记分开在那个角色上,没有标记包含 @ - 因此,你没有命中。

您可以使用 string 字段类型或 KeywordTokenizer 与过滤器(例如小写过滤器等)配对,以将原始输入或多或少作为一个完整的标记。