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

Фильтр токенов Keyword marker

Помечает указанные токены как ключевые, которые не подвергаются сведению.

Фильтр keyword_marker назначает указанным токенам атрибут keyword со значением true. Фильтры токенов сведению, такие как stemmer или porter_stem, пропускают токены с атрибутом keyword со значением true.

Для корректной работы фильтр keyword_marker должен быть указан перед любыми фильтрами токенов сведению в настройках анализатора создания пользовательского анализатора.

Фильтр keyword_marker использует фильтр KeywordMarkerFilter из Lucene.

Пример

Чтобы увидеть, как работает фильтр keyword_marker, необходимо сначала создать поток токенов, содержащий сведеённые токены.

Следующий запрос API анализа использует фильтр stemmer для создания сведеённых токенов для fox running and jumping.

resp = client.indices.analyze(
    tokenizer="whitespace",
    filter=[
        "stemmer"
    ],
    text="fox running and jumping",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      'stemmer'
    ],
    text: 'fox running and jumping'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "whitespace",
  filter: ["stemmer"],
  text: "fox running and jumping",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [ "stemmer" ],
  "text": "fox running and jumping"
}

Запрос создаёт следующие токены. Обратите внимание, что running было сведено до run, а jumping было сведено до jump.

[ fox, run, and, jump ]

Чтобы предотвратить сведение jumping, добавьте фильтр keyword_marker перед фильтром stemmer в предыдущем запросе API анализа. Укажите jumping в параметре keywords фильтра keyword_marker.

resp = client.indices.analyze(
    tokenizer="whitespace",
    filter=[
        {
            "type": "keyword_marker",
            "keywords": [
                "jumping"
            ]
        },
        "stemmer"
    ],
    text="fox running and jumping",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'keyword_marker',
        keywords: [
          'jumping'
        ]
      },
      'stemmer'
    ],
    text: 'fox running and jumping'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "whitespace",
  filter: [
    {
      type: "keyword_marker",
      keywords: ["jumping"],
    },
    "stemmer",
  ],
  text: "fox running and jumping",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "keyword_marker",
      "keywords": [ "jumping" ]
    },
    "stemmer"
  ],
  "text": "fox running and jumping"
}

Запрос создаёт следующие токены. running по-прежнему сведено до run, но jumping не сведено.

[ fox, run, and, jumping ]

Чтобы увидеть атрибут keyword для этих токенов, добавьте следующие аргументы в запрос API анализа:

  • explain: true
  • attributes: keyword
resp = client.indices.analyze(
    tokenizer="whitespace",
    filter=[
        {
            "type": "keyword_marker",
            "keywords": [
                "jumping"
            ]
        },
        "stemmer"
    ],
    text="fox running and jumping",
    explain=True,
    attributes="keyword",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'keyword_marker',
        keywords: [
          'jumping'
        ]
      },
      'stemmer'
    ],
    text: 'fox running and jumping',
    explain: true,
    attributes: 'keyword'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "whitespace",
  filter: [
    {
      type: "keyword_marker",
      keywords: ["jumping"],
    },
    "stemmer",
  ],
  text: "fox running and jumping",
  explain: true,
  attributes: "keyword",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "keyword_marker",
      "keywords": [ "jumping" ]
    },
    "stemmer"
  ],
  "text": "fox running and jumping",
  "explain": true,
  "attributes": "keyword"
}

API возвращает следующий ответ. Обратите внимание, что токен jumping имеет атрибут keyword со значением true.

{
  "detail": {
    "custom_analyzer": true,
    "charfilters": [],
    "tokenizer": {
      "name": "whitespace",
      "tokens": [
        {
          "token": "fox",
          "start_offset": 0,
          "end_offset": 3,
          "type": "word",
          "position": 0
        },
        {
          "token": "running",
          "start_offset": 4,
          "end_offset": 11,
          "type": "word",
          "position": 1
        },
        {
          "token": "and",
          "start_offset": 12,
          "end_offset": 15,
          "type": "word",
          "position": 2
        },
        {
          "token": "jumping",
          "start_offset": 16,
          "end_offset": 23,
          "type": "word",
          "position": 3
        }
      ]
    },
    "tokenfilters": [
      {
        "name": "__anonymous__keyword_marker",
        "tokens": [
          {
            "token": "fox",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0,
            "keyword": false
          },
          {
            "token": "running",
            "start_offset": 4,
            "end_offset": 11,
            "type": "word",
            "position": 1,
            "keyword": false
          },
          {
            "token": "and",
            "start_offset": 12,
            "end_offset": 15,
            "type": "word",
            "position": 2,
            "keyword": false
          },
          {
            "token": "jumping",
            "start_offset": 16,
            "end_offset": 23,
            "type": "word",
            "position": 3,
            "keyword": true
          }
        ]
      },
      {
        "name": "stemmer",
        "tokens": [
          {
            "token": "fox",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0,
            "keyword": false
          },
          {
            "token": "run",
            "start_offset": 4,
            "end_offset": 11,
            "type": "word",
            "position": 1,
            "keyword": false
          },
          {
            "token": "and",
            "start_offset": 12,
            "end_offset": 15,
            "type": "word",
            "position": 2,
            "keyword": false
          },
          {
            "token": "jumping",
            "start_offset": 16,
            "end_offset": 23,
            "type": "word",
            "position": 3,
            "keyword": true
          }
        ]
      }
    ]
  }
}

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

ignore_case
(Необязательно, булево) Если true, соответствие параметрам keywords и keywords_path игнорирует регистр. По умолчанию false.
keywords

(Обязательно*, массив строк) Массив ключевых слов. Токены, которые соответствуют этим ключевым словам, не сводятся.

Необходимо указать этот параметр, keywords_path или keywords_pattern. Вы не можете указать этот параметр и keywords_pattern.

keywords_path

(Обязательно*, строка) Путь к файлу, который содержит список ключевых слов. Токены, которые соответствуют этим ключевым словам, не сводятся.

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

Необходимо указать этот параметр, keywords или keywords_pattern. Вы не можете указать этот параметр и keywords_pattern.

keywords_pattern

(Обязательно*, строка) Регулярное выражение Java, используемое для сопоставления токенов. Токены, которые соответствуют этому выражению, помечаются как ключевые и не сводятся.

Необходимо указать этот параметр, keywords или keywords_path. Вы не можете указать этот параметр и keywords или keywords_pattern.

Неправильно составленные регулярные выражения могут привести к медленной работе Elasticsearch или ошибкам переполнения стека, что приведёт к внезапному завершению работы узла.

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

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

Например, следующий запрос API создания индекса использует пользовательский фильтр keyword_marker и фильтр porter_stem для настройки нового пользовательского анализатора.

Пользовательский фильтр keyword_marker помечает токены, указанные в файле analysis/example_word_list.txt, как ключевые. Фильтр porter_stem не сводит эти токены.

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_custom_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "my_custom_keyword_marker_filter",
                        "porter_stem"
                    ]
                }
            },
            "filter": {
                "my_custom_keyword_marker_filter": {
                    "type": "keyword_marker",
                    "keywords_path": "analysis/example_word_list.txt"
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_custom_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'my_custom_keyword_marker_filter',
              'porter_stem'
            ]
          }
        },
        filter: {
          my_custom_keyword_marker_filter: {
            type: 'keyword_marker',
            keywords_path: 'analysis/example_word_list.txt'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_custom_analyzer: {
          type: "custom",
          tokenizer: "standard",
          filter: ["my_custom_keyword_marker_filter", "porter_stem"],
        },
      },
      filter: {
        my_custom_keyword_marker_filter: {
          type: "keyword_marker",
          keywords_path: "analysis/example_word_list.txt",
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "my_custom_keyword_marker_filter",
            "porter_stem"
          ]
        }
      },
      "filter": {
        "my_custom_keyword_marker_filter": {
          "type": "keyword_marker",
          "keywords_path": "analysis/example_word_list.txt"
        }
      }
    }
  }
}

© 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-keyword-marker-tokenfilter.html

Spec-Zone.ru

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