2

在使用查询字符串过滤器搜索电子邮件地址时,我遇到了一些有趣的行为:

.filteredQuery(
   queryStringQuery(String.format("*%s*", query))
       .field("firstName").field("lastName").field("email").field("phone"),
   null
)

如果我domain.com作为查询传递(假设索引中有这样的值) - 结果很好,但是一旦我通过@domain.com- 结果是空的。特殊符号有一些限制吗?

4

1 回答 1

1

如果设置为 true analyze_wildcard,它应该可以工作。默认情况下,查询字符串不会分析那些包含通配符的标记。如果您将该选项设置为 true,elasticsearch 将尝试。正如文档所说,此选项并不完美:

通过将此值设置为 true,也将尽最大努力分析这些值。

空结果背后的原因是默认分析器@在搜索时删除 and*@domain.com*并且analyze_wildcard为 false,@在查询时没有被删除。

代码将如下所示:

.filteredQuery(
    queryStringQuery(String.format("*%s*", query)).analyzeWildcard(true)
        .field("firstName").field("lastName").field("email").field("phone"),
    null
)

编辑:更好地解释为什么你得到空结果。

首先,分析器可以在索引时(您在映射中设置)和查询时执行(并非所有查询都在查询时执行分析器)

在您的情况下,在索引时standard analyzer正在分析字段email,如下所示:

name@domain.com=> 它正在被索引name并且domain.com

这意味着您的文档将包含两个标记namedomain.com. 如果您尝试查找确切的术语“name@domain.com”,您将找不到任何内容,因为您的文档不再包含完整的电子邮件。

现在在查询时您正在执行查询字符串*@domain.com*。默认情况下,查询字符串不会分析那些包含通配符的标记,因此您正在尝试查找包含@domain.com它的标记,而不是您的索引。

现在,如果您将属性设置analyze_wildcard为 true。Elasticsearch 使用通配符分析这些标记,因此您的查询将被转换为*domain.com*,在这种情况下,您有匹配的文档。

于 2015-07-27T09:33:51.540 回答