ESではあまり使われていないfilterをまとめます


前に書く


ESに内蔵されているtoken filterは多く、ほとんどの実際の作業では使用できません.この间、ES认证技师の试験を准备して、试験に备える时、これらのよく使わないfilterを熟知する必要があります.ES公式はfilterを一筆しか持っていないので、受験準備のメモをブログに整理してメモしたいと思っています.この方面のニーズがある人にも助けてほしいと思っています.

length filer


公式解釈:
A token filter of type length that removes words that are too long or too short for the stream.
このfilterの機能は、長すぎる単語や短すぎる単語を取り除くことです.2つのパラメータを設定できます.
  • min最短長を定義し、デフォルトは0
  • maxは最長長を定義し、デフォルトはInteger.MAX_VALUE
  • まず効果を簡単にテストしてみましょう
    GET _analyze
    {
      "tokenizer" : "standard",
      "filter": [{"type": "length", "min":1, "max":3 }],  
      "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone"
    }

    出力:
    {
      "tokens" : [
        {
          "token" : "The",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "",
          "position" : 0
        },
        {
          "token" : "2",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "",
          "position" : 1
        },
        {
          "token" : "the",
          "start_offset" : 36,
          "end_offset" : 39,
          "type" : "",
          "position" : 7
        }
      ]
    }

    3より大きい単語がフィルタリングされていることがわかります.
    インデックスにlengthfilerを指定する場合は、次の例を参照してください.
    PUT /length_example
    {
        "settings" : {
            "analysis" : {
                "analyzer" : {
                    "default" : {
                        "tokenizer" : "standard",
                        "filter" : ["my_length"]
                    }
                },
                "filter" : {
                    "my_length" : {
                        "type" : "length",
                        "min" : 1,
                        "max": 3
                    }
                }
            }
        }
    }
    
    GET length_example/_analyze
    {
      "analyzer": "default", 
      "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bonet"
    }

    ngram filter


    ngram filterの意味はngram tokenizeを参照することができ、後者はkeywordtokenizerにngram filterを加えることに相当し、効果は同じである.
    まずtextテキストを切り分け、実行時にN-gramカットアルゴリズムを採用する.N-gramsアルゴリズムは、単語を通り抜けるスライド窓のように、特定の長さの持続的な文字シーケンスです.
    抽象的な話ですが、例を挙げてみましょう.
    GET _analyze
    {
      "tokenizer": "ngram",
      "text": " "
    }
    
    GET _analyze
    {
      "tokenizer" : "keyword",
      "filter": [{"type": "ngram", "min_gram":1, "max_gram":2 }],  
      "text" : " "
    }

    2つのプロパティが表示されます.
  • min_gramは単語の最小文字長で、デフォルトは1
  • です.
  • max_gramは単語の最大文字長で、デフォルトは2
  • です.
    maxとminの間隔、すなわちステップ長のデフォルトは最大1しかありません.インデックスのmax_ngram_diffを設定することで、次のように変更できます.
    PUT /ngram_example
    {
        "settings" : {
          "index": {
          "max_ngram_diff": 10
        },
            "analysis" : {
                "analyzer" : {
                    "default" : {
                        "tokenizer" : "keyword",
                        "filter" : ["my_ngram"]
                    }
                },
                "filter" : {
                    "my_ngram" : {
                        "type" : "ngram",
                        "min_gram" : 2,
                        "max_gram": 4
                    }
                }
            }
        }
    }

    インデックスのanalyzerテストを使用して、
    GET ngram_example/_analyze
    {
      "analyzer": "default", 
      "text" : " "
    }

    出力、
    {
      "tokens" : [
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        }
      ]
    }
    

    あなたはすでにngram filterの使い方を基本的に知っているはずですが、このフィルタはどんなシーンで使われているのか疑問に思うかもしれません.実際には、検索推奨機能などの接頭辞検索に適しており、文の一部だけを入力すると、検索エンジンはこの部分を接頭辞とする一致項目を表示し、推奨機能を実現します.

    trim filter


    このfilterは名前からも機能がわかり、前後のスペースを削除することができます.例を見てみましょう.
    GET _analyze
    {
      "tokenizer" : "keyword",
      "filter": [{"type": "trim"}],  
      "text" : "  "
    }

    出力、
    {
      "tokens" : [
        {
          "token" : "  ",
          "start_offset" : 0,
          "end_offset" : 5,
          "type" : "word",
          "position" : 0
        }
      ]
    }

    truncate filter


    このfilterにはlength属性があり、分詞後のtermを遮断し、termの長さがlengthを超えないことを確保することができます.例を見てみましょう
    GET _analyze
    {
      "tokenizer" : "keyword",
      "filter": [{"type": "truncate", "length": 3}],  
      "text" : " "
    }

    出力、
    {
      "tokens" : [
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "word",
          "position" : 0
        }
      ]
    }

    次の例を示します.
    GET _analyze
    {
      "tokenizer" : "standard",
      "filter": [{"type": "truncate", "length": 3}],  
      "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }

    出力、
    {
      "tokens" : [
        {
          "token" : "The",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "",
          "position" : 0
        },
        {
          "token" : "2",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "",
          "position" : 1
        },
        {
          "token" : "QUI",
          "start_offset" : 6,
          "end_offset" : 11,
          "type" : "",
          "position" : 2
        },
        ...
        

    このfilterはkeywordの長いシーンで、OOMなどの問題を避けるために使用できます.

    unique filter


    Uniqueメタフィルタの役割は,同じ結果のメタが一度しか現れないことを保証することである.例を見てみましょう.
    GET _analyze
    {
        "tokenizer": "standard",
        "filter": ["unique"],
        "text": "this is a test test test"
    }

    出力、
    {
      "tokens" : [
        {
          "token" : "this",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "",
          "position" : 0
        },
        {
          "token" : "is",
          "start_offset" : 5,
          "end_offset" : 7,
          "type" : "",
          "position" : 1
        },
        {
          "token" : "a",
          "start_offset" : 8,
          "end_offset" : 9,
          "type" : "",
          "position" : 2
        },
        {
          "token" : "test",
          "start_offset" : 10,
          "end_offset" : 14,
          "type" : "",
          "position" : 3
        }
      ]
    }

    synonym token filter


    類義語フィルタ.例えば、あるドキュメントに という言葉が含まれています.私たちは または を検索したいと思っています. でも、このドキュメントを見つけることができます.例は次のとおりです.
    PUT /synonym_example
    {
        "settings": {
                "analysis" : {
                    "analyzer" : {
                        "synonym" : {
                            "tokenizer" : "whitespace",
                            "filter" : ["my_synonym"]
                        }
                    },
                    "filter" : {
                        "my_synonym" : {
                            "type" : "synonym",
                            "synonyms_path" : "analysis/synonym.txt"
                        }
                    }
                }
        }
    }

    ESインスタンスのconfigディレクトリの下に、次のようなanalysis/synonym.txtのファイルを新規作成する必要があります.
     , , 

    再起動することを忘れないでください.
    そしてテストしてみると、
    GET /synonym_example/_analyze
    {
      "analyzer": "synonym",
      "text": " "
    }

    出力、
    {
      "tokens" : [
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "word",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "SYNONYM",
          "position" : 0
        }
      ]
    }

    複数のfilterを組み合わせる方法


    1つのアナライザに複数のフィルタが含まれることを知っていますが、どうやって実現しますか?次の例を見てください.
    GET _analyze
    {
      "tokenizer" : "standard",
      "filter": [{"type": "length", "min":1, "max":4 },{"type": "truncate", "length": 3}],  
      "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }

    この例では、length filterとtruncate filterを組み合わせて使用します.まず標準分詞に基づいて、分詞後のtermが4バイトより大きい場合はまずフィルタリングされ、残りのtermは3バイトに切断されます.出力結果は、
    {
      "tokens" : [
        {
          "token" : "The",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "",
          "position" : 0
        },
        {
          "token" : "2",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "",
          "position" : 1
        },
        {
          "token" : "ove",
          "start_offset" : 31,
          "end_offset" : 35,
          "type" : "",
          "position" : 6
        },
        {
          "token" : "the",
          "start_offset" : 36,
          "end_offset" : 39,
          "type" : "",
          "position" : 7
        },
        {
          "token" : "laz",
          "start_offset" : 40,
          "end_offset" : 44,
          "type" : "",
          "position" : 8
        },
        {
          "token" : "bon",
          "start_offset" : 51,
          "end_offset" : 55,
          "type" : "",
          "position" : 10
        }
      ]
    }
    

    インデックスで使用する場合は、次の例を参照してください.
    PUT /length_truncate_example
    {
        "settings" : {
            "analysis" : {
                "analyzer" : {
                    "default" : {
                        "tokenizer" : "standard",
                        "filter" : ["my_length", "my_truncate"]
                    }
                },
                "filter" : {
                    "my_length" : {
                        "type" : "length",
                        "min" : 1,
                        "max": 4
                    },
                    "my_truncate" : {
                        "type" : "truncate",
                        "length": 3
                    }
                }
            }
        }
    }
    
    GET length_truncate_example/_analyze
    {
      "analyzer": "default", 
      "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bonet"
    }