一、什么是NGram 分词器?
NGram分词器是ES自带的具有前缀匹配搜索功能的一个文本分词器。它能根据文本的步长逐步对写入的文本内容进行约束切割;
二、NGram和index-time搜索推荐原理
搜索的时候,不用再根据一个前缀,然后扫描整个倒排索引了,而是简单的拿前缀去倒排索引中匹配即可,如果匹配上了,那么就好了,就和match query全文检索一样。
官方文档:NGram Tokenizer | Elasticsearch Guide [6.8] | Elastic
官方介绍如下:
在默认设置下,ngram标记器将初始文本视为单个标记,并生成最小长度为1、最大长度为2的N个字符串,这个最大最小长度我们是可以配置的。
例如:
POST _analyze
{"tokenizer": "ngram","text": "Quick Fox"
}
上述句子将产生以下术语:
空格也会进行分词
[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]
三 配置参数
The ngram
tokenizer accepts the following parameters:
| Minimum length of characters in a gram. Defaults to |
| Maximum length of characters in a gram. Defaults to |
| Character classes that should be included in a token. Elasticsearch will split on characters that don’t belong to the classes specified. Defaults to 应包含在令牌中的字符类。Elasticsearch将对不属于指定类的字符进行拆分。默认值为[](保留所有字符)。也就是遇到这些字符会进行分词。 Character classes may be any of the following:
|
TIP:将min_gram和max_gram设置为相同的值通常是有意义的。长度越小,匹配的文档越多,但匹配的质量越低。长度越长,匹配的内容就越具体。三克(长度3)是一个很好的起点。
例子:
PUT my_index
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "ngram","min_gram": 3,"max_gram": 3,"token_chars": ["letter","digit"]}}}}
}POST my_index/_analyze
{"analyzer": "my_analyzer","text": "2 Quick Foxes."
}
分词:
[ Qui, uic, ick, Fox, oxe, xes ]