パターンアナライザー

pattern アナライザーは、正規表現を使用してテキストを用語に分割します。正規表現は、トークンセパレーターに一致する必要があり、トークン自体には一致しません。正規表現のデフォルトは \W+(またはすべての非単語文字)です。

パターンアナライザー

pattern アナライザーは、正規表現を使用してテキストを用語に分割します。正規表現は、トークンセパレーターに一致する必要があり、トークン自体には一致しません。正規表現のデフォルトは \W+(またはすべての非単語文字)です。

例の出力

Python

  1. resp = client.indices.analyze(
  2. analyzer="pattern",
  3. text="The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. analyzer: 'pattern',
  4. text: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.analyze({
  2. analyzer: "pattern",
  3. text: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.",
  4. });
  5. console.log(response);

コンソール

  1. POST _analyze
  2. {
  3. "analyzer": "pattern",
  4. "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }

上記の文は次の用語を生成します:

テキスト

  1. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

設定

pattern アナライザーは次のパラメーターを受け入れます:

pattern Java 正規表現、デフォルトは \W+ です。
flags Java 正規表現の フラグ
フラグはパイプで区切る必要があります。例: `````”CASE_INSENSITIVE
COMMENTS”`````。
lowercase 用語を小文字にするかどうか。デフォルトは true です。
stopwords _english_ のような事前定義されたストップワードリストまたはストップワードのリストを含む配列。デフォルトは _none_ です。
stopwords_path ストップワードを含むファイルへのパス。

ストップワードの設定に関する詳細は ストップトークンフィルター を参照してください。

例の設定

この例では、pattern アナライザーを使用して、非単語文字またはアンダースコア (\W|_) でメールアドレスを分割し、結果を小文字にします:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_email_analyzer": {
  7. "type": "pattern",
  8. "pattern": "\\W|_",
  9. "lowercase": True
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.indices.analyze(
  17. index="my-index-000001",
  18. analyzer="my_email_analyzer",
  19. text="[email protected]",
  20. )
  21. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_email_analyzer: {
  8. type: 'pattern',
  9. pattern: '\\W|_',
  10. lowercase: true
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.indices.analyze(
  19. index: 'my-index-000001',
  20. body: {
  21. analyzer: 'my_email_analyzer',
  22. text: '[email protected]'
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. my_email_analyzer: {
  7. type: "pattern",
  8. pattern: "\\W|_",
  9. lowercase: true,
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.indices.analyze({
  17. index: "my-index-000001",
  18. analyzer: "my_email_analyzer",
  19. text: "[email protected]",
  20. });
  21. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_email_analyzer": {
  7. "type": "pattern",
  8. "pattern": "\\W|_",<br> "lowercase": true<br> }<br> }<br> }<br> }<br>}<br><br>POST my-index-000001/_analyze<br>{<br> "analyzer": "my_email_analyzer",<br> "text": "[email protected]"<br>}<br>``````<br><br>
  9. | | |
  10. | --- | --- |
  11. | | パターンを JSON 文字列として指定する際には、パターン内のバックスラッシュをエスケープする必要があります。 |
  12. 上記の例は次の用語を生成します:
  13. #### テキスト
  14. ``````text
  15. [ john, smith, foo, bar, com ]

キャメルケーストークナイザー

以下のより複雑な例は、キャメルケースのテキストをトークンに分割します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "camel": {
  7. "type": "pattern",
  8. "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
  9. }
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.indices.analyze(
  16. index="my-index-000001",
  17. analyzer="camel",
  18. text="MooseX::FTPClass2_beta",
  19. )
  20. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. camel: {
  8. type: 'pattern',
  9. pattern: '([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.indices.analyze(
  18. index: 'my-index-000001',
  19. body: {
  20. analyzer: 'camel',
  21. text: 'MooseX::FTPClass2_beta'
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. camel: {
  7. type: "pattern",
  8. pattern:
  9. "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])",
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.indices.analyze({
  17. index: "my-index-000001",
  18. analyzer: "camel",
  19. text: "MooseX::FTPClass2_beta",
  20. });
  21. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "camel": {
  7. "type": "pattern",
  8. "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
  9. }
  10. }
  11. }
  12. }
  13. }
  14. GET my-index-000001/_analyze
  15. {
  16. "analyzer": "camel",
  17. "text": "MooseX::FTPClass2_beta"
  18. }

上記の例は次の用語を生成します:

テキスト

  1. [ moose, x, ftp, class, 2, beta ]

上記の正規表現は次のように理解しやすくなります:

正規表現

  1. ([^\p{L}\d]+) # swallow non letters and numbers,
  2. | (?<=\D)(?=\d) # or non-number followed by number,
  3. | (?<=\d)(?=\D) # or number followed by non-number,
  4. | (?<=[ \p{L} && [^\p{Lu}]]) # or lower case
  5. (?=\p{Lu}) # followed by upper case,
  6. | (?<=\p{Lu}) # or upper case
  7. (?=\p{Lu} # followed by upper case
  8. [\p{L}&&[^\p{Lu}]] # then lower case
  9. )

@@4_1@@ の定義

pattern アナライザーは次の要素で構成されています:

pattern アナライザーの設定パラメーターを超えてカスタマイズする必要がある場合は、custom アナライザーとして再作成し、通常はトークンフィルターを追加することで修正する必要があります。これにより、組み込みの pattern アナライザーが再作成され、さらなるカスタマイズの出発点として使用できます:

Python

  1. resp = client.indices.create(
  2. index="pattern_example",
  3. settings={
  4. "analysis": {
  5. "tokenizer": {
  6. "split_on_non_word": {
  7. "type": "pattern",
  8. "pattern": "\\W+"
  9. }
  10. },
  11. "analyzer": {
  12. "rebuilt_pattern": {
  13. "tokenizer": "split_on_non_word",
  14. "filter": [
  15. "lowercase"
  16. ]
  17. }
  18. }
  19. }
  20. },
  21. )
  22. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'pattern_example',
  3. body: {
  4. settings: {
  5. analysis: {
  6. tokenizer: {
  7. split_on_non_word: {
  8. type: 'pattern',
  9. pattern: '\\W+'
  10. }
  11. },
  12. analyzer: {
  13. rebuilt_pattern: {
  14. tokenizer: 'split_on_non_word',
  15. filter: [
  16. 'lowercase'
  17. ]
  18. }
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.indices.create({
  2. index: "pattern_example",
  3. settings: {
  4. analysis: {
  5. tokenizer: {
  6. split_on_non_word: {
  7. type: "pattern",
  8. pattern: "\\W+",
  9. },
  10. },
  11. analyzer: {
  12. rebuilt_pattern: {
  13. tokenizer: "split_on_non_word",
  14. filter: ["lowercase"],
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. PUT /pattern_example
  2. {
  3. "settings": {
  4. "analysis": {
  5. "tokenizer": {
  6. "split_on_non_word": {
  7. "type": "pattern",
  8. "pattern": "\\W+"
  9. }
  10. },
  11. "analyzer": {
  12. "rebuilt_pattern": {
  13. "tokenizer": "split_on_non_word",
  14. "filter": [
  15. "lowercase"
  16. ]
  17. }
  18. }
  19. }
  20. }
  21. }
デフォルトのパターンは \W+ で、非単語文字で分割されます。これは変更する場所です。
lowercase の後に他のトークンフィルターを追加します。