一、什么是NGram 分词器?

edge_ngram和ngram是ElasticSearch自带的两个分词器,一般设置索引映射的时候都会用到,设置完步长之后,就可以直接给解析器analyzer的tokenizer赋值使用。

二、怎么使用

完整的索引结构:

        {
        "settings": {
        "index.max_ngram_diff": 10,
        "number_of_shards": 128,
        "number_of_replicas": 2,
        "refresh_interval": "5s",
        "blocks": {
            "read_only_allow_delete": "false"
        },
        "analysis": {
          "analyzer": {
            "ngram_analyzer" : {
              "tokenizer" : "ngram_tokenizer"
            }
	      },
	      "tokenizer": {
          "ngram_tokenizer" : {
              "token_chars" : [
                "letter",
                "digit"
              ],
              "min_gram" : "1",
              "type" : "ngram",
              "max_gram" : "10"
            }
	      }
        }
    },
    "mappings" : {
        "_routing" : {
          "required" : true
        },
        "properties" : {
          "id" : {
            "type" : "long"
          },
          "username" : {
            "type" : "text",
            "fields" : {
              "ngram" : {
                "type" : "text",
                "analyzer" : "ngram_analyzer"
              }
            }
          },
          "password" : {
            "type" : "long"
          },
          "createTime" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis"
          }
        }
    }
}

大概就是在setting中引入分词器,ngram_tokenizer里设置类型type为edge_ngram或者ngram,然后mapping中需要作ngram分词的字段指定一下就可以了。需要注意的是es7以后的版本min_gram和max_gram的粒度默认是不大于1,也就是说分词是一个字符一个字符逐个分的。如果粒度需要大于1需要设置一下index.max_ngram_diff大于等于它们的差值,否则会报错。
在这里插入图片描述
分词粒度的效果,例:搜索我是中国人
分词粒度为默认1,以ngram分词器分词,则分词效果为
我 是 中 国 人
分词粒度为默认3,以ngram分词器分词,则分词效果为
我 我是 我是中 是 是中 是中国 中 中国 中国人 国 国人 人

三、ngram和edge_ngram类型两者的区别

edge_ngram分词效果
在这里插入图片描述
ngram分词效果
在这里插入图片描述
总结:
主要区别在于edge_ngram会按照首字符逐字匹配,ngram是全字符逐个匹配,比如分词粒度都是3的两个分词器,搜索我是中国人:
edge_ngram分词
我 我是 我是中 (edge_ngram分词必须以首字 ”我“ 开头逐个按步长,逐字符分词)
ngram分词
我 我是 我是中 是 是中 是中国 中 中国 中国人 国 国人 人(ngram分词逐字开始按步长,逐字符分词)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐