パターン置換トークンフィルター

正規表現を使用してトークンの部分文字列を一致させて置換します。

pattern_replace フィルターは Javaの正規表現構文 を使用します。デフォルトでは、フィルターは一致する部分文字列を空の部分文字列 ("") に置き換えます。置換部分文字列は、Javaの $g 構文 を使用して元のトークンテキストからキャプチャグループを参照できます。

不適切に記述された正規表現は遅く実行されるか、StackOverflowErrorを返す可能性があり、式を実行しているノードが突然終了する原因となります。

病的な正規表現とそれを避ける方法 について詳しく読む。

このフィルターはLuceneの PatternReplaceFilter を使用します。

次の analyze API リクエストは、pattern_replace フィルターを使用して、watchfoxes jump lazy dogs の部分文字列 dog の前に追加します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "pattern_replace",
  6. "pattern": "(dog)",
  7. "replacement": "watch$1"
  8. }
  9. ],
  10. text="foxes jump lazy dogs",
  11. )
  12. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'pattern_replace',
  7. pattern: '(dog)',
  8. replacement: 'watch$1'
  9. }
  10. ],
  11. text: 'foxes jump lazy dogs'
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "pattern_replace",
  6. pattern: "(dog)",
  7. replacement: "watch$1",
  8. },
  9. ],
  10. text: "foxes jump lazy dogs",
  11. });
  12. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "pattern_replace",
  7. "pattern": "(dog)",
  8. "replacement": "watch$1"
  9. }
  10. ],
  11. "text": "foxes jump lazy dogs"
  12. }

フィルターは次のトークンを生成します。

テキスト

  1. [ 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

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "keyword",
  8. "filter": [
  9. "my_pattern_replace_filter"
  10. ]
  11. }
  12. },
  13. "filter": {
  14. "my_pattern_replace_filter": {
  15. "type": "pattern_replace",
  16. "pattern": "[£|€]",
  17. "replacement": "",
  18. "all": False
  19. }
  20. }
  21. }
  22. },
  23. )
  24. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_analyzer: {
  8. tokenizer: 'keyword',
  9. filter: [
  10. 'my_pattern_replace_filter'
  11. ]
  12. }
  13. },
  14. filter: {
  15. my_pattern_replace_filter: {
  16. type: 'pattern_replace',
  17. pattern: '[£|€]',
  18. replacement: '',
  19. all: false
  20. }
  21. }
  22. }
  23. }
  24. }
  25. )
  26. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. my_analyzer: {
  7. tokenizer: "keyword",
  8. filter: ["my_pattern_replace_filter"],
  9. },
  10. },
  11. filter: {
  12. my_pattern_replace_filter: {
  13. type: "pattern_replace",
  14. pattern: "[£|€]",
  15. replacement: "",
  16. all: false,
  17. },
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "keyword",
  8. "filter": [
  9. "my_pattern_replace_filter"
  10. ]
  11. }
  12. },
  13. "filter": {
  14. "my_pattern_replace_filter": {
  15. "type": "pattern_replace",
  16. "pattern": "[£|€]",
  17. "replacement": "",
  18. "all": false
  19. }
  20. }
  21. }
  22. }
  23. }