如果设置为 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
这意味着您的文档将包含两个标记name
和domain.com
. 如果您尝试查找确切的术语“name@domain.com”,您将找不到任何内容,因为您的文档不再包含完整的电子邮件。
现在在查询时您正在执行查询字符串*@domain.com*
。默认情况下,查询字符串不会分析那些包含通配符的标记,因此您正在尝试查找包含@domain.com
它的标记,而不是您的索引。
现在,如果您将属性设置analyze_wildcard
为 true。Elasticsearch 使用通配符分析这些标记,因此您的查询将被转换为*domain.com*
,在这种情况下,您有匹配的文档。