パターンキャプチャトークンフィルター

pattern_capture トークンフィルターは、pattern トークナイザーとは異なり、正規表現の各キャプチャグループに対してトークンを出力します。パターンは文字列の先頭や末尾に固定されていないため、各パターンは複数回一致することができ、一致が重複することも許可されます。

病的な正規表現に注意

パターンキャプチャトークンフィルターは Java Regular Expressions を使用します。

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

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

例えば、次のようなパターン:

テキスト

  1. "(([a-z]+)(\d*))"

に対して一致した場合:

テキスト

  1. "abc123def456"

は次のトークンを生成します: [ abc123, abc, 123, def456, def, 456 ]

もし preserve_originaltrue (デフォルト) に設定されている場合、元のトークン abc123def456 も出力されます。

これは、ユーザーが "strip html""striphtml" を検索する可能性があるキャメルケースのコードなどのテキストをインデックスする際に特に便利です。例えば stripHTML のように。

Python

  1. resp = client.indices.create(
  2. index="test",
  3. settings={
  4. "analysis": {
  5. "filter": {
  6. "code": {
  7. "type": "pattern_capture",
  8. "preserve_original": True,
  9. "patterns": [
  10. "(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)",
  11. "(\\d+)"
  12. ]
  13. }
  14. },
  15. "analyzer": {
  16. "code": {
  17. "tokenizer": "pattern",
  18. "filter": [
  19. "code",
  20. "lowercase"
  21. ]
  22. }
  23. }
  24. }
  25. },
  26. )
  27. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'test',
  3. body: {
  4. settings: {
  5. analysis: {
  6. filter: {
  7. code: {
  8. type: 'pattern_capture',
  9. preserve_original: true,
  10. patterns: [
  11. '(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)',
  12. '(\\d+)'
  13. ]
  14. }
  15. },
  16. analyzer: {
  17. code: {
  18. tokenizer: 'pattern',
  19. filter: [
  20. 'code',
  21. 'lowercase'
  22. ]
  23. }
  24. }
  25. }
  26. }
  27. }
  28. )
  29. puts response

Js

  1. const response = await client.indices.create({
  2. index: "test",
  3. settings: {
  4. analysis: {
  5. filter: {
  6. code: {
  7. type: "pattern_capture",
  8. preserve_original: true,
  9. patterns: ["(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)", "(\\d+)"],
  10. },
  11. },
  12. analyzer: {
  13. code: {
  14. tokenizer: "pattern",
  15. filter: ["code", "lowercase"],
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT test
  2. {
  3. "settings" : {
  4. "analysis" : {
  5. "filter" : {
  6. "code" : {
  7. "type" : "pattern_capture",
  8. "preserve_original" : true,
  9. "patterns" : [
  10. "(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)",
  11. "(\\d+)"
  12. ]
  13. }
  14. },
  15. "analyzer" : {
  16. "code" : {
  17. "tokenizer" : "pattern",
  18. "filter" : [ "code", "lowercase" ]
  19. }
  20. }
  21. }
  22. }
  23. }

テキストを分析するために使用されるとき

Java

  1. import static org.apache.commons.lang.StringEscapeUtils.escapeHtml

これにより次のトークンが出力されます: [ import, static, org, apache, commons, lang, stringescapeutils, string, escape, utils, escapehtml, escape, html ]

別の例として、メールアドレスの分析があります:

Python

  1. resp = client.indices.create(
  2. index="test",
  3. settings={
  4. "analysis": {
  5. "filter": {
  6. "email": {
  7. "type": "pattern_capture",
  8. "preserve_original": True,
  9. "patterns": [
  10. "([^@]+)",
  11. "(\\p{L}+)",
  12. "(\\d+)",
  13. "@(.+)"
  14. ]
  15. }
  16. },
  17. "analyzer": {
  18. "email": {
  19. "tokenizer": "uax_url_email",
  20. "filter": [
  21. "email",
  22. "lowercase",
  23. "unique"
  24. ]
  25. }
  26. }
  27. }
  28. },
  29. )
  30. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'test',
  3. body: {
  4. settings: {
  5. analysis: {
  6. filter: {
  7. email: {
  8. type: 'pattern_capture',
  9. preserve_original: true,
  10. patterns: [
  11. '([^@]+)',
  12. '(\\p{L}+)',
  13. '(\\d+)',
  14. '@(.+)'
  15. ]
  16. }
  17. },
  18. analyzer: {
  19. email: {
  20. tokenizer: 'uax_url_email',
  21. filter: [
  22. 'email',
  23. 'lowercase',
  24. 'unique'
  25. ]
  26. }
  27. }
  28. }
  29. }
  30. }
  31. )
  32. puts response

Js

  1. const response = await client.indices.create({
  2. index: "test",
  3. settings: {
  4. analysis: {
  5. filter: {
  6. email: {
  7. type: "pattern_capture",
  8. preserve_original: true,
  9. patterns: ["([^@]+)", "(\\p{L}+)", "(\\d+)", "@(.+)"],
  10. },
  11. },
  12. analyzer: {
  13. email: {
  14. tokenizer: "uax_url_email",
  15. filter: ["email", "lowercase", "unique"],
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT test
  2. {
  3. "settings" : {
  4. "analysis" : {
  5. "filter" : {
  6. "email" : {
  7. "type" : "pattern_capture",
  8. "preserve_original" : true,
  9. "patterns" : [
  10. "([^@]+)",
  11. "(\\p{L}+)",
  12. "(\\d+)",
  13. "@(.+)"
  14. ]
  15. }
  16. },
  17. "analyzer" : {
  18. "email" : {
  19. "tokenizer" : "uax_url_email",
  20. "filter" : [ "email", "lowercase", "unique" ]
  21. }
  22. }
  23. }
  24. }
  25. }

上記のアナライザーが次のようなメールアドレスに使用されるとき:

テキスト

  1. john-smith_123@foo-bar.com

次のトークンを生成します:

  1. john-smith_123@foo-bar.com, john-smith_123,
  2. john, smith, 123, foo-bar.com, foo, bar, com

重複キャプチャを許可するためには複数のパターンが必要ですが、パターンが密度が低く、理解しやすくなることも意味します。

注意: すべてのトークンは同じ位置で、同じ文字オフセットで出力されます。これは、例えば、[email protected] に対する match クエリがこのアナライザーを使用すると、and 演算子を使用しても、これらのトークンのいずれかを含むドキュメントを返すことを意味します。また、ハイライトと組み合わせると、元のトークン全体がハイライトされ、一致する部分だけではありません。例えば、上記のメールアドレスに対して "smith" をクエリすると、次のようにハイライトされます:

Html

  1. <em>[email protected]</em>

ではなく:

Html

  1. john-<em>smith</em>[email protected]