弹性搜索忽略“token_chars”

Elastic Search ignores `token_chars`

我在 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 属性 中指定。

你在混淆 edge_ngram tokenizer and edge_ngram token filter

来自文档:

Tokenizers are used to break a string down into a stream of terms or tokens.

在问题提供的示例中,whitespace 是正在使用的分词器

另一方面,令牌过滤器:

accept a stream of tokens from a tokenizer and can modify tokens (eg lowercasing), delete tokens (eg remove stopwords) or add tokens (eg synonyms).

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

token_chars 不支持 edge_ngram 标记过滤器,因此被忽略。