パターン置換トークンフィルター
正規表現を使用してトークンの部分文字列を一致させて置換します。
pattern_replace
フィルターは Javaの正規表現構文 を使用します。デフォルトでは、フィルターは一致する部分文字列を空の部分文字列 (""
) に置き換えます。置換部分文字列は、Javaの $g
構文 を使用して元のトークンテキストからキャプチャグループを参照できます。
不適切に記述された正規表現は遅く実行されるか、StackOverflowErrorを返す可能性があり、式を実行しているノードが突然終了する原因となります。
病的な正規表現とそれを避ける方法 について詳しく読む。
このフィルターはLuceneの PatternReplaceFilter を使用します。
例
次の analyze API リクエストは、pattern_replace
フィルターを使用して、watch
を foxes jump lazy dogs
の部分文字列 dog
の前に追加します。
Python
resp = client.indices.analyze(
tokenizer="whitespace",
filter=[
{
"type": "pattern_replace",
"pattern": "(dog)",
"replacement": "watch$1"
}
],
text="foxes jump lazy dogs",
)
print(resp)
Ruby
response = client.indices.analyze(
body: {
tokenizer: 'whitespace',
filter: [
{
type: 'pattern_replace',
pattern: '(dog)',
replacement: 'watch$1'
}
],
text: 'foxes jump lazy dogs'
}
)
puts response
Js
const response = await client.indices.analyze({
tokenizer: "whitespace",
filter: [
{
type: "pattern_replace",
pattern: "(dog)",
replacement: "watch$1",
},
],
text: "foxes jump lazy dogs",
});
console.log(response);
コンソール
GET /_analyze
{
"tokenizer": "whitespace",
"filter": [
{
"type": "pattern_replace",
"pattern": "(dog)",
"replacement": "watch$1"
}
],
"text": "foxes jump lazy dogs"
}
フィルターは次のトークンを生成します。
テキスト
[ foxes, jump, lazy, watchdogs ]
設定可能なパラメータ
all
- (オプション、ブール値)
true
の場合、pattern
パラメータの正規表現に一致するすべての部分文字列が置き換えられます。false
の場合、フィルターは各トークン内の最初の一致する部分文字列のみを置き換えます。デフォルトはtrue
です。 pattern
- (必須、文字列) Javaの正規表現構文 で記述された正規表現。このパターンに一致するトークン部分文字列は、
replacement
パラメータの部分文字列に置き換えられます。 replacement
- (オプション、文字列) 置換部分文字列。デフォルトは空の部分文字列 (
""
) です。
アナライザーのカスタマイズと追加
pattern_replace
フィルターをカスタマイズするには、それを複製して新しいカスタムトークンフィルターの基礎を作成します。設定可能なパラメータを使用してフィルターを変更できます。
次の create index API リクエストは、カスタム pattern_replace
フィルター my_pattern_replace_filter
を使用して新しい カスタムアナライザー を構成します。
my_pattern_replace_filter
フィルターは、正規表現 [£|€]
を使用して通貨記号 £
と €
を一致させて削除します。フィルターの all
パラメータは false
であり、各トークン内の最初の一致する記号のみが削除されます。
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"my_pattern_replace_filter"
]
}
},
"filter": {
"my_pattern_replace_filter": {
"type": "pattern_replace",
"pattern": "[£|€]",
"replacement": "",
"all": False
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'keyword',
filter: [
'my_pattern_replace_filter'
]
}
},
filter: {
my_pattern_replace_filter: {
type: 'pattern_replace',
pattern: '[£|€]',
replacement: '',
all: false
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "keyword",
filter: ["my_pattern_replace_filter"],
},
},
filter: {
my_pattern_replace_filter: {
type: "pattern_replace",
pattern: "[£|€]",
replacement: "",
all: false,
},
},
},
},
});
console.log(response);
コンソール
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"my_pattern_replace_filter"
]
}
},
"filter": {
"my_pattern_replace_filter": {
"type": "pattern_replace",
"pattern": "[£|€]",
"replacement": "",
"all": false
}
}
}
}
}