【问题标题】:Elastic Search ignores `token_chars`弹性搜索忽略 `token_chars`
【发布时间】:2015-08-20 21:39:40
【问题描述】:

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

【问题讨论】:

    标签: elasticsearch tokenize analyzer n-gram


    【解决方案1】:

    您混淆了edge_ngram tokenizeredge_ngram token filter

    来自文档:

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

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

    另一方面,令牌过滤器:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2012-06-05
      • 2015-12-08
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多