ESではあまり使われていないfilterをまとめます
13012 ワード
前に書く
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つのパラメータを設定できます.
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より大きい単語がフィルタリングされていることがわかります.
インデックスに
length
filerを指定する場合は、次の例を参照してください.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
を参照することができ、後者はkeyword
tokenizerに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つのプロパティが表示されます.
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"
}