ES mapping 映射参数第一期之~ Analyzer

前言

  • 本文是ES mapping 映射参数第一期~ Analyzer
  • 文中使用 ES versions 7.1,其他版本可能有偏差。
  • mapping 映射参数预计是每周3章,有喜欢的欢迎关注,一起交流学习

一、Analyzer 概念

官方解释:以将字符串转换为标记或 术语流 。
白话:根据选择不同的分析器进行语句拆分。

例如:"The quick Brown Foxes.",根据使用的分析器,字符串可能会被分析为标记:quick、brown、 fox。这些是为该字段编制索引的实际术语,这使得在 大块文本中有效地搜索单个单词成为可能

Analyzer 由三部分组成:字符过滤器、 标记器和标记过滤器

  • 字符过滤器(character filter):接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签,或者将罗马数字转换成阿拉伯数字等。一个字符过滤器可以有零个或者多个

  • 分词器(tokenizer):分词器接收一个 字符流,将其分解为单个 令牌(通常是单个单词),并输出一个令牌流。例如,whitespace标记器在看到任何空格时将文本分解为标记。它会将文本 "Quick brown fox!"转换为术语[Quick, brown, fox!]。

  • 令牌过滤器(token filters):令牌过滤器接收令牌流并可以添加、删除或更改令牌。例如,lowercase记号过滤器将所有记号转换为小写, 记号过滤器从记号流 stop中删除常用词(停用词) ,记号过滤器将同义词引入记号流。

二 示例解析

先看 Character filter使用char_filter定义 ,目前ES提供了三种:

  • HTML Strip Char Filter
  • Mapping Char Filter
  • Pattern Replace Char Filter

我们以 HTML Strip Char Filter(HTML条形过滤器) 讲解 字符过滤器。先来看不带 字符过滤的 :

POST _analyze?pretty
{
  "tokenizer":      "keyword", 
  "text": "<p>I&apos;m so <b>happy</b>!</p>"
}

在这里插入图片描述
可以看到解析过后连HTML标签也一起返回了,下面我们希望过滤掉这些html标签:

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

在这里插入图片描述
我们通过添加 "char_filter": [ "html_strip" ] 解决了去掉html,本处就不对另外两种做分析了,有喜欢的小伙伴可查看问后链接查看文档,具体使用也是很简单。

再看 tokenizer 分词器使用tokenizer定义

目前ES 对 分词器提供的很多,此处不全还有很多 例如 :

  • Standard Tokenizer - 标准分词器,也是ES默认的一个,一会就以他为示例
  • Simple Analyzer – 按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer – 小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer – 按照空格切分,不转小写
  • Keyword Analyzer – 不分词,直接将输入当作输出
  • Patter Analyzer – 正则表达式,默认 \W+ (非字符分隔)
  • Language – 提供了30多种常见语言的分词器

上代码:


#查看不同的analyzer的效果
#standard
GET _analyze
{
  "analyzer": "standard",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

#simpe
GET _analyze
{
  "analyzer": "simple",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}


GET _analyze
{
  "analyzer": "stop",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}


#stop
GET _analyze
{
  "analyzer": "whitespace",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

#keyword
GET _analyze
{
  "analyzer": "keyword",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "pattern",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}


#english
GET _analyze
{
  "analyzer": "english",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}


POST _analyze
{
  "analyzer": "icu_analyzer",
  "text": "他说的确实在理”"
}


POST _analyze
{
  "analyzer": "standard",
  "text": "他说的确实在理”"
}


POST _analyze
{
  "analyzer": "icu_analyzer",
  "text": "这个苹果不大好吃"
}

是不是使用 icu_analyzer 会报错?不要慌了,这个属于ES 的一个插件,中文分词基本是要自己以插件的形式放在里面,其他中文分词插件还有:ik_max_word ik_smart, 现在也没必要了解这些,有需要的可单独出一章说明怎样安装中文分词,文后也有链接可自行下载进行安装.

最后再看令牌过滤器 token filters使用filter定义
Es 也是提供了很多的列如:

  • Lowercase Token Filter 小写标记过滤
  • Uppercase Token Filter 大写标记过滤
  • Stop Token Filter 此处以 停用词为示例
GET _analyze
{
  "tokenizer": "standard",
  "filter": ["stop"],
  "text": ["The gilrs in China are playing this game!"]
}

此示例就会过滤掉 IN are 这种词
在这里插入图片描述

最强应用 使用 字符过滤器 使用 html_strip ,分词器 使用 standard,令牌过滤器 使用 stop 组合再一起

GET _analyze
{
  "tokenizer": "standard",
  "filter": ["stop"], 
  "char_filter":[ "html_strip" ],
  "text": "<p>The in gilrs</p>"
}

在这里插入图片描述
终极玩法 自定义分词器 和上面一样组合再一起应用

curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my_index/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_custom_analyzer",
  "text": "Is this <b>déjà vu</b>?"
}
'

文末:

本文就到此结束了,快来一起学习吧~

注:如果此文有增加新的内容会同步更新

tokenizer 和 filter 是可以定义多个的。

三 文后

字符过滤器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-charfilters.html
分词器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-tokenizers.html
令牌过滤器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-tokenfilters.html
IK分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
ICU中文分词下载地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-7.1.0.zip

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值