N-gram tokenizer

ngram トークナイザーは、指定された文字のリストのいずれかに出会うと、最初にテキストを単語に分解し、その後、指定された長さの各単語の N-grams を生成します。

N-grams は、単語を横切るスライディングウィンドウのようなもので、指定された長さの連続した文字のシーケンスです。これは、スペースを使用しない言語や、ドイツ語のように長い複合語を持つ言語のクエリに役立ちます。

Example output

デフォルト設定では、ngram トークナイザーは初期テキストを単一のトークンとして扱い、最小長さ 1 と最大長さ 2 の N-grams を生成します:

Python

  1. resp = client.indices.analyze(
  2. tokenizer="ngram",
  3. text="Quick Fox",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'ngram',
  4. text: 'Quick Fox'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "ngram",
  3. text: "Quick Fox",
  4. });
  5. console.log(response);

Console

  1. POST _analyze
  2. {
  3. "tokenizer": "ngram",
  4. "text": "Quick Fox"
  5. }

上記の文は、次の用語を生成します:

Text

  1. [ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]

Configuration

ngram トークナイザーは、次のパラメータを受け入れます:

min_gram グラム内の文字の最小長さ。デフォルトは 1 です。
max_gram グラム内の文字の最大長さ。デフォルトは 2 です。
token_chars トークンに含めるべき文字クラス。Elasticsearchは、指定されたクラスに属さない文字で分割します。デフォルトは [] (すべての文字を保持) です。文字クラスは次のいずれかである可能性があります:
- letter— 例えば abï または

- digit— 例えば 3 または 7

- whitespace— 例えば " " または "\n"

- punctuation—例えば ! または "

- symbol— 例えば $ または

- custom— カスタム文字は、custom_token_chars 設定を使用して設定する必要があります。
custom_token_chars トークンの一部として扱うべきカスタム文字。例えば、これを +-_ に設定すると、トークナイザーはプラス、マイナス、およびアンダースコア記号をトークンの一部として扱います。

通常、min_grammax_gram を同じ値に設定することが理にかなっています。長さが小さいほど、より多くのドキュメントが一致しますが、一致の質は低下します。長さが長いほど、一致がより特定的になります。トライグラム(長さ 3)は、始めるのに良い場所です。

インデックスレベル設定 index.max_ngram_diff は、max_grammin_gram の間の最大許容差を制御します。

Example configuration

この例では、ngram トークナイザーを構成して、文字と数字をトークンとして扱い、トライグラム(長さ 3 のグラム)を生成します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "ngram",
  13. "min_gram": 3,
  14. "max_gram": 3,
  15. "token_chars": [
  16. "letter",
  17. "digit"
  18. ]
  19. }
  20. }
  21. }
  22. },
  23. )
  24. print(resp)
  25. resp1 = client.indices.analyze(
  26. index="my-index-000001",
  27. analyzer="my_analyzer",
  28. text="2 Quick Foxes.",
  29. )
  30. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_analyzer: {
  8. tokenizer: 'my_tokenizer'
  9. }
  10. },
  11. tokenizer: {
  12. my_tokenizer: {
  13. type: 'ngram',
  14. min_gram: 3,
  15. max_gram: 3,
  16. token_chars: [
  17. 'letter',
  18. 'digit'
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. }
  25. )
  26. puts response
  27. response = client.indices.analyze(
  28. index: 'my-index-000001',
  29. body: {
  30. analyzer: 'my_analyzer',
  31. text: '2 Quick Foxes.'
  32. }
  33. )
  34. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. my_analyzer: {
  7. tokenizer: "my_tokenizer",
  8. },
  9. },
  10. tokenizer: {
  11. my_tokenizer: {
  12. type: "ngram",
  13. min_gram: 3,
  14. max_gram: 3,
  15. token_chars: ["letter", "digit"],
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);
  22. const response1 = await client.indices.analyze({
  23. index: "my-index-000001",
  24. analyzer: "my_analyzer",
  25. text: "2 Quick Foxes.",
  26. });
  27. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "ngram",
  13. "min_gram": 3,
  14. "max_gram": 3,
  15. "token_chars": [
  16. "letter",
  17. "digit"
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. }
  24. POST my-index-000001/_analyze
  25. {
  26. "analyzer": "my_analyzer",
  27. "text": "2 Quick Foxes."
  28. }

上記の例は、次の用語を生成します:

Text

  1. [ Qui, uic, ick, Fox, oxe, xes ]