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

Фильтр токенов pattern capture

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

Осторожно: Патологические регулярные выражения

Фильтр токенов pattern capture использует регулярные выражения Java.

Плохо написанное регулярное выражение может работать очень медленно или даже выбросить StackOverflowError и привести к внезапному завершению работы узла.

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

Например, шаблон:

"(([a-z]+)(\d*))"

при сопоставлении со строкой:

"abc123def456"

сгенерирует токены: [ abc123, abc, 123, def456, def, 456 ]

Если preserve_original установлено в true (значение по умолчанию), то он также сгенерирует исходный токен: abc123def456.

Это особенно полезно для индексирования текста, такого как код с верблюжьей нотацией, например, stripHTML, где пользователь может искать "strip html" или "striphtml":

PUT test
{
   "settings" : {
      "analysis" : {
         "filter" : {
            "code" : {
               "type" : "pattern_capture",
               "preserve_original" : true,
               "patterns" : [
                  "(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)",
                  "(\\d+)"
               ]
            }
         },
         "analyzer" : {
            "code" : {
               "tokenizer" : "pattern",
               "filter" : [ "code", "lowercase" ]
            }
         }
      }
   }
}

При использовании для анализа текста

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml

это сгенерирует токены: [ import, static, org, apache, commons, lang, stringescapeutils, string, escape, utils, escapehtml, escape, html ]

Другим примером является анализ адресов электронной почты:

PUT test
{
   "settings" : {
      "analysis" : {
         "filter" : {
            "email" : {
               "type" : "pattern_capture",
               "preserve_original" : true,
               "patterns" : [
                  "([^@]+)",
                  "(\\p{L}+)",
                  "(\\d+)",
                  "@(.+)"
               ]
            }
         },
         "analyzer" : {
            "email" : {
               "tokenizer" : "uax_url_email",
               "filter" : [ "email", "lowercase",  "unique" ]
            }
         }
      }
   }
}

Когда вышеуказанный анализатор используется с адресом электронной почты, например:

john-smith_123@foo-bar.com

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

john-smith_123@foo-bar.com, john-smith_123,
john, smith, 123, foo-bar.com, foo, bar, com

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

Примечание: Все токены генерируются в одном и том же положении и с теми же смещениями символов. Это означает, что, например, запрос match на john-smith_123@foo-bar.com, который использует этот анализатор, вернёт документы, содержащие любой из этих токенов, даже при использовании оператора and. Кроме того, при использовании выделения, будет выделен весь исходный токен, а не только совпадающая подстрока. Например, запрос к вышеприведённому адресу электронной почты по ключевому слову "smith" выделит:

  <em>john-smith_123@foo-bar.com</em>

а не:

  john-<em>smith</em>_123@foo-bar.com

© 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/7.17/analysis-pattern-capture-tokenfilter.html

Spec-Zone.ru

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