索引字段中的特殊字符

时间:2015-07-27 07:10:23

标签: elasticsearch elasticsearch-java-api

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

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

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

1 个答案:

答案 0 :(得分:0)

如果设置为true analyze_wildcard则应该有效。默认情况下,查询字符串不会分析包含通配符的令牌。如果你将该选项设置为true,弹性搜索将尝试。这个选项并不完美,正如doc所说:

  

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

您的空结果背后的原因是默认分析器正在移除@,当搜索*@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 =>它被编入索引namedomain.com

这意味着您的文档将包含两个令牌namedomain.com。如果您试图找到exact term" name@domain.com"你找不到任何东西,因为你的文件不再包含完整的电子邮件。

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

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