N-gram 分词器
编辑N-gram 分词器编辑
ngram
分词器首先在遇到指定字符列表中的任何一个字符时将文本分解为单词,然后为指定长度的每个单词生成 N-gram。
N-gram 就像一个在单词上移动的滑动窗口,即指定长度的连续字符序列。它们对于查询不使用空格或具有长复合词的语言(如德语)非常有用。
示例输出编辑
使用默认设置,ngram
分词器将初始文本视为单个标记,并生成最小长度为 1
且最大长度为 2
的 N-gram
response = client.indices.analyze( body: { tokenizer: 'ngram', text: 'Quick Fox' } ) puts response
POST _analyze { "tokenizer": "ngram", "text": "Quick Fox" }
上面的句子将生成以下词条
[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]
配置编辑
ngram
分词器接受以下参数
|
gram 中的最小字符长度。默认为 |
|
gram 中的最大字符长度。默认为 |
|
应包含在标记中的字符类。Elasticsearch 将根据不属于指定类的字符进行拆分。默认为 字符类可以是以下任意一种
|
|
应被视为标记一部分的自定义字符。例如,将其设置为 |
通常,将 min_gram
和 max_gram
设置为相同的值是有意义的。长度越小,匹配的文档越多,但匹配的质量越低。长度越长,匹配越具体。三元组(长度 3
)是一个不错的起点。
索引级别设置 index.max_ngram_diff
控制 max_gram
和 min_gram
之间允许的最大差值。
示例配置编辑
在此示例中,我们将 ngram
分词器配置为将字母和数字视为标记,并生成三元组(长度为 3
的 gram)
response = client.indices.create( index: 'my-index-000001', body: { settings: { analysis: { analyzer: { my_analyzer: { tokenizer: 'my_tokenizer' } }, tokenizer: { my_tokenizer: { type: 'ngram', min_gram: 3, max_gram: 3, token_chars: [ 'letter', 'digit' ] } } } } } ) puts response response = client.indices.analyze( index: 'my-index-000001', body: { analyzer: 'my_analyzer', text: '2 Quick Foxes.' } ) puts response
PUT my-index-000001 { "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-000001/_analyze { "analyzer": "my_analyzer", "text": "2 Quick Foxes." }
上面的示例生成以下词条
[ Qui, uic, ick, Fox, oxe, xes ]