Elasticsearch 分析器的高级用法二(停用词,拼音搜索)

停用词

简介

停用词是指,在被分词后的词语中包含的无搜索意义的词。

例如:这里的风景真美。

分词后,”这里“,”的“ 相对于文档搜索意义不大,但这种词使用频率又比较高。 为了使搜索更加准确,往往需要在构建索引时,忽略掉这些词

以在这个网站查看常用的停用词

  • 英文:https://www.ranks.nl/stopwords
  • 中文:https://www.ranks.nl/stopwords/chinese-stopwords

停用词分词过滤器

ES支持两种方式过滤停用词

自定义停用词分词过滤器

通过自定义分词过滤器为 停用词过滤器,来实现停用词过滤

DELETE /my-index-000001
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "stop_analyer": {
          "tokenizer": "ik_smart",
          "filter": [
            "stop"
          ]
        }
      },
      "filter": {
        "stop": {
          "type": "stop",
          "stopwords": [
            "我",
            "的",
            "这里",
            "哪里"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "stop_analyer"
      }
    }
  }
}

POST /my-index-000001/_analyze
{
  "field": "content",
  "text": "这里的风景真美"
}

在这里插入图片描述

内置分析器的停用词过滤器

一般情况下 我们常用的内置分析器内部都包含 停用词的设置,这里以标准分析器和IK分析器举例

  • standard 分析器
    通过指定 standard 分析器 的stopwords 属性 实现停用词配置

    DELETE /my-index-000002
    
    PUT /my-index-000002
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "stop_standard": {
              "type":"standard",
              "stopwords": [
                "我",
                "的",
                "这",
                "里"
              ]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "content": {
            "type": "text",
            "analyzer": "stop_standard"
          }
        }
      }
    }
    
    
    POST /my-index-000002/_analyze
    {
      "field": "content",
      "text": "这里的风景真美"
    }
    

    在这里插入图片描述

  • ik 分析器

    IK分析器默认只有英文停用词,中文停用词的使用需要自行添加。

    与添加自定义词典过程类似
    进入ik 分析器 config 目录
    编辑 IKAnalyzer.cfg.xml 即可以实现自定义词典

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 扩展配置</comment>
            <!--用户可以在这里配置自己的扩展字典 -->
            <entry key="ext_dict">custom-dict.dic</entry>
             <!--用户可以在这里配置自己的扩展停止词字典-->
            <entry key="ext_stopwords">custom-stop.dic</entry>
            <!--用户可以在这里配置远程扩展字典 -->
            <!-- <entry key="remote_ext_dict">words_location</entry> -->
            <!--用户可以在这里配置远程扩展停止词字典-->
            <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
    

    在 custom-stop.dic 文件中 写入 所需的停用词,添加完成后,重启ES即可
    在这里插入图片描述
    验证下结果

    POST /_analyze
    {
      "analyzer": "ik_smart",
      "text": "这里的风景真美"
    }
    

    在这里插入图片描述

注意,有一个细节

  • IK分析器过滤器 是在 IK分词器 内部开始过滤器

    POST /_analyze
    {
      "analyzer": "ik_smart",
      "text": "this is boy"
    }
    
    
    POST /_analyze
    {
      "tokenizer": "ik_smart",
      "text": "this is boy"
    }
    

    执行上述请求,结果都发生了停用词过滤,说明IK分析器在分词器层面就完成了 停用词过滤。
    在这里插入图片描述

  • standard 分析器 的stopwords 是作用在 分词过滤器上的

    POST /_analyze
    {
      "tokenizer": {
        "type":"standard",
        "stopwords": [
                "this",
                "is"
              ]
      },
      "text": "this is boy"
    }
    

    执行上述请求,停用词stopwords 指令没有生效。说明 stopwords 在分词器阶段无效!
    在这里插入图片描述

拼音搜索

要实现拼音搜索,需要安装相应的拼音分析器插件

官网:https://github.com/infinilabs/analysis-pinyin

插件下载地址:https://release.infinilabs.com/analysis-pinyin/stable/

安装

下载对应 压缩包(要求与ES版本一致)
本文以 elasticsearch-analysis-pinyin-7.10.2.zip 为例

# 进入es的插件目录
cd es/plugins
# 创建pinyin目录
mkdir pinyin
# 在pinyin 目录下解压 pinyin分析器
unzip elasticsearch-analysis-pinyin-7.10.2.zip
# 进入es/bin目录,重启es
./elasticsearch -d

使用

POST /_analyze
{
  "analyzer": "pinyin",
  "text":"北京大学"
}

在这里插入图片描述
如上:北京大学 被 切割为 bei ,jing, da,xue, bjdx

相关配置

  • keep_first_letter: 启用后,保留每个汉字的第一个字母。

    例如,刘德华变为 ldh。默认值:true。

  • keep_separate_first_letter: 启用后,保留每个汉字的首字母。

    例如,刘德华变成 l,d,h。默认值:false。注意:这可能会因术语频率而增加查询的模糊性。

  • limit_first_letter_length: 设置第一个字母结果的最大长度。默认值:16。

  • keep_full_pinyin: 启用后,保留每个汉字的完整拼音。默认值:true

    例如,刘德华变成 [liu,de,hua]。

  • keep_joined_full_pinyin: 启用时,连接每个汉字的完整拼音。默认值:false。

    例如,刘德华变成 [liudehua]。

  • keep_none_chinese: 在结果中保留非中文字母或数字。默认值:true。

  • keep_none_chinese_together: 将非中文字母保留在一起。默认值:true。

    例如,DJ 音乐家变成 DJ,yin,yue,jia。设置为 false 时,DJ 音乐家会变成 D,J,yin,yue,jia。注意:应首先启用 keep_none_chinese。

  • keep_none_chinese_in_first_letter: 将非中文字母保留在首字母中。

    例如,刘德华 AT2016 变成 ldhat2016。默认值:true。

  • keep_none_chinese_in_joined_full_pinyin:将非中文字母保留在连接的完整拼音中。

    例如,刘德华 2016 将变为 liudehua2016。默认值:false。

  • none_chinese_pinyin_tokenize: 如果非中文字母是拼音字母,则将其分解为独立的拼音术语。默认值:true。

    例如,liudehuaalibaba13zhuanghan 变成 liu,de,hua,a,li、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RwTo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值