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

但这两个分词器到底有什么区别呢?网上搜来搜去呢,都不是说人话的解释,如果不是深入了解ElasticSearch的同学来说,看半天也不太容易搞明白的吧。

所以有了本文,这里,我们不解释什么是分词器什么是解析器,这些基本知识你应当知道,直接用示例让你明白这两个分词器的区别:

这里,我们统一用字符串来做分词示例:

字符串
  1. edge_ngram分词器,分词结果如下:
    {
    "tokens": [
    {
    "token": "字",
    "start_offset": 0,
    "end_offset": 1,
    "type": "word",
    "position": 0
    },
    {
    "token": "字符",
    "start_offset": 0,
    "end_offset": 2,
    "type": "word",
    "position": 1
    },
    {
    "token": "字符串",
    "start_offset": 0,
    "end_offset": 3,
    "type": "word",
    "position": 2
    }
    ]
    }
  2. ngram分词器,分词结果如下:
    {
    "tokens": [
    {
    "token": "字",
    "start_offset": 0,
    "end_offset": 1,
    "type": "word",
    "position": 0
    },
    {
    "token": "字符",
    "start_offset": 0,
    "end_offset": 2,
    "type": "word",
    "position": 1
    },
    {
    "token": "字符串",
    "start_offset": 0,
    "end_offset": 3,
    "type": "word",
    "position": 2
    },
    {
    "token": "符",
    "start_offset": 1,
    "end_offset": 2,
    "type": "word",
    "position": 3
    },
    {
    "token": "符串",
    "start_offset": 1,
    "end_offset": 3,
    "type": "word",
    "position": 4
    },
    {
    "token": "串",
    "start_offset": 2,
    "end_offset": 3,
    "type": "word",
    "position": 5
    }
    ]
    }

一目了然,看明白了吗?简单理解来说:edge_ngram的分词器,就是从首字开始,按步长,逐字符分词,直至最终结尾文字;ngram呢,就不仅是从首字开始,而是逐字开始按步长,逐字符分词。

具体应用呢?如果必须首字匹配的情况,那么用edge_ngram自然是最佳选择,如果需要文中任意字符的匹配,ngram就更为合适了。当然,涉及到中文分词的话,有一些可用的分词插件,不在本文讨论范围。

如果你不是一看就懂的话……朋友,你还是告别自行车吧……

Related Posts: ElasticSearch一看就懂之分词器edge_ngram和ngram的区别 :

avatar