web-dev-qa-db-ja.com

エッジngramトークンフィルターはngramトークンフィルターとどのように異なりますか?

私はElasticSearchを初めて使用するため、ngramトークンフィルターEdge ngramトークンフィルターの違いを識別できません。

これら2つは、トークンの処理においてどのように異なりますか?

16
Karunakar

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" ]

要するに:

  • トークナイザーは、構成に応じて、トークンを作成します。この例では:FCSchalke04
  • nGramは最小の文字のグループを生成しますmin_gramサイズと最大max_gram入力テキストからのサイズ。基本的に、トークンは小さなチャンクに分割され、各チャンクは文字に固定されます(この文字がどこにあるかは関係ありません。すべてのチャンクがチャンクを作成します)。
  • edgeNGramも同じことをしますが、チャンクは常に各トークンの先頭から始まります。基本的に、チャンクはトークンの先頭に固定されます。

上記と同じテキストの場合、edgeNGramは次のように生成します。FC, Sc, Sch, Scha, Schal, 04。テキスト内のすべての「単語」が考慮され、すべての「単語」の最初の文字が開始点になります(FからFCSからSchalkeおよび0 from 04)。

27
Andrei Stefan

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_Edgengramとまったく同じことを行いますが、カーソルは移動しません。

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"
}
0
Ahmad