当 Solr 查询包含“@”字符时,它无法按预期工作
Solr query not working as expected when it contains the `@` character
我有一个名为 email_txt
的 text_general
字段,其中包含 abc@xyz.com
类型的电子邮件列表,
我正在尝试创建一个只搜索用户名而忽略域的查询。
我的查询看起来像这样:
email_txt:*abc*@*
这会产生 0 个结果。我希望收到用户名包含 abc
的结果,例如 abcdefg@xyz.com
、fooabc@xyzbuzz.com
、barabcefg@fizzxyz.com
、abc@fizz.com
。是的,我相信我有那种类型的数据,即使我尝试 email_txt:*@*
.
它也不起作用
如果我尝试类似的操作:
email_txt:*abc*
它有效,并产生多个结果,包括上面的所需结果,但也包括域包含 abc
的情况,如 fizz@helpmeabc.com
,这是不需要的。
我查看了 documentation(以防万一我发疯了),它确认 @
不是特殊字符。即便如此,我还是试图像这样逃避它(以防万一,我要疯了):
email_txt:*abc*\@*
- 仍然有 0 个结果
现在是真正的问题。 @
是特殊字符吗?如果是这样,如何转义,如果不是,我在查询中做错了什么?我真的不知道我的逻辑是否有缺陷,或者我是否遗漏了什么。
注意:我使用的是 solr 版本 6.3.0,文档适用于 6.6(最接近的可用版本)
当您使用 StandardTokenizer(默认字段类型 text_general
、text_en
等默认使用)时,内容将在 @
标志出现。这意味着对于您的示例,实际上存储了两个或三个标记,(izz
和 helpmeabc.com
) 或 (izz
、helpmeabc
和 com
) .
通配符匹配是针对标记本身应用的(除非使用复杂的短语查询解析器),其中没有发生标记化和过滤(多术语感知过滤器除外,例如小写过滤器)。
效果是您的查询 *abc*@*
尝试匹配包含 @
的标记,但是由于您在索引时的处理在 @
上拆分并根据标记分开在那个角色上,没有标记包含 @
- 因此,你没有命中。
您可以使用 string
字段类型或 KeywordTokenizer
与过滤器(例如小写过滤器等)配对,以将原始输入或多或少作为一个完整的标记。
我有一个名为 email_txt
的 text_general
字段,其中包含 abc@xyz.com
类型的电子邮件列表,
我正在尝试创建一个只搜索用户名而忽略域的查询。
我的查询看起来像这样:
email_txt:*abc*@*
这会产生 0 个结果。我希望收到用户名包含 abc
的结果,例如 abcdefg@xyz.com
、fooabc@xyzbuzz.com
、barabcefg@fizzxyz.com
、abc@fizz.com
。是的,我相信我有那种类型的数据,即使我尝试 email_txt:*@*
.
如果我尝试类似的操作:
email_txt:*abc*
它有效,并产生多个结果,包括上面的所需结果,但也包括域包含 abc
的情况,如 fizz@helpmeabc.com
,这是不需要的。
我查看了 documentation(以防万一我发疯了),它确认 @
不是特殊字符。即便如此,我还是试图像这样逃避它(以防万一,我要疯了):
email_txt:*abc*\@*
- 仍然有 0 个结果
现在是真正的问题。 @
是特殊字符吗?如果是这样,如何转义,如果不是,我在查询中做错了什么?我真的不知道我的逻辑是否有缺陷,或者我是否遗漏了什么。
注意:我使用的是 solr 版本 6.3.0,文档适用于 6.6(最接近的可用版本)
当您使用 StandardTokenizer(默认字段类型 text_general
、text_en
等默认使用)时,内容将在 @
标志出现。这意味着对于您的示例,实际上存储了两个或三个标记,(izz
和 helpmeabc.com
) 或 (izz
、helpmeabc
和 com
) .
通配符匹配是针对标记本身应用的(除非使用复杂的短语查询解析器),其中没有发生标记化和过滤(多术语感知过滤器除外,例如小写过滤器)。
效果是您的查询 *abc*@*
尝试匹配包含 @
的标记,但是由于您在索引时的处理在 @
上拆分并根据标记分开在那个角色上,没有标记包含 @
- 因此,你没有命中。
您可以使用 string
字段类型或 KeywordTokenizer
与过滤器(例如小写过滤器等)配对,以将原始输入或多或少作为一个完整的标记。