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

Фильтр токенов Edge n-gram

Создает n-грамму заданной длины с начала токена.

Например, вы можете использовать фильтр токенов edge_ngram, чтобы изменить quick на qu.

По умолчанию фильтр создаёт 1-символьные граничные n-граммы.

Этот фильтр использует EdgeNGramTokenFilter Lucene.

Фильтр edge_ngram похож на ngram фильтр токенов. Однако фильтр edge_ngram выводит только n-граммы, начинающиеся в начале токена. Такие граничные n-граммы полезны для запросов поиска по мере ввода.

Пример

Следующий запрос API анализа использует фильтр edge_ngram для преобразования the quick brown fox jumps в 1-символьные и 2-символьные граничные n-граммы:

resp = client.indices.analyze(
    tokenizer="standard",
    filter=[
        {
            "type": "edge_ngram",
            "min_gram": 1,
            "max_gram": 2
        }
    ],
    text="the quick brown fox jumps",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      {
        type: 'edge_ngram',
        min_gram: 1,
        max_gram: 2
      }
    ],
    text: 'the quick brown fox jumps'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "standard",
  filter: [
    {
      type: "edge_ngram",
      min_gram: 1,
      max_gram: 2,
    },
  ],
  text: "the quick brown fox jumps",
});
console.log(response);
GET _analyze
{
  "tokenizer": "standard",
  "filter": [
    { "type": "edge_ngram",
      "min_gram": 1,
      "max_gram": 2
    }
  ],
  "text": "the quick brown fox jumps"
}

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

[ t, th, q, qu, b, br, f, fo, j, ju ]

Добавление в анализатор

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

resp = client.indices.create(
    index="edge_ngram_example",
    settings={
        "analysis": {
            "analyzer": {
                "standard_edge_ngram": {
                    "tokenizer": "standard",
                    "filter": [
                        "edge_ngram"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'edge_ngram_example',
  body: {
    settings: {
      analysis: {
        analyzer: {
          standard_edge_ngram: {
            tokenizer: 'standard',
            filter: [
              'edge_ngram'
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "edge_ngram_example",
  settings: {
    analysis: {
      analyzer: {
        standard_edge_ngram: {
          tokenizer: "standard",
          filter: ["edge_ngram"],
        },
      },
    },
  },
});
console.log(response);
PUT edge_ngram_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_edge_ngram": {
          "tokenizer": "standard",
          "filter": [ "edge_ngram" ]
        }
      }
    }
  }
}

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

max_gram

(Необязательно, целое число) Максимальная длина n-граммы в символах. По умолчанию для настраиваемых фильтров токенов - 2. Для встроенного фильтра edge_ngram - 1.

См. ограничения параметра max_gram.

min_gram
(Необязательно, целое число) Минимальная длина n-граммы в символах. По умолчанию - 1.
preserve_original
(Необязательно, Булево) Выводить оригинальный токен, если установлено в true. По умолчанию - false.
side

(Необязательно, строка) [8.16.0] устарел в 8.16.0. Используйте <<analysis-reverse-tokenfilter . Указывает, обрезать токены с начала или конца. По умолчанию - front.

Настройка

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

Например, следующий запрос создаёт настраиваемый фильтр edge_ngram, формирующий n-граммы длиной от 3 до 5 символов.

resp = client.indices.create(
    index="edge_ngram_custom_example",
    settings={
        "analysis": {
            "analyzer": {
                "default": {
                    "tokenizer": "whitespace",
                    "filter": [
                        "3_5_edgegrams"
                    ]
                }
            },
            "filter": {
                "3_5_edgegrams": {
                    "type": "edge_ngram",
                    "min_gram": 3,
                    "max_gram": 5
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'edge_ngram_custom_example',
  body: {
    settings: {
      analysis: {
        analyzer: {
          default: {
            tokenizer: 'whitespace',
            filter: [
              '3_5_edgegrams'
            ]
          }
        },
        filter: {
          "3_5_edgegrams": {
            type: 'edge_ngram',
            min_gram: 3,
            max_gram: 5
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "edge_ngram_custom_example",
  settings: {
    analysis: {
      analyzer: {
        default: {
          tokenizer: "whitespace",
          filter: ["3_5_edgegrams"],
        },
      },
      filter: {
        "3_5_edgegrams": {
          type: "edge_ngram",
          min_gram: 3,
          max_gram: 5,
        },
      },
    },
  },
});
console.log(response);
PUT edge_ngram_custom_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "whitespace",
          "filter": [ "3_5_edgegrams" ]
        }
      },
      "filter": {
        "3_5_edgegrams": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 5
        }
      }
    }
  }
}

Ограничения параметра max_gram

Значение параметра max_gram фильтра edge_ngram ограничивает длину токенов в символах. При использовании фильтра edge_ngram с анализаторм индекса это означает, что поисковые запросы длиннее, чем длина max_gram, могут не соответствовать никаким индексированным терминам.

Например, если max_gram имеет значение 3, запросы для apple не будут соответствовать индексированному термину app.

Для решения этой проблемы, вы можете использовать фильтр truncate с поисковым анализатором, чтобы укоротить поисковые термины до длины в max_gram символов. Однако это может привести к возврату нерелевантных результатов.

Например, если max_gram имеет значение 3 и поисковые термины усекаются до трёх символов, поисковый запрос apple сокращается до app. Это означает, что запросы на apple возвращают любые индексированные термины, соответствующие app, такие как apply, snapped и apple.

Рекомендуется протестировать оба подхода, чтобы выбрать наилучший вариант для вашего сценария использования и желаемого опыта поиска.

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

Spec-Zone.ru

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