Elasticsearch 文本分析器(下)

这篇具有很好参考价值的文章主要介绍了Elasticsearch 文本分析器(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

字符过滤器

注意:字符过滤器用于在将字符流传递给分词器之前对其进行预处理

html_strip HTML元素替换过滤器

此过滤器会替换掉HTML标签,且会转换HTML实体 如:& 会被替换为 &。

{
  "tokenizer": "keyword",
  "char_filter": [
    "html_strip"
  ],
  "text": "<p>I&apos;m so <b>happy</b>!</p>"
}

解析结果:

[ \nI'm so happy!\n ]

因为是 p 标签,所以有前后的换行符。如果使用<span>标签就不会有换行符了。

可配参数说明

  • escaped_tags
    (可选,字符串数组)不包含尖括号 ( < >) 的 HTML 元素数组。当从文本中剥离 HTML 时,过滤器会跳过这些 HTML 元素。例如,设置 [ “p” ] 将会跳过 <p> HTML 元素。

自定义字符过滤器

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_custom_html_strip_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_custom_html_strip_char_filter": {
          "type": "html_strip",
          "escaped_tags": [
            "b"
          ]
        }
      }
    }
  }
}

自定义字符过滤器 my_custom_html_strip_char_filter ,以 html_strip 过滤器为基础,设置了跳过 b 标签不过滤。

mapping 键值替换过滤器

配置键和值的映射,每当遇到与键相同的字符串时,它就会用与该键关联的值替换它们

{
  "tokenizer": "keyword",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "0 => 零",
        "1 => 壹",
        "2 => 贰",
        "3 => 叁",
        "4 => 肆",
        "5 => 伍",
        "6 => 陆",
        "7 => 柒",
        "8 => 捌",
        "9 => 玖"
      ]
    }
  ],
  "text": "9527就是你的终身代号"
}

解析结果:

{
    "tokens": [
        {
            "token": "玖伍贰柒就是你的终身代号",
            "start_offset": 0,
            "end_offset": 12,
            "type": "word",
            "position": 0
        }
    ]
}

可配参数说明

  • mappings
    (必需*,字符串数组)映射数组,每个元素的形式为key => value.
  • mappings_path
    (必需*,字符串)包含映射的文件的路径key => value。
    此路径必须是绝对路径或相对于config位置的路径,并且文件必须是 UTF-8 编码的。文件中的每个映射必须用换行符分隔。

以上两个参数二选一即可。

pattern_replace 正则替换过滤器

{
  "tokenizer": "keyword",
  "char_filter": [
    {
      "type": "pattern_replace",
      "pattern": "(\\d{3})(\\d{4})(\\d{4})",
      "replacement":"$1****$3"
    }
  ],
  "text": "13199838273"
}

解析结果:

{
    "tokens": [
        {
            "token": "131****8273",
            "start_offset": 0,
            "end_offset": 11,
            "type": "word",
            "position": 0
        }
    ]
}

看到结果你就知道我们示例的作用了,关于写法可以看看可配参数的说明。

可配参数说明

  • pattern
    必需,Java正则表达式。
  • replacement
    替换字符串,用 $1…$9来表示正则表达式匹配的内容。注意,我们的示例中每一个正则匹配都用了()括号扩起来。
  • flags
    Java 正则表达式标志。

常用分词器

分析器只能配置一个分词器,所以很多分词器的名称和分析器的名称是一致的

标准分词器

standard词器提供基于语法的分词(基于 Unicode 文本分割算法)并且适用于大多数语言。

POST _analyze
{
  "tokenizer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

解析结果:

[ The, 2, QUICK, Brown, Foxes, jumped, over, the, lazy, dog's, bone ]

如果仔细对比,你还是能发现和 standard 分析器处理结果的区别的。

我们来试试中文

{
  "tokenizer": "standard",
  "text": "我是中国人"
}

解析结果:

[,,,,]

分词是分词了,但是貌似不符合我们的要求,关于中文的分词我们后面再说。

可配参数说明

  • max_token_length
    单个词语的最大长度。如果词语长度超过该长度,则按max_token_length间隔将其拆分。默认为255。

自定义分词器

PUT /person1
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard",
          "max_token_length": 5
        }
      }
    }
  }
}

注意配置参数:我们配置了一个自定义的分词器 my_tokenizer ,以 standard 为基础类型,然后配置了一个自定义的分析器 my_analyzer,设置该分析器的分词器为 my_tokenizer 。

letter 字母分词器

只要遇到不是字母的字符,分词器就会将文本分解。它对大多数欧洲语言都做得很好,但对一些亚洲语言来说就很糟糕,因为在这些语言中单词没有用空格分隔。

POST _analyze
{
  "tokenizer": "letter",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

解析结果:

[ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone] 

lowercase 小写分词器

其作用和 letter 分词器一样,只是会将字母转换为小写。此处我们就不贴示例了。

classic 经典分词器

适用于英语文档。此分词器具有对首字母缩写词、公司名称、电子邮件地址和 Internet 主机名进行特殊处理的启发式方法。然而,这些规则并不总是有效,分词器对除英语以外的大多数语言都不能很好地工作

POST _analyze
{
  "tokenizer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone. email: abc@cormm.com"
}

解析结果:

{
    "tokens": [
        {
            "token": "The",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "2",
            "start_offset": 4,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "QUICK",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "Brown",
            "start_offset": 12,
            "end_offset": 17,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "Foxes",
            "start_offset": 18,
            "end_offset": 23,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "jumped",
            "start_offset": 24,
            "end_offset": 30,
            "type": "<ALPHANUM>",
            "position": 5
        },
        {
            "token": "over",
            "start_offset": 31,
            "end_offset": 35,
            "type": "<ALPHANUM>",
            "position": 6
        },
        {
            "token": "the",
            "start_offset": 36,
            "end_offset": 39,
            "type": "<ALPHANUM>",
            "position": 7
        },
        {
            "token": "lazy",
            "start_offset": 40,
            "end_offset": 44,
            "type": "<ALPHANUM>",
            "position": 8
        },
        {
            "token": "dog's",
            "start_offset": 45,
            "end_offset": 50,
            "type": "<APOSTROPHE>",
            "position": 9
        },
        {
            "token": "bone",
            "start_offset": 51,
            "end_offset": 55,
            "type": "<ALPHANUM>",
            "position": 10
        },
        {
            "token": "email",
            "start_offset": 57,
            "end_offset": 62,
            "type": "<ALPHANUM>",
            "position": 11
        },
        {
            "token": "abc@cormm.com",
            "start_offset": 64,
            "end_offset": 77,
            "type": "<EMAIL>",
            "position": 12
        }
    ]
}

关于与 standard 分词器的区别,可以自行验证一下。

可配参数说明

  • max_token_length
    单个词语的最大长度。如果词语长度超过该长度,则按max_token_length间隔将其拆分。默认为255。

path_hierarchy 路径层次分词器

POST _analyze
{
  "tokenizer": "path_hierarchy",
  "text": "/one/two/three"
}

解析结果:

[ /one, /one/two, /one/two/three ]

可配参数说明

  • delimiter
    用作路径分隔符的字符。默认为 /
  • replacement
    用于分隔符的可选替换字符。默认为delimiter.
  • buffer_size
    单次读取到术语缓冲区的字符数。默认为1024. 术语缓冲区将按此大小增长,直到所有文本都被消耗掉。建议不要更改此设置。
  • reverse:是否反转,默认为false。
  • skip
    要跳过的初始标记数。默认为0.

示例2

拆分 - 字符,并将它们替换为 / 并跳过前两个标记

PUT /person1
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "-",
          "replacement": "/",
          "skip": 2
        }
      }
    }
  }
}
{
  "analyzer": "my_analyzer",
  "text": "one-two-three-four-five"
}

解析结果:

[ /three, /three/four, /three/four/five ]

如果设置 reverse 为 true

[ one/two/three/, two/three/, three/ ]

uax_url_email 电子邮件分词器

{
  "tokenizer": "uax_url_email",
  "text": "Email me at john.smith@global-international.com"
}

解析结果:

[ Email, me, at, john.smith@global-international.com ]

可配参数说明

  • max_token_length
    单个词语的最大长度。如果词语长度超过该长度,则按max_token_length间隔将其拆分。默认为255。

令牌过滤器

令牌过滤器,是在标记之后执行。es 提供的令牌过滤器非常多,我们只列一些可能会有用的来说一说。

uppercase 大写过滤器

{
  "tokenizer" : "standard",
  "filter" : ["uppercase"],
  "text" : "the Quick FoX JUMPs"
}

解析结果

[ THE, QUICK, FOX, JUMPS ]

lowercase 小写过滤器

{
  "tokenizer" : "standard",
  "filter" : ["lowercase"],
  "text" : "THE Quick FoX JUMPs"
}

解析结果:

[ the, quick, fox, jumps ]

stemmer 词干过滤器

{
  "tokenizer": "standard",
  "filter": [ "stemmer" ],
  "text": "fox running and jumping jumped"
}

解析结果:

[ fox, run, and, jump, jump ]

注意标记提取了词干。比如:jumping 和 jumped 提取为了 jump 。

可配参数说明

  • language
    (可选,字符串)用于词干标记的依赖于语言的词干提取算法。可以设置很多语言,我们常用的也就 english(默认:英语)german 德语、spanish 西班牙语等等,但还是不包括中文。

stop 停用词过滤器

该过滤器默认将如下词语作为停用词:

a, an, and, are, as, at, be, but, by, for, if, in, into, is, 
it, no, not, of, on, or, such, that, the, their, then, there, 
these, they, this, to, was, will, with
{
  "tokenizer": "standard",
  "filter": [ "stop" ],
  "text": "a quick fox jumps over the lazy dog"
}

解析结果:

[ quick, fox, jumps, over, lazy, dog ]

cjk_bigram 中日韩双字母标记过滤器

此过滤器支持中日韩的文字,但标记只对文字进行两两组合,严格上说对中文的支持也不是十分好。

{
  "tokenizer" : "standard",
  "filter" : ["cjk_bigram"],
  "text" : "我们都是中国人"
}

解析结果:

{
    "tokens": [
        {
            "token": "我们",
            "start_offset": 0,
            "end_offset": 2,
            "type": "<DOUBLE>",
            "position": 0
        },
        {
            "token": "们都",
            "start_offset": 1,
            "end_offset": 3,
            "type": "<DOUBLE>",
            "position": 1
        },
        {
            "token": "都是",
            "start_offset": 2,
            "end_offset": 4,
            "type": "<DOUBLE>",
            "position": 2
        },
        {
            "token": "是中",
            "start_offset": 3,
            "end_offset": 5,
            "type": "<DOUBLE>",
            "position": 3
        },
        {
            "token": "中国",
            "start_offset": 4,
            "end_offset": 6,
            "type": "<DOUBLE>",
            "position": 4
        },
        {
            "token": "国人",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<DOUBLE>",
            "position": 5
        }
    ]
}

除去我们以上介绍的,ES 的令牌过滤器还有很多,我们就不过多说明了,因为他们大多数都是不支持中文的。文章来源地址https://www.toymoban.com/news/detail-481271.html

到了这里,关于Elasticsearch 文本分析器(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch:搜索及索引分析器

    在我之前的文章 “Elasticsearch: analyzer”,我详细介绍了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文档的时候需要使用,同时,它也在搜索时,也需要针对搜索的文字进行分词。在今天的文章中,我们来详细介绍分析器是如何在索引及搜索时使用的。 可以在

    2024年02月05日
    浏览(83)
  • ElasticSearch 基础(七)之分析器

    就 ES 基础部分来说这暂时就是最后一篇的文章,写完之后就会学习 MQ 了。本篇内容简单了解 ES 的分析器,最重要的还是根据自己需求去定制自定义分析器,自定义分析器自行了解,这里只是基础。其他比较重要的就是中文分词器了,只需要知道常用的几种中文分词器就可以

    2024年02月09日
    浏览(41)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(124)
  • Elasticsearch 分词器切词器分析器

    normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理,过滤无用字符 HTML Strip Character Filter :html_strip 参数:escaped_tags 需要保留的html标签 Map

    2024年02月12日
    浏览(37)
  • ElasticSearch系列 - SpringBoot整合ES:分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2024年02月06日
    浏览(59)
  • 词法分析器(c++)

    个人觉得单纯是用来完成实验报告的话还行,但仅做参考,因为本人的编程水平有限,怕误人子弟。 本次代码支持以下操作: 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持: 部分(可手动在程序外部---reference.txt文件添加,),

    2024年02月04日
    浏览(48)
  • 编译原理———词法分析器

    设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中,  syn为单词种别码。  Token为存放的单词自身字符串。  Sum为整型常量。 具体实现时,可以将单词的二

    2024年02月08日
    浏览(61)
  • 分析器:常见问题

    源生成器(增量生成器)由于它特殊的定位,关于它的调试十分困难。在这里分享一些调试它的经验。 另外经常有写类库,然后提供可以生成代码的Attribute给用户的需求,此时需要用到传递引用的知识点。 源生成器项目和普通的项目不同。 普通的会在你按下运行或调试后才

    2024年02月01日
    浏览(67)
  • 词法分析器的设计与实现

    1.1、实验目的         加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求         1)对单词的构词规则有明确的定义;      

    2024年02月13日
    浏览(52)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包