弹性搜索忽略 `token_chars`

And*_*iuk 2 tokenize analyzer n-gram elasticsearch

我在 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"
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

调试分析器:

$ 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
  } ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

kee*_*ety 5

您混淆了edge_ngram tokenizeredge_ngram token filter

从文档:

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

在有问题的示例中whitespace是正在使用的标记器

另一方面,令牌过滤器:

接受来自标记器的标记流,并且可以修改标记(例如小写)、删除标记(例如删除停用词)或添加标记(例如同义词)。

在 OPegde_ngram令牌过滤器中提供的示例中使用。

token_chars不支持edge_ngram令牌过滤器,因此被忽略。