Elasticsearchを使用してオートコンプリートを実装しようとしていますが、その方法を理解していると思います...
クロールされたデータのインデックス作成中にESのEdge_n_gramsを使用して、マルチワード(フレーズ)の提案を作成しようとしています。
tokenizer
とtoken_filter
の違いは何ですか-私はこれらのドキュメントを読みましたが、それでもそれらについてもっと理解する必要があります..。
たとえば、ESがユーザー入力を検索するために使用するtoken_filterは何ですか?トークナイザーは、ESがトークンを作成するために使用するものですか?トークンとは何ですか?
ESがこれらのいずれかを使用してマルチワードの提案を作成することは可能ですか?
トークナイザーは入力全体をトークンに分割し、トークンフィルターは各トークンに何らかの変換を適用します。
たとえば、入力が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トークンフィルターを使用すると、次のトークンが取得されます。
T
、Th
、The
q
、qu
、qui
、quic
、quick
b
、br
、bro
、brow
、brown
f
、fo
、fox
ご覧のとおり、edgeNgramtokenizerまたはtoken filterのどちらを選択するかは異なりますテキストをどのようにスライスおよびダイスするか、およびどのように検索するかについて。
分析プロセスを視覚化し、各ステップ(トークン化とトークンフィルタリング)で何が生成されているかを確認する方法を提供する優れた elyzer ツールをご覧になることをお勧めします。
ES 2.2以降、_analyze
エンドポイントは 機能の説明 もサポートします。これは、分析プロセスの各ステップでの詳細を示します。
詳細なユースケースをいくつか公開したいと思います。
デフォルトでは、トークンには任意の文字(スペースを含む)を含めることができるため、このトークナイザーはすべてのテキストを単一のトークンとして扱います。
GET {ELASTICSEARCH_URL}/_analyze
{
"tokenizer": "Edge_ngram",
"text": "How are you?"
}
結果:
["H", "Ho"]
説明:1つのトークン、min_gram
= 1、max_gram
= 2。
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。
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つのトークンHow
、old
、are
、you
(トークンには、token_chars
のため、文字のみを含めることができます)、min_gram
= 2、max_gram
= 7ですが、文のトークンの最大長は3です。
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
。