小太阳的博客

分词器以及IK中文分词器

分词器:将一段文本,按照一定逻辑,拆分成多个词语的工具。

ElasticSearch内置分词器

注:ES内置分词器对中文分词不太友好,1个字1个词

  • Standard Analyzer:默认分词器,按词切分,小写处理(全部转为小写)
  • Simple Analyzer:按照非字母切分(符号被过滤),小写处理(全部转为小写)
  • Stop Analyzer:小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer:按照空格切分,不转小写
  • Keyword Analyzer:不分词,直接将输入当做输出
  • Patter Analyzer:正则表达式,默认\W+(非字符分割)
  • Language:提供了30多种常见语言的分词器

IK分词器安装

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包:

  • 是一个基于Maven构建的项目
  • 具有60万字/秒的高速处理能力
  • 支持用户词典扩展定义

安装前提要有JDK,如果没有JDK,ES也有自带的JDK,指定一下环境变量:

vim /etc/profile
# 在profile文件末尾添加
#java environment
export JAVA_HOME=/opt/elasticsearch/jdk
export PATH=$PATH:${JAVA_HOME}/bin

# 保存退出后,重新加载profile
source /etc/profile

1.下载maven安装包并解压

下载:wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
解压:tar -zxvf apache-maven-3.8.1-bin.tar.gz -C /opt/
改名:mv /opt/apache-maven-3.8.1/ /opt/apache-maven

2.设置maven环境变量

vim /etc/profile.d/maven.sh

# 内容复制到文件,保存
export MAVEN_HOME=/opt/apache-maven
export PATH=${MAVEN_HOME}/bin:${PATH}

# 生效环境变量
source /etc/profile.d/maven.sh

3.验证maven

mvn -v

4.解压IK分词器

# unzip使用-d指定解压目录
解压:unzip -d /opt/ elasticsearch-analysis-ik-7.4.0.zip
改名:mv /opt/elasticsearch-analysis-ik-7.4.0/ /opt/ik-analysis

5.编译jar包

# 进入到ik分词器目录执行:
mvn package

第一次使用mvn打包会下载一些东西,耐心等待......

6.jar包移动

package执行完毕后会在当前目录下生成target/releases目录,将其中的elasticsearch-analysis-ik-7.4.0.zip。拷贝到elasticsearch目录下的新建的目录plugins/analysis-ik,并解压

# 进入目录
cd /opt/elasticsearch/plugins
# 新建目录
mkdir analysis-ik
cd analysis-ik
# 执行拷贝
cp -R /opt/ik-analysis/target/releases/elasticsearch-analysis-ik-7.4.0.zip /opt/elasticsearch/plugins/analysis-ik
# 执行解压
unzip /opt/elasticsearch/plugins/analysis-ik/elasticsearch-analysis-ik-7.4.0.zip
# 拷贝辞典
cp -R /opt/ik-analysis/config/* /opt/elasticsearch/config/

注:一定要重启ES

使用IK分词器

IK分词器有两种分词模式:ik_max_word和ik_smart模式。

1、ik_max_word

会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。

# 方式一ik_max_word
GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "乒乓球明年总冠军"
}

2、ik_smart会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

# 方式二ik_smart
GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "乒乓球明年总冠军"
}

IK分词器-查询文档

  • 词条查询:term。词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索
  • 全文查询:match。全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集

修改ES默认分词器

# 删除之前的索引
DELETE person
# 创建索引,并制定分词器以及分词颗粒度
PUT person
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "address": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      }
    }
  }
}

添加测试数据

PUT person/_doc/id1
{
  "name":"测试数据",
  "address": "乒乓球明年总冠军"
}

PUT person/_doc/id2
{
  "name":"测试数据2",
  "address": "我爱北京天安门"
}

term词条查询

GET /person/_search
{
  "query": {
    "term": {
      "address": {
        "value": "北京"
      }
    }
  }
}

若value为:北京天安门,则不会查到,因为term不会分词。

match全文查询

GET /person/_search
{
  "query": {
    "match": {
      "address": "北京天安门"
    }
  }
}
match查询时不用写value,直接写字符串,会先分词,求交集查询。

Copyright © 2023,版权所有 - 小太阳的博客 - 黑ICP备2023000004号