使用NGram Tokenizer时,ElasticSearch不遵守Max NGram长度

时间:2017-01-09 07:48:24

标签: elasticsearch

我正在使用Ngram tokenizer,我已将min_length指定为3,将max_length指定为5.但即使我尝试搜索长度大于5的单词,它仍然会给我结果。这很奇怪,因为ES不会索引结合长度为6,但我仍然能够找回记录。我在这里找不到任何理论吗?如果没有,NGram的max_length真正具有什么意义呢?以下是我试过的映射..

PUT ngramtest
{
  "mappings": {
    "MyEntity":{
      "properties": {
        "testField":{
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }

    }
  }, 
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5
        }
      }
    }
  }
}

将测试实体编入索引:

PUT ngramtest/MyEntity/123
{
  "testField":"Z/16/000681"

}

AND,这个查询奇怪地显示

的结果
GET  ngramtest/MyEntity/_search
{
 "query": {
   "match": {
     "testField": "000681"
   }
 }
}

我试过这个以便分析'字符串:

POST ngramtest/_analyze
{
  "analyzer": "my_analyzer",
  "text": "Z/16/000681."
}

如果我出错了,有人可以纠正我吗?

1 个答案:

答案 0 :(得分:1)

原因是您的分析器my_analyzer用于索引 AND 搜索。因此,当您搜索6个字符abcdef的单词时,您的ngram分析器也会在搜索时分析该单词并生成标记abcabcd,{{1} },abcde等,这些将匹配索引标记。

您需要做的是指定您希望在映射中使用标准分析器bcd

search_analyzer

在擦除索引并重新填充之前,您可以通过指定要在匹配查询中使用的搜索分析器来测试此理论:

    "testField":{
      "type": "text",
      "analyzer": "my_analyzer",
      "search_analyzer": "standard"
    }