edge_ngram和ngram是ElasticSearch自带的两个分词器,一般设置索引映射的时候都会用到,设置完步长之后,就可以直接给解析器analyzer的tokenizer赋值使用。
但这两个分词器到底有什么区别呢?网上搜来搜去呢,都不是说人话的解释,如果不是深入了解ElasticSearch的同学来说,看半天也不太容易搞明白的吧。
所以有了本文,这里,我们不解释什么是分词器什么是解析器,这些基本知识你应当知道,直接用示例让你明白这两个分词器的区别:
这里,我们统一用字符串来做分词示例:
字符串
- 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 } ] }
- 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就更为合适了。当然,涉及到中文分词的话,有一些可用的分词插件,不在本文讨论范围。
如果你不是一看就懂的话……朋友,你还是告别自行车吧……
未经允许不得转载:阿藏博客 » ElasticSearch一看就懂之分词器edge_ngram和ngram的区别