私はElasticSearchを初めて使用するため、ngramトークンフィルターとEdge ngramトークンフィルターの違いを識別できません。
これら2つは、トークンの処理においてどのように異なりますか?
documentation はこれについてかなり明確だと思います:
このトークナイザーはnGramに非常に似ていますが、トークンの先頭から始まるn-gramのみを保持します。
そして、nGram
トークナイザーの最良の例は、再び ドキュメント から来ています。
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
。テキスト内のすべての「単語」が考慮され、すべての「単語」の最初の文字が開始点になります(F
からFC
、S
からSchalke
および0
from 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
なぜWin
を返さなかったのですか?カーソルは移動しないため、常にゼロの位置から開始し、ngram_min
回移動して、同じ位置(常にゼロ)に戻ります。
ngram_Edge
は、JavaScriptなどの他のプログラミング言語のsubstring
関数であるかのように考えてください。
// 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"
}