ES的新手,所以可能是一个愚蠢的问题,但我正在尝试使用通配符进行搜索,例如:"SOMECODE*""*SOMECODE"
它工作正常,但是文档中的值可能具有"SOMECODE/FRED"
问题是*将与任何内容匹配(不包含任何内容)。*SOMECODE将在SOMECODE/FRED上获得成功。

我尝试搜索*/SOMECODE,但这什么也没有返回。
我认为该字段的标记化是根本问题。
/导致该值为2个字。

我尝试将字段上的 map 设置为not_analyzed,但是我根本无法对其进行搜索。

我做错了吗?

谢谢

最佳答案

通过设置not_analyzed,您只允许完全匹配(例如,仅"SOMECODE/FRED",包括大小写和特殊字符)。

我的猜测是您使用的是标准分析仪(如果未指定,则为默认分析仪)。如果是这种情况,Standard会将斜杠视为 token 分隔符,并生成两个 token [somecode][fred]:

$ curl -XGET 'localhost:9200/_analyze?analyzer=standard&pretty' -d 'SOMECODE/FRED'
{
    "tokens" : [ {
    "token" : "somecode",
    "start_offset" : 0,
    "end_offset" : 8,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "fred",
    "start_offset" : 9,
    "end_offset" : 13,
    "type" : "<ALPHANUM>",
    "position" : 2
  } ]
}

如果您不希望出现这种情况,则需要更改为不拆分特殊字符的 token 生成器。但是,我会对此用例提出质疑。通常,您需要拆分这些类型的字符。

10-07 19:02