エッジn-グラムトークンフィルター

トークンの先頭から指定された長さのn-グラムを形成します。

例えば、edge_ngramトークンフィルターを使用してquickquに変更できます。

カスタマイズされていない場合、フィルターはデフォルトで1文字のエッジn-グラムを作成します。

このフィルターはLuceneのEdgeNGramTokenFilterを使用します。

  1. ## 例
  2. 以下の[分析API](/read/elasticsearch-8-15/1a51b9d359d8a54c.md)リクエストは、`````edge_ngram`````フィルターを使用して`````the quick brown fox jumps`````1文字および2文字のエッジn-グラムに変換します:
  3. #### Python
  4. ``````python
  5. resp = client.indices.analyze(
  6. tokenizer="standard",
  7. filter=[
  8. {
  9. "type": "edge_ngram",
  10. "min_gram": 1,
  11. "max_gram": 2
  12. }
  13. ],
  14. text="the quick brown fox jumps",
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'standard',
  4. filter: [
  5. {
  6. type: 'edge_ngram',
  7. min_gram: 1,
  8. max_gram: 2
  9. }
  10. ],
  11. text: 'the quick brown fox jumps'
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "standard",
  3. filter: [
  4. {
  5. type: "edge_ngram",
  6. min_gram: 1,
  7. max_gram: 2,
  8. },
  9. ],
  10. text: "the quick brown fox jumps",
  11. });
  12. console.log(response);

コンソール

  1. GET _analyze
  2. {
  3. "tokenizer": "standard",
  4. "filter": [
  5. { "type": "edge_ngram",
  6. "min_gram": 1,
  7. "max_gram": 2
  8. }
  9. ],
  10. "text": "the quick brown fox jumps"
  11. }

フィルターは以下のトークンを生成します:

テキスト

  1. [ t, th, q, qu, b, br, f, fo, j, ju ]

アナライザーに追加

以下のインデックス作成APIリクエストは、edge_ngramフィルターを使用して新しいカスタムアナライザーを構成します。

Python

  1. resp = client.indices.create(
  2. index="edge_ngram_example",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "standard_edge_ngram": {
  7. "tokenizer": "standard",
  8. "filter": [
  9. "edge_ngram"
  10. ]
  11. }
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'edge_ngram_example',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. standard_edge_ngram: {
  8. tokenizer: 'standard',
  9. filter: [
  10. 'edge_ngram'
  11. ]
  12. }
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.create({
  2. index: "edge_ngram_example",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. standard_edge_ngram: {
  7. tokenizer: "standard",
  8. filter: ["edge_ngram"],
  9. },
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT edge_ngram_example
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "standard_edge_ngram": {
  7. "tokenizer": "standard",
  8. "filter": [ "edge_ngram" ]
  9. }
  10. }
  11. }
  12. }
  13. }

設定可能なパラメータ

  • max_gram
  • (オプション、整数) グラムの最大文字数。カスタムトークンフィルターの場合、デフォルトは2です。組み込みのedge_ngramフィルターの場合、デフォルトは1です。
    max_gramパラメータの制限を参照してください。
  • min_gram
  • (オプション、整数) グラムの最小文字数。デフォルトは1です。
  • preserve_original
  • (オプション、ブール値) trueに設定すると元のトークンを出力します。デフォルトはfalseです。
  • side
  • (オプション、文字列) 廃止予定。frontまたはbackからトークンを切り捨てるかどうかを示します。デフォルトはfrontです。
    back値を使用する代わりに、reverseトークンフィルターをedge_ngramフィルターの前後に使用して同じ結果を得ることができます。

カスタマイズ

  1. 例えば、以下のリクエストは、35文字のn-グラムを形成するカスタム`````edge_ngram`````フィルターを作成します。
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="edge_ngram_custom_example",
  6. settings={
  7. "analysis": {
  8. "analyzer": {
  9. "default": {
  10. "tokenizer": "whitespace",
  11. "filter": [
  12. "3_5_edgegrams"
  13. ]
  14. }
  15. },
  16. "filter": {
  17. "3_5_edgegrams": {
  18. "type": "edge_ngram",
  19. "min_gram": 3,
  20. "max_gram": 5
  21. }
  22. }
  23. }
  24. },
  25. )
  26. print(resp)
  27. `

Ruby

  1. response = client.indices.create(
  2. index: 'edge_ngram_custom_example',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. default: {
  8. tokenizer: 'whitespace',
  9. filter: [
  10. '3_5_edgegrams'
  11. ]
  12. }
  13. },
  14. filter: {
  15. "3_5_edgegrams": {
  16. type: 'edge_ngram',
  17. min_gram: 3,
  18. max_gram: 5
  19. }
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.indices.create({
  2. index: "edge_ngram_custom_example",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. default: {
  7. tokenizer: "whitespace",
  8. filter: ["3_5_edgegrams"],
  9. },
  10. },
  11. filter: {
  12. "3_5_edgegrams": {
  13. type: "edge_ngram",
  14. min_gram: 3,
  15. max_gram: 5,
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT edge_ngram_custom_example
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "default": {
  7. "tokenizer": "whitespace",
  8. "filter": [ "3_5_edgegrams" ]
  9. }
  10. },
  11. "filter": {
  12. "3_5_edgegrams": {
  13. "type": "edge_ngram",
  14. "min_gram": 3,
  15. "max_gram": 5
  16. }
  17. }
  18. }
  19. }
  20. }

@@4_1@@パラメータの制限

edge_ngramフィルターのmax_gram値はトークンの文字数を制限します。edge_ngramフィルターがインデックスアナライザーと共に使用される場合、これはmax_gramの長さよりも長い検索用語がインデックスされた用語と一致しない可能性があることを意味します。

例えば、max_gram3の場合、appleの検索はインデックスされた用語appと一致しません。

これを考慮するために、truncateフィルターを検索アナライザーと共に使用して、検索用語をmax_gram文字の長さに短縮できます。ただし、これにより無関係な結果が返される可能性があります。

例えば、max_gram3で、検索用語が3文字に切り捨てられる場合、検索用語appleappに短縮されます。これは、appleの検索がappに一致するインデックスされた用語を返すことを意味します。例えば、applysnappedappleなどです。

どちらのアプローチがあなたのユースケースと望ましい検索体験に最適かを確認するために、両方のアプローチをテストすることをお勧めします。