文字フィルターのマッピング

mapping 文字フィルターは、キーと値のマップを受け入れます。キーと同じ文字列に出会うと、それをそのキーに関連付けられた値に置き換えます。

マッチングは貪欲であり、特定のポイントで最も長いパターンが勝ちます。置き換えは空の文字列であることも許可されます。

mapping フィルターは、Lucene の MappingCharFilter を使用します。

次の analyze API リクエストは、mapping フィルターを使用して、ヒンドゥー・アラビア数字 (٠‎١٢٣٤٥٦٧٨‎٩‎) をアラビア・ラテン数字 (0123456789) に変換し、テキスト My license plate is ٢٥٠١٥My license plate is 25015 に変更します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="keyword",
  3. char_filter=[
  4. {
  5. "type": "mapping",
  6. "mappings": [
  7. "٠ => 0",
  8. "١ => 1",
  9. "٢ => 2",
  10. "٣ => 3",
  11. "٤ => 4",
  12. "٥ => 5",
  13. "٦ => 6",
  14. "٧ => 7",
  15. "٨ => 8",
  16. "٩ => 9"
  17. ]
  18. }
  19. ],
  20. text="My license plate is ٢٥٠١٥",
  21. )
  22. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'keyword',
  4. char_filter: [
  5. {
  6. type: 'mapping',
  7. mappings: [
  8. '٠ => 0',
  9. '١ => 1',
  10. '٢ => 2',
  11. '٣ => 3',
  12. '٤ => 4',
  13. '٥ => 5',
  14. '٦ => 6',
  15. '٧ => 7',
  16. '٨ => 8',
  17. '٩ => 9'
  18. ]
  19. }
  20. ],
  21. text: 'My license plate is ٢٥٠١٥'
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "keyword",
  3. char_filter: [
  4. {
  5. type: "mapping",
  6. mappings: [
  7. "٠ => 0",
  8. "١ => 1",
  9. "٢ => 2",
  10. "٣ => 3",
  11. "٤ => 4",
  12. "٥ => 5",
  13. "٦ => 6",
  14. "٧ => 7",
  15. "٨ => 8",
  16. "٩ => 9",
  17. ],
  18. },
  19. ],
  20. text: "My license plate is ٢٥٠١٥",
  21. });
  22. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "keyword",
  4. "char_filter": [
  5. {
  6. "type": "mapping",
  7. "mappings": [
  8. "٠ => 0",
  9. "١ => 1",
  10. "٢ => 2",
  11. "٣ => 3",
  12. "٤ => 4",
  13. "٥ => 5",
  14. "٦ => 6",
  15. "٧ => 7",
  16. "٨ => 8",
  17. "٩ => 9"
  18. ]
  19. }
  20. ],
  21. "text": "My license plate is ٢٥٠١٥"
  22. }

フィルターは次のテキストを生成します:

テキスト

  1. [ My license plate is 25015 ]

設定可能なパラメータ

  • mappings
  • (必須*, 文字列の配列) 各要素が key => value の形式を持つマッピングの配列。
    このいずれか、または mappings_path パラメータを指定する必要があります。
  • mappings_path
  • (必須*, 文字列) key => value マッピングを含むファイルへのパス。
    このパスは絶対パスまたは config の場所に対する相対パスでなければならず、ファイルは UTF-8 エンコードされている必要があります。ファイル内の各マッピングは改行で区切られている必要があります。
    このいずれか、または mappings パラメータを指定する必要があります。

アナライザーのカスタマイズと追加

mappings フィルターをカスタマイズするには、それを複製して新しいカスタム文字フィルターの基礎を作成します。設定可能なパラメータを使用してフィルターを変更できます。

次の create index API リクエストは、カスタム mappings フィルター my_mappings_char_filter を使用して新しい カスタムアナライザー を構成します。

my_mappings_char_filter フィルターは、:) および :( 絵文字をテキストの同等物に置き換えます。

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_mappings_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_mappings_char_filter": {
  15. "type": "mapping",
  16. "mappings": [
  17. ":) => _happy_",
  18. ":( => _sad_"
  19. ]
  20. }
  21. }
  22. }
  23. },
  24. )
  25. 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: 'standard',
  9. char_filter: [
  10. 'my_mappings_char_filter'
  11. ]
  12. }
  13. },
  14. char_filter: {
  15. my_mappings_char_filter: {
  16. type: 'mapping',
  17. mappings: [
  18. ':) => _happy_',
  19. ':( => _sad_'
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. 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_mappings_char_filter"],
  9. },
  10. },
  11. char_filter: {
  12. my_mappings_char_filter: {
  13. type: "mapping",
  14. mappings: [":) => _happy_", ":( => _sad_"],
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_mappings_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_mappings_char_filter": {
  15. "type": "mapping",
  16. "mappings": [
  17. ":) => _happy_",
  18. ":( => _sad_"
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. }

次の analyze API リクエストは、カスタム my_mappings_char_filter を使用して、テキスト I'm delighted about it :( 内の :(_sad_ に置き換えます。

Python

  1. resp = client.indices.analyze(
  2. index="my-index-000001",
  3. tokenizer="keyword",
  4. char_filter=[
  5. "my_mappings_char_filter"
  6. ],
  7. text="I'm delighted about it :(",
  8. )
  9. print(resp)

Js

  1. const response = await client.indices.analyze({
  2. index: "my-index-000001",
  3. tokenizer: "keyword",
  4. char_filter: ["my_mappings_char_filter"],
  5. text: "I'm delighted about it :(",
  6. });
  7. console.log(response);

コンソール

  1. GET /my-index-000001/_analyze
  2. {
  3. "tokenizer": "keyword",
  4. "char_filter": [ "my_mappings_char_filter" ],
  5. "text": "I'm delighted about it :("
  6. }

フィルターは次のテキストを生成します:

テキスト

  1. [ I'm delighted about it _sad_ ]