当我使用match指令运行查询时,似乎遇到了一个奇怪的问题,如下所示
{
"query":
{"match": {
"value.account.names.lastName" : "*GUILLERMO*"
}
}
}
现在,当我使用带有通配符的查询(例如下面的查询)时,我不会受到打击。
{
"query":
{"wildcard": {
"value.account.names.lastName" : "*GUILLERMO*"
}
}
}
我对可能发生的问题真的迷失了。非常感谢您的任何投入
答案 0 :(得分:2)
假设您要对已分析的字段运行通配符查询,那么Elasticsearch的行为是完全正确的。正如Elasticsearch文档所述,通配符查询在术语级别上运行。当您使用包含字符串“ Guillermo del Toro”的字段name
索引文档时,该字段的值将变为小写并分成三个标记:“ guillermo”,“ del”和“ toro”。然后,当您对*GUILLERMO*
字段运行通配符查询name
时,Elasticsearch会将查询字符串与每个试图查找匹配项的单个令牌进行比较。在这里,您不会因为查询字符串为大写而分析的令牌为小写而受到打击。
对已分析的字段运行通配符查询可能不是一个好主意,但是如果强烈需要,我建议使用内置的name.keyword
字段,而不是仅使用name
字段(但同样,您会遇到区分大小写的问题)。更好的解决方案是为此创建您自己的小写未分析字段。