web-dev-qa-db-ja.com

トークナイザーとトークンフィルター

Elasticsearchを使用してオートコンプリートを実装しようとしていますが、その方法を理解していると思います...

クロールされたデータのインデックス作成中にESのEdge_n_gramsを使用して、マルチワード(フレーズ)の提案を作成しようとしています。

tokenizertoken_filterの違いは何ですか-私はこれらのドキュメントを読みましたが、それでもそれらについてもっと理解する必要があります..。

たとえば、ESがユーザー入力を検索するために使用するtoken_filterは何ですか?トークナイザーは、ESがトークンを作成するために使用するものですか?トークンとは何ですか?

ESがこれらのいずれかを使用してマルチワードの提案を作成することは可能ですか?

20
user3125823

トークナイザーは入力全体をトークンに分割し、トークンフィルターは各トークンに何らかの変換を適用します。

たとえば、入力がThe quick brown foxであるとします。 edgeNGramtokenizerを使用すると、次のトークンを取得できます。

  • T
  • Th
  • The
  • The(最後の文字はスペースです)
  • The q
  • The qu
  • The qui
  • The quic
  • The quick
  • The quick(最後の文字はスペースです)
  • The quick b
  • The quick br
  • The quick bro
  • The quick brow
  • The quick brown
  • The quick brown(最後の文字はスペースです)
  • The quick brown f
  • The quick brown fo
  • The quick brown fox

ただし、入力を単語/トークンに分割する標準のトークナイザーを使用してから、edgeNGramトークンフィルターを使用すると、次のトークンが取得されます。

  • TThThe
  • qququiquicquick
  • bbrbrobrowbrown
  • ffofox

ご覧のとおり、edgeNgramtokenizerまたはtoken filterのどちらを選択するかは異なりますテキストをどのようにスライスおよびダイスするか、およびどのように検索するかについて。

分析プロセスを視覚化し、各ステップ(トークン化とトークンフィルタリング)で何が生成されているかを確認する方法を提供する優れた elyzer ツールをご覧になることをお勧めします。

ES 2.2以降、_analyzeエンドポイントは 機能の説明 もサポートします。これは、分析プロセスの各ステップでの詳細を示します。

44
Val

詳細なユースケースをいくつか公開したいと思います。

エッジn-gramトークナイザー(デフォルト)

デフォルトでは、トークンには任意の文字(スペースを含む)を含めることができるため、このトークナイザーはすべてのテキストを単一のトークンとして扱います。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "Edge_ngram",
  "text": "How are you?"
}

結果:

["H", "Ho"]

説明:1つのトークン、min_gram = 1、max_gram = 2。

エッジn-gramトークナイザー(token_charsなしのカスタム)

PUT {ELASTICSEARCH_URL}/custom_Edge_ngram

{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_Edge_ngram": {
          "tokenizer": "custom_Edge_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "custom_Edge_ngram_tokenizer": {
          "type": "Edge_ngram",
          "min_gram": 2,
          "max_gram": 7
        }
      }
    }
  }
}
GET {ELASTICSEARCH_URL}/custom_Edge_ngram/_analyze

{
  "analyzer": "custom_Edge_ngram",
  "text": "How old are you?"
}

結果:

["Ho", "How", "How ", "How o", "How ol", "How old"]

説明:まだ1つのトークン、min_gram = 2、max_gram = 7。

エッジn-gramトークナイザー(token_charsを使用したカスタム)

PUT {ELASTICSEARCH_URL}/custom_Edge_ngram_2

{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_Edge_ngram": {
          "tokenizer": "custom_Edge_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "custom_Edge_ngram_tokenizer": {
          "type": "Edge_ngram",
          "min_gram": 2,
          "max_gram": 7,
          "token_chars": ["letter"]
        }
      }
    }
  }
}
GET {ELASTICSEARCH_URL}/custom_Edge_ngram_2/_analyze

{
  "analyzer": "custom_Edge_ngram",
  "text": "How old are you?"
}

結果:

["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]

説明:4つのトークンHowoldareyou(トークンには、token_charsのため、文字のみを含めることができます)、min_gram = 2、max_gram = 7ですが、文のトークンの最大長は3です。

エッジn-gramトークンフィルター

Tokenizerは、テキストをトークンのストリームに変換します。

トークンフィルターは、ストリームの各トークンで機能します。

トークンフィルターは、トークンを追加、更新、削除することでストリームを変更できます。

standardトークナイザーを使用しましょう。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "standard",
  "text": "How old are you?"
}

結果:

["How", "old", "are", "you"]

それでは、トークンフィルターを追加しましょう。

GET {ELASTICSEARCH_URL}/_analyze

{
  "tokenizer": "standard",
  "filter": [
    { "type": "Edge_ngram",
      "min_gram": 2,
      "max_gram": 7
    }
  ],
  "text": "How old are you?"
}

結果:

["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]

説明:トークンごとにEdge_nram

0
Max Starling