エッジn-グラムトークンフィルター
トークンの先頭から指定された長さのn-グラムを形成します。
例えば、edge_ngram
トークンフィルターを使用してquick
をqu
に変更できます。
カスタマイズされていない場合、フィルターはデフォルトで1文字のエッジn-グラムを作成します。
このフィルターはLuceneのEdgeNGramTokenFilterを使用します。
## 例
以下の[分析API](/read/elasticsearch-8-15/1a51b9d359d8a54c.md)リクエストは、`````edge_ngram`````フィルターを使用して`````the quick brown fox jumps`````を1文字および2文字のエッジn-グラムに変換します:
#### Python
``````python
resp = client.indices.analyze(
tokenizer="standard",
filter=[
{
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 2
}
],
text="the quick brown fox jumps",
)
print(resp)
`
Ruby
response = client.indices.analyze(
body: {
tokenizer: 'standard',
filter: [
{
type: 'edge_ngram',
min_gram: 1,
max_gram: 2
}
],
text: 'the quick brown fox jumps'
}
)
puts response
Js
const response = await client.indices.analyze({
tokenizer: "standard",
filter: [
{
type: "edge_ngram",
min_gram: 1,
max_gram: 2,
},
],
text: "the quick brown fox jumps",
});
console.log(response);
コンソール
GET _analyze
{
"tokenizer": "standard",
"filter": [
{ "type": "edge_ngram",
"min_gram": 1,
"max_gram": 2
}
],
"text": "the quick brown fox jumps"
}
フィルターは以下のトークンを生成します:
テキスト
[ t, th, q, qu, b, br, f, fo, j, ju ]
アナライザーに追加
以下のインデックス作成APIリクエストは、edge_ngram
フィルターを使用して新しいカスタムアナライザーを構成します。
Python
resp = client.indices.create(
index="edge_ngram_example",
settings={
"analysis": {
"analyzer": {
"standard_edge_ngram": {
"tokenizer": "standard",
"filter": [
"edge_ngram"
]
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'edge_ngram_example',
body: {
settings: {
analysis: {
analyzer: {
standard_edge_ngram: {
tokenizer: 'standard',
filter: [
'edge_ngram'
]
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "edge_ngram_example",
settings: {
analysis: {
analyzer: {
standard_edge_ngram: {
tokenizer: "standard",
filter: ["edge_ngram"],
},
},
},
},
});
console.log(response);
コンソール
PUT edge_ngram_example
{
"settings": {
"analysis": {
"analyzer": {
"standard_edge_ngram": {
"tokenizer": "standard",
"filter": [ "edge_ngram" ]
}
}
}
}
}
設定可能なパラメータ
max_gram
- (オプション、整数) グラムの最大文字数。カスタムトークンフィルターの場合、デフォルトは
2
です。組み込みのedge_ngram
フィルターの場合、デフォルトは1
です。max_gram
パラメータの制限を参照してください。 min_gram
- (オプション、整数) グラムの最小文字数。デフォルトは
1
です。 preserve_original
- (オプション、ブール値)
true
に設定すると元のトークンを出力します。デフォルトはfalse
です。 side
- (オプション、文字列) 廃止予定。
front
またはback
からトークンを切り捨てるかどうかを示します。デフォルトはfront
です。back
値を使用する代わりに、reverse
トークンフィルターをedge_ngram
フィルターの前後に使用して同じ結果を得ることができます。
カスタマイズ
例えば、以下のリクエストは、3〜5文字のn-グラムを形成するカスタム`````edge_ngram`````フィルターを作成します。
#### Python
``````python
resp = client.indices.create(
index="edge_ngram_custom_example",
settings={
"analysis": {
"analyzer": {
"default": {
"tokenizer": "whitespace",
"filter": [
"3_5_edgegrams"
]
}
},
"filter": {
"3_5_edgegrams": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 5
}
}
}
},
)
print(resp)
`
Ruby
response = client.indices.create(
index: 'edge_ngram_custom_example',
body: {
settings: {
analysis: {
analyzer: {
default: {
tokenizer: 'whitespace',
filter: [
'3_5_edgegrams'
]
}
},
filter: {
"3_5_edgegrams": {
type: 'edge_ngram',
min_gram: 3,
max_gram: 5
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "edge_ngram_custom_example",
settings: {
analysis: {
analyzer: {
default: {
tokenizer: "whitespace",
filter: ["3_5_edgegrams"],
},
},
filter: {
"3_5_edgegrams": {
type: "edge_ngram",
min_gram: 3,
max_gram: 5,
},
},
},
},
});
console.log(response);
コンソール
PUT edge_ngram_custom_example
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"tokenizer": "whitespace",
"filter": [ "3_5_edgegrams" ]
}
},
"filter": {
"3_5_edgegrams": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 5
}
}
}
}
}
@@4_1@@パラメータの制限
edge_ngram
フィルターのmax_gram
値はトークンの文字数を制限します。edge_ngram
フィルターがインデックスアナライザーと共に使用される場合、これはmax_gram
の長さよりも長い検索用語がインデックスされた用語と一致しない可能性があることを意味します。
例えば、max_gram
が3
の場合、apple
の検索はインデックスされた用語app
と一致しません。
これを考慮するために、truncate
フィルターを検索アナライザーと共に使用して、検索用語をmax_gram
文字の長さに短縮できます。ただし、これにより無関係な結果が返される可能性があります。
例えば、max_gram
が3
で、検索用語が3文字に切り捨てられる場合、検索用語apple
はapp
に短縮されます。これは、apple
の検索がapp
に一致するインデックスされた用語を返すことを意味します。例えば、apply
、snapped
、apple
などです。
どちらのアプローチがあなたのユースケースと望ましい検索体験に最適かを確認するために、両方のアプローチをテストすることをお勧めします。