Fork me on GitHub

Word delimiter graph token filter(word_delimiter_graph 词元过滤器)

本文禁止转载

word_delimiter_graph 使用非字母字符切分 tokens,并可以根据规则执行一些可选的 token 正则化。默认情况下,word_delimiter_graph 会使用以下规则:

  • 使用非字母字符作为切分点。 比如 Super-DuperSuper, Duper
  • 移除每个 token 前置和后置分隔符。比如 XL---42+'Autocoder'XL, 42, Autocoder
  • 在单词大小写过度位置做切分。 比如 PowerShotPower, Shot
  • 在单词字母和数字过度位置切分。 比如 XL500XL, 500
  • 移除 token 后的('s)。 例如 Neil'sNeil

word_delimiter_graph 过滤器的实现使用的是 Lucene 的 WordDelimiterGraphFilter

Tips: word_delimiter_graph 过滤器设计目标是为了处理 产品 ID 号,零部件号,这样的场景。此场景下推荐搭配 keyword tokenzier 使用
避免使用 word_delimiter_graph 过滤器本身带有连接符的单词,比如 wi-fi,因为用户无论是 wifi 还是 wi-fi 都比较常用,这种场景建议使用 synonym_graph

示例

GET /_analyze
{
  "tokenizer": "keyword",
  "filter": [ "word_delimiter_graph" ],
  "text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}

结果:

[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]

添加到 Analyzer

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "word_delimiter_graph" ]
        }
      }
    }
  }
}

WARNING: 避免和会去除标点符号的 tokenizers 搭配使用 word_delimiter_graph,比如 standard tokenizer。这样可能会导致 word_delimiter_graph 切分不正确,也可能会影响此过滤器一些可配置参数的工作,如catenate_all or preserve_original。所以推荐使用keyword or whitespace tokenizer。

可配置参数

adjust_offsets
可选,默认为 true, 为 true 会自动调整切分后的 term 在 doc 中的 offset 信息

WARNING: 如果我们使用 trim 过滤器,要设置 adjust_offsetsfalse,因为 trim 过滤器会改变 token 的长度而不会改变其 offsets,这时候如果 adjust_offsetstrue,就可能导致切分的 token 的 offset 不正确。

catenate_all: 默认为 false。如果为 true,会使用非字母分隔符将所有的数字字母连接在一起,比如:super-duper-xl-500 → [ superduperxl500, super, duper, xl, 500 ]. Defaults to false.

WARNING: 默认为 false,设置为 true, 会产生 multi-position 的 tokens。这是建立索引过程所不支持的。
如果参数设置为 true, 不要作为建立索引时的 analyzer,或者在此过滤器后使用flatten_graph过滤器,确保建立索引阶段正常工作。
当被用于 search 阶段的 analysis 时,会对match_phrase以及其它一些依赖 token position 信息进行 match 的 query 造成问题,如果真计划使用这些 query,记的设置为 true

catenate_numbers
catenate_all 区别是,只对使用非字母分隔符分隔的数字进行连接。 比如 01-02-03 → [ 010203, 01, 02, 03 ]。

WARNING: 和 catenate_all 一样

catenate_words
catenate_all 区别是,只对使用非字母分隔符分隔的字母进行连接。 比如 super-duper-xl → [ superduperxl, super, duper, xl ]。

WARNING: 和 catenate_all 一样

generate_number_parts

true 导致生成数字子词:"500-42" ⇒ "500" "42"。默认 true
generate_word_parts
*true *导致单词最大程度的链接到一起:"wi-fi" ⇒ "wifi"。默认 false

preserve_original

true 在子词中保留原始词:super-duper-xl-500 → [ super-duper-xl-500, super, duper, xl, 500 ]。默认 false

protected_words
被分隔时的受保护词列表。 一个数组
protected_words_path
设置为配置有保护字的文件(每行一个)。 如果存在,则自动解析为基于 config/ 位置的位置。
split_on_case_change

true 在大小写字母过度的位置做切分,比如 camelCase → [ camel, Case ]。默认 true

split_on_numerics

true 在字母数字过度的位置做切分, 比如 j2se → [ j, 2, se ],成了三个词元。默认 true

stem_english_possessive

true 导致每个子词中的 "'s" 都会被移除:O'Neil's → [ O, Neil ]。默认 true

高级设置:

type_table

例如,自定义类型映射表(使用 type_table_path 配置时),通过自定义,将非字母数字字符分隔符映射成其它字符,即映射后,这些字符便不会被作为分隔符而被保留下来。比如 [ "+ => ALPHA", "- => ALPHA" ]

Supported types include:

  • ALPHA (Alphabetical)
  • ALPHANUM (Alphanumeric)
  • DIGIT (Numeric)
  • LOWER (Lowercase alphabetical)
  • SUBWORD_DELIM (Non-alphanumeric delimiter)
  • UPPER (Uppercase alphabetical)

type_table_path
用户映射文件路径, 配合**type_table**使用。 文件示例:

# Map the $, %, '.', and ',' characters to DIGIT
# This might be useful for financial data.
$ => DIGIT
% => DIGIT
. => DIGIT
\\u002C => DIGIT

# in some cases you might not want to split on ZWJ
# this also tests the case where we need a bigger byte[]
# see http://en.wikipedia.org/wiki/Zero-width_joiner
\\u200D => ALPHANUM

定制化示例

下面官方给了一个定制 filter 的示例,并定制了以下规则:

  • Split tokens at non-alphanumeric characters, except the hyphen (-) character.
  • Remove leading or trailing delimiters from each token.
  • Do not split tokens at letter case transitions.
  • Do not split tokens at letter-number transitions.
  • Remove the English possessive ('s) from the end of each token.
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "my_custom_word_delimiter_graph_filter" ]
        }
      },
      "filter": {
        "my_custom_word_delimiter_graph_filter": {
          "type": "word_delimiter_graph",
          "type_table": [ "- => ALPHA" ],
          "split_on_case_change": false,
          "split_on_numerics": false,
          "stem_english_possessive": true
        }
      }
    }
  }
}

关于word_delimiter_graphword_delimiter 的区别word_delimiter 不建议用了,Lucene 内部都已经标记过时了的。

原文地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-word-delimiter-graph-tokenfilter.html#analysis-word-delimiter-graph-tokenfilter


本文地址:https://www.6aiq.com/article/1585675881092
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出