弹性搜索忽略`token_chars`

时间:2015-08-20 21:39:40

标签: elasticsearch tokenize analyzer n-gram

我在Mac上使用Elastic Search 1.7.1。

这是我的索引映射:

{
   "settings":{
      "analysis":{
         "filter":{
            "my_edgengram":{
               "max_gram":15,
               "token_chars":[
                  "letter",
                  "digit"
               ],
               "type":"edgeNGram",
               "min_gram":1
            },
         },
         "analyzer":{
            "stop_edgengram_analyzer":{
               "filter":[
                  "lowercase",
                  "asciifolding",
                  "stop",
                  "my_edgengram"
               ],
               "type":"custom",
               "tokenizer":"whitespace"
            }
         }
      }
   }
}

调试分析器:

$ curl -XGET 'http://localhost:9200/objects/_analyze?analyzer=stop_edgengram_analyzer&text=America,s&pretty=True'
{
  "tokens" : [
     ... skipped ...
  , {
    "token" : "america",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "america,",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "america,s",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "word",
    "position" : 1
  } ]
}

为什么america,s令牌在输出中?

,是标点符号。我希望字母和数字仅在my_edgengram过滤器的token_chars属性中指定。

1 个答案:

答案 0 :(得分:4)

您感到困惑edge_ngram tokenizeredge_ngram token filter

来自文档:

  

标记符用于将字符串分解为术语流或   令牌。

问题whitespace中提供的示例是正在使用的标记生成器

另一方面,

令牌过滤器:

  

从tokenizer接受令牌流并且可以   修改令牌(例如小写),删除令牌(例如删除停用词)或   添加标记(例如同义词)。

在OP egde_ngram中提供的示例中,正在使用令牌过滤器。

<{1}}令牌过滤器不支持

token_chars,因此会被忽略。