10

ES 新手,所以可能是一个愚蠢的问题,但我正在尝试使用通配符进行搜索,例如: "SOMECODE*""*SOMECODE"

它工作正常,但文档中的值可能具有"SOMECODE/FRED".
问题是*会匹配任何东西(不包括任何东西)。
*SOMECODE会受到打击SOMECODE/FRED

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

我尝试将字段上的地图设置为not_analyzed,但是我根本无法搜索它。

我做错了吗?

谢谢

4

1 回答 1

14

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

我的猜测是您使用的是标准分析器(如果您不指定,它是默认分析器)。如果是这种情况,标准会将斜杠视为标记分隔符,并生成两个标记[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
  } ]
}

如果您不想要这种行为,则需要更改为不会在特殊字符上拆分的分词器。但是,我会质疑这个用例。通常,您需要拆分这些类型的字符。

于 2013-01-30T20:56:16.157 回答