Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Обработка текста ›Справочник по фильтрам символов

Отображение фильтра символов

Фильтр символов mapping принимает карту ключей и значений. Всякий раз, когда он встречает строку символов, совпадающую с ключом, он заменяет их значением, связанным с этим ключом.

Совпадение жадное; наибольший совпадающий шаблон в данной точке выигрывает. Замены могут быть пустой строкой.

Фильтр mapping использует MappingCharFilter из Lucene.

Пример

Следующий запрос API анализа использует фильтр mapping для преобразования индусско-арабских цифр (٠‎١٢٣٤٥٦٧٨‎٩‎) в их арабско-латинские эквиваленты (0123456789), изменяя текст My license plate is ٢٥٠١٥ на My license plate is 25015.

resp = client.indices.analyze(
    tokenizer="keyword",
    char_filter=[
        {
            "type": "mapping",
            "mappings": [
                "٠ => 0",
                "١ => 1",
                "٢ => 2",
                "٣ => 3",
                "٤ => 4",
                "٥ => 5",
                "٦ => 6",
                "٧ => 7",
                "٨ => 8",
                "٩ => 9"
            ]
        }
    ],
    text="My license plate is ٢٥٠١٥",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'keyword',
    char_filter: [
      {
        type: 'mapping',
        mappings: [
          '٠ => 0',
          '١ => 1',
          '٢ => 2',
          '٣ => 3',
          '٤ => 4',
          '٥ => 5',
          '٦ => 6',
          '٧ => 7',
          '٨ => 8',
          '٩ => 9'
        ]
      }
    ],
    text: 'My license plate is ٢٥٠١٥'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "keyword",
  char_filter: [
    {
      type: "mapping",
      mappings: [
        "٠ => 0",
        "١ => 1",
        "٢ => 2",
        "٣ => 3",
        "٤ => 4",
        "٥ => 5",
        "٦ => 6",
        "٧ => 7",
        "٨ => 8",
        "٩ => 9",
      ],
    },
  ],
  text: "My license plate is ٢٥٠١٥",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "٠ => 0",
        "١ => 1",
        "٢ => 2",
        "٣ => 3",
        "٤ => 4",
        "٥ => 5",
        "٦ => 6",
        "٧ => 7",
        "٨ => 8",
        "٩ => 9"
      ]
    }
  ],
  "text": "My license plate is ٢٥٠١٥"
}

Фильтр генерирует следующий текст:

[ My license plate is 25015 ]

Настраиваемые параметры

mappings

(Обязательно*, массив строк) Массив отображений, каждый элемент которого имеет вид key => value.

Должен быть указан либо этот, либо параметр mappings_path.

mappings_path

(Обязательно*, строка) Путь к файлу, содержащему отображения key => value.

Этот путь должен быть абсолютным или относительным к расположению config, а файл должен быть закодирован в UTF-8. Каждое отображение в файле должно быть разделено переводом строки.

Должен быть указан либо этот, либо параметр mappings.

Настройка и добавление в анализатор

Чтобы настроить фильтр mappings, дублируйте его, чтобы создать основу для нового пользовательского фильтра символов. Вы можете изменить фильтр, используя его настраиваемые параметры.

Следующий запрос API создания индекса настраивает новый настраиваемый анализатор, использующий пользовательский фильтр mappings, my_mappings_char_filter.

Фильтр my_mappings_char_filter заменяет эмодзи :) и :( на текстовый эквивалент.

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "my_mappings_char_filter"
                    ]
                }
            },
            "char_filter": {
                "my_mappings_char_filter": {
                    "type": "mapping",
                    "mappings": [
                        ":) => _happy_",
                        ":( => _sad_"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'standard',
            char_filter: [
              'my_mappings_char_filter'
            ]
          }
        },
        char_filter: {
          my_mappings_char_filter: {
            type: 'mapping',
            mappings: [
              ':) => _happy_',
              ':( => _sad_'
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_analyzer: {
          tokenizer: "standard",
          char_filter: ["my_mappings_char_filter"],
        },
      },
      char_filter: {
        my_mappings_char_filter: {
          type: "mapping",
          mappings: [":) => _happy_", ":( => _sad_"],
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_mappings_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_mappings_char_filter": {
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      }
    }
  }
}

Следующий запрос API анализа использует пользовательский фильтр my_mappings_char_filter для замены :( на _sad_ в тексте I'm delighted about it :(.

resp = client.indices.analyze(
    index="my-index-000001",
    tokenizer="keyword",
    char_filter=[
        "my_mappings_char_filter"
    ],
    text="I'm delighted about it :(",
)
print(resp)
const response = await client.indices.analyze({
  index: "my-index-000001",
  tokenizer: "keyword",
  char_filter: ["my_mappings_char_filter"],
  text: "I'm delighted about it :(",
});
console.log(response);
GET /my-index-000001/_analyze
{
  "tokenizer": "keyword",
  "char_filter": [ "my_mappings_char_filter" ],
  "text": "I'm delighted about it :("
}

Фильтр генерирует следующий текст:

[ I'm delighted about it _sad_ ]

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/analysis-mapping-charfilter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API