パターン置換文字フィルター

pattern_replace 文字フィルターは、指定された置換文字列で置き換えるべき文字を正規表現で一致させます。置換文字列は、正規表現のキャプチャグループを参照することができます。

パターン置換文字フィルター

pattern_replace 文字フィルターは、指定された置換文字列で置き換えるべき文字を正規表現で一致させます。置換文字列は、正規表現のキャプチャグループを参照することができます。

設定

pattern_replace 文字フィルターは、以下のパラメータを受け入れます:

pattern Java正規表現。必須。
replacement キャプチャグループを参照できる置換文字列。これは、
$1..$9 構文を使用して、
こちらで説明されています。

| flags | Java正規表現のフラグ
フラグはパイプで区切る必要があります。例: "CASE_INSENSITIVE|COMMENTS"

例の設定

この例では、pattern_replace 文字フィルターを設定して、数字内の埋め込まれたダッシュをアンダースコアに置き換えます。すなわち、123-456-789123_456_789:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_char_filter": {
  15. "type": "pattern_replace",
  16. "pattern": "(\\d+)-(?=\\d)",
  17. "replacement": "$1_"
  18. }
  19. }
  20. }
  21. },
  22. )
  23. print(resp)
  24. resp1 = client.indices.analyze(
  25. index="my-index-000001",
  26. analyzer="my_analyzer",
  27. text="My credit card is 123-456-789",
  28. )
  29. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_analyzer: {
  8. tokenizer: 'standard',
  9. char_filter: [
  10. 'my_char_filter'
  11. ]
  12. }
  13. },
  14. char_filter: {
  15. my_char_filter: {
  16. type: 'pattern_replace',
  17. pattern: '(\\d+)-(?=\\d)',
  18. replacement: '$1_'
  19. }
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response
  26. response = client.indices.analyze(
  27. index: 'my-index-000001',
  28. body: {
  29. analyzer: 'my_analyzer',
  30. text: 'My credit card is 123-456-789'
  31. }
  32. )
  33. 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: "standard",
  8. char_filter: ["my_char_filter"],
  9. },
  10. },
  11. char_filter: {
  12. my_char_filter: {
  13. type: "pattern_replace",
  14. pattern: "(\\d+)-(?=\\d)",
  15. replacement: "$1_",
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);
  22. const response1 = await client.indices.analyze({
  23. index: "my-index-000001",
  24. analyzer: "my_analyzer",
  25. text: "My credit card is 123-456-789",
  26. });
  27. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_char_filter": {
  15. "type": "pattern_replace",
  16. "pattern": "(\\d+)-(?=\\d)",
  17. "replacement": "$1_"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. POST my-index-000001/_analyze
  24. {
  25. "analyzer": "my_analyzer",
  26. "text": "My credit card is 123-456-789"
  27. }

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

テキスト

  1. [ My, credit, card, is, 123_456_789 ]

元のテキストの長さを変更する置換文字列を使用すると、検索目的には機能しますが、次の例に示すように、ハイライトが不正確になります。

この例では、小文字の文字の後に大文字の文字が続くときにスペースを挿入します(すなわち、fooBarBazfoo Bar Baz)。これにより、camelCaseの単語を個別にクエリできます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_char_filter"
  10. ],
  11. "filter": [
  12. "lowercase"
  13. ]
  14. }
  15. },
  16. "char_filter": {
  17. "my_char_filter": {
  18. "type": "pattern_replace",
  19. "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
  20. "replacement": " "
  21. }
  22. }
  23. }
  24. },
  25. mappings={
  26. "properties": {
  27. "text": {
  28. "type": "text",
  29. "analyzer": "my_analyzer"
  30. }
  31. }
  32. },
  33. )
  34. print(resp)
  35. resp1 = client.indices.analyze(
  36. index="my-index-000001",
  37. analyzer="my_analyzer",
  38. text="The fooBarBaz method",
  39. )
  40. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_analyzer: {
  8. tokenizer: 'standard',
  9. char_filter: [
  10. 'my_char_filter'
  11. ],
  12. filter: [
  13. 'lowercase'
  14. ]
  15. }
  16. },
  17. char_filter: {
  18. my_char_filter: {
  19. type: 'pattern_replace',
  20. pattern: '(?<=\\p{Lower})(?=\\p{Upper})',
  21. replacement: ' '
  22. }
  23. }
  24. }
  25. },
  26. mappings: {
  27. properties: {
  28. text: {
  29. type: 'text',
  30. analyzer: 'my_analyzer'
  31. }
  32. }
  33. }
  34. }
  35. )
  36. puts response
  37. response = client.indices.analyze(
  38. index: 'my-index-000001',
  39. body: {
  40. analyzer: 'my_analyzer',
  41. text: 'The fooBarBaz method'
  42. }
  43. )
  44. 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: "standard",
  8. char_filter: ["my_char_filter"],
  9. filter: ["lowercase"],
  10. },
  11. },
  12. char_filter: {
  13. my_char_filter: {
  14. type: "pattern_replace",
  15. pattern: "(?<=\\p{Lower})(?=\\p{Upper})",
  16. replacement: " ",
  17. },
  18. },
  19. },
  20. },
  21. mappings: {
  22. properties: {
  23. text: {
  24. type: "text",
  25. analyzer: "my_analyzer",
  26. },
  27. },
  28. },
  29. });
  30. console.log(response);
  31. const response1 = await client.indices.analyze({
  32. index: "my-index-000001",
  33. analyzer: "my_analyzer",
  34. text: "The fooBarBaz method",
  35. });
  36. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_char_filter"
  10. ],
  11. "filter": [
  12. "lowercase"
  13. ]
  14. }
  15. },
  16. "char_filter": {
  17. "my_char_filter": {
  18. "type": "pattern_replace",
  19. "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
  20. "replacement": " "
  21. }
  22. }
  23. }
  24. },
  25. "mappings": {
  26. "properties": {
  27. "text": {
  28. "type": "text",
  29. "analyzer": "my_analyzer"
  30. }
  31. }
  32. }
  33. }
  34. POST my-index-000001/_analyze
  35. {
  36. "analyzer": "my_analyzer",
  37. "text": "The fooBarBaz method"
  38. }

上記は次の用語を返します:

テキスト

  1. [ the, foo, bar, baz, method ]
  1. #### Python
  2. ``````python
  3. resp = client.index(
  4. index="my-index-000001",
  5. id="1",
  6. refresh=True,
  7. document={
  8. "text": "The fooBarBaz method"
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.search(
  13. index="my-index-000001",
  14. query={
  15. "match": {
  16. "text": "bar"
  17. }
  18. },
  19. highlight={
  20. "fields": {
  21. "text": {}
  22. }
  23. },
  24. )
  25. print(resp1)
  26. `

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. text: 'The fooBarBaz method'
  7. }
  8. )
  9. puts response
  10. response = client.search(
  11. index: 'my-index-000001',
  12. body: {
  13. query: {
  14. match: {
  15. text: 'bar'
  16. }
  17. },
  18. highlight: {
  19. fields: {
  20. text: {}
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. text: "The fooBarBaz method",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.search({
  11. index: "my-index-000001",
  12. query: {
  13. match: {
  14. text: "bar",
  15. },
  16. },
  17. highlight: {
  18. fields: {
  19. text: {},
  20. },
  21. },
  22. });
  23. console.log(response1);

コンソール

  1. PUT my-index-000001/_doc/1?refresh
  2. {
  3. "text": "The fooBarBaz method"
  4. }
  5. GET my-index-000001/_search
  6. {
  7. "query": {
  8. "match": {
  9. "text": "bar"
  10. }
  11. },
  12. "highlight": {
  13. "fields": {
  14. "text": {}
  15. }
  16. }
  17. }

上記の出力は次のとおりです:

コンソール-結果

  1. {
  2. "timed_out": false,
  3. "took": $body.took,
  4. "_shards": {
  5. "total": 1,
  6. "successful": 1,
  7. "skipped" : 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total" : {
  12. "value": 1,
  13. "relation": "eq"
  14. },
  15. "max_score": 0.2876821,
  16. "hits": [
  17. {
  18. "_index": "my-index-000001",
  19. "_id": "1",
  20. "_score": 0.2876821,
  21. "_source": {
  22. "text": "The fooBarBaz method"
  23. },
  24. "highlight": {
  25. "text": [
  26. "The foo<em>Ba</em>rBaz method"
  27. ]
  28. }
  29. }
  30. ]
  31. }
  32. }
不正確なハイライトに注意してください。