【问题标题】:Special characters within indexed fields索引字段中的特殊字符
【发布时间】:2015-07-27 07:10:22
【问题描述】:

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

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

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

【问题讨论】:

  • email 字段的映射看起来如何?
  • @Val 字符串,默认

标签: elasticsearch elasticsearch-java-api


【解决方案1】:

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

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

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

代码如下:

.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*,在这种情况下,您有匹配的文档。

【讨论】:

  • 感谢您的回复,但我有点困惑。您说默认情况下不分析带有通配符的查询字符串,但之后您说默认分析器删除了@ ,这意味着查询字符串令牌正在被分析。接下来,您说当analyze_wildcard 为假时,@ 不会被删除,这就是结果为空的原因。如果我理解正确,它们为空,因为已分析索引字段并且所有的特殊字符都被删除了,对吧?
  • @nKognito 我用更好的解释编辑了答案。希望对您有所帮助。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多