边缘 ngram 令牌过滤器与 ngram 令牌过滤器有何不同?
how edge ngram token filter differs from ngram token filter?
由于我是弹性搜索的新手,我无法识别 ngram 令牌过滤器 和
边缘 ngram 标记过滤器。
这两者有何不同
正在处理令牌?
我认为 documentation 对此非常清楚:
This tokenizer is very similar to nGram but only keeps n-grams which start at the beginning of a token.
nGram
分词器的最佳示例再次来自 documentation:
curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'FC Schalke 04'
# FC, Sc, Sch, ch, cha, ha, hal, al, alk, lk, lke, ke, 04
使用这个分词器定义:
"type" : "nGram",
"min_gram" : "2",
"max_gram" : "3",
"token_chars": [ "letter", "digit" ]
简而言之:
- 标记器将根据配置创建标记。在本例中:
FC
、Schalke
、04
.
nGram
从输入文本生成最小 min_gram
大小和最大 max_gram
大小的字符组。基本上,令牌被分成小块,每个块都锚定在一个角色上(这个角色在哪里并不重要,它们都会创建块)。
edgeNGram
做同样的事情,但块总是从每个标记的开头开始。基本上,块锚定在标记的开头。
对于与上面相同的文本,edgeNGram
生成:FC, Sc, Sch, Scha, Schal, 04
。考虑文本中的每个 "word",并且对于每个 "word",第一个字符是起点(F
来自 FC
,S
来自 Schalke
0
来自 04
).
ngram
在打断文本的同时移动光标:
Text: Red Wine
Options:
ngram_min: 2
ngram_max: 3
Result: Re, Red, ed, Wi, Win, in, ine, ne
如您所见,光标移动 ngram_min
次到下一个片段,直到到达 ngram_max
。
ngram_edge
做与 ngram
完全相同的事情,但它不移动光标:
Text: Red Wine
Options:
ngram_min: 2
ngram_max: 3
Result: Re, Red
为什么没有 return Win
?因为光标不移动,它总是从零位置开始,移动 ngram_min
次然后返回到相同位置(始终为零)。
将 ngram_edge
视为其他编程语言中的 substring
函数,例如 JavaScript:
// ngram
let str = "Red Wine";
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red
console.log(str.substring(1, 3)); // ed, start from position 1
// ...
// ngram_edge
// notice that the position is always zero
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red
使用 Kibana 自行尝试:
PUT my_index
{
"settings": {
"analysis": {
"tokenizer": {
"my_ngram_tokenizer" : {
"type" : "ngram",
"min_gram": 2,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
},
"my_edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 3
}
}
}
}
}
POST my_index/_analyze
{
"tokenizer": "my_ngram_tokenizer",
"text": "Red Wine"
}
POST my_index/_analyze
{
"tokenizer": "my_edge_ngram_tokenizer",
"text": "Red Wine"
}
由于我是弹性搜索的新手,我无法识别 ngram 令牌过滤器 和 边缘 ngram 标记过滤器。
这两者有何不同 正在处理令牌?
我认为 documentation 对此非常清楚:
This tokenizer is very similar to nGram but only keeps n-grams which start at the beginning of a token.
nGram
分词器的最佳示例再次来自 documentation:
curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'FC Schalke 04'
# FC, Sc, Sch, ch, cha, ha, hal, al, alk, lk, lke, ke, 04
使用这个分词器定义:
"type" : "nGram",
"min_gram" : "2",
"max_gram" : "3",
"token_chars": [ "letter", "digit" ]
简而言之:
- 标记器将根据配置创建标记。在本例中:
FC
、Schalke
、04
. nGram
从输入文本生成最小min_gram
大小和最大max_gram
大小的字符组。基本上,令牌被分成小块,每个块都锚定在一个角色上(这个角色在哪里并不重要,它们都会创建块)。edgeNGram
做同样的事情,但块总是从每个标记的开头开始。基本上,块锚定在标记的开头。
对于与上面相同的文本,edgeNGram
生成:FC, Sc, Sch, Scha, Schal, 04
。考虑文本中的每个 "word",并且对于每个 "word",第一个字符是起点(F
来自 FC
,S
来自 Schalke
0
来自 04
).
ngram
在打断文本的同时移动光标:
Text: Red Wine
Options:
ngram_min: 2
ngram_max: 3
Result: Re, Red, ed, Wi, Win, in, ine, ne
如您所见,光标移动 ngram_min
次到下一个片段,直到到达 ngram_max
。
ngram_edge
做与 ngram
完全相同的事情,但它不移动光标:
Text: Red Wine
Options:
ngram_min: 2
ngram_max: 3
Result: Re, Red
为什么没有 return Win
?因为光标不移动,它总是从零位置开始,移动 ngram_min
次然后返回到相同位置(始终为零)。
将 ngram_edge
视为其他编程语言中的 substring
函数,例如 JavaScript:
// ngram
let str = "Red Wine";
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red
console.log(str.substring(1, 3)); // ed, start from position 1
// ...
// ngram_edge
// notice that the position is always zero
console.log(str.substring(0, 2)); // Re
console.log(str.substring(0, 3)); // Red
使用 Kibana 自行尝试:
PUT my_index
{
"settings": {
"analysis": {
"tokenizer": {
"my_ngram_tokenizer" : {
"type" : "ngram",
"min_gram": 2,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
},
"my_edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 3
}
}
}
}
}
POST my_index/_analyze
{
"tokenizer": "my_ngram_tokenizer",
"text": "Red Wine"
}
POST my_index/_analyze
{
"tokenizer": "my_edge_ngram_tokenizer",
"text": "Red Wine"
}