Elasticsearch分词器

ES默认只支持英文分词,如果是中文它会拆分为一个一个字

一、默认分词器

1.分词器(会忽略大小写):
  • 标准分词器standard(把单词进行分割)
  • 简单分词器simple(会去除字符串中非字母的元素)
  • 空格分词器whitespace(根据空格进行分割)
  • stop(会去除英文语句中的无意义的单词:the 、is、a等等)
  • keyword(会将整个文本当作一个词,不会被拆分)
2.标准分词器演示:
入参:
{
	"analyzer": "standard",
	"text": "zhouhong is a good man!"
}
结果:

{
    "tokens": [
        {
            "token": "zhouhong",
            "start_offset": 0,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "is",
            "start_offset": 9,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 12,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "good",
            "start_offset": 14,
            "end_offset": 18,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "man",
            "start_offset": 19,
            "end_offset": 22,
            "type": "<ALPHANUM>",
            "position": 4
        }
    ]
}

二、IK中文分词器

1.安装
下载与ES对应的IK压缩包上传服务器
  • 将压缩包解压到ES下的 plugins 下

unzip elasticsearch-analysis-ik-7.10.1.zip  -d /usr/local/elasticsearch-7.10.1/plugins/ik
2.测试
  • 使用 ik_max_word(最细粒的拆分) 测试
入参:

{
	"analyzer": "ik_max_word",
	"text": "明天早上吃什么呢"
}
出参:

{
    "tokens": [
        {
            "token": "明天",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "早上",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "吃什么",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "什么",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "呢",
            "start_offset": 7,
            "end_offset": 8,
            "type": "CN_CHAR",
            "position": 4
        }
    ]
}
可见分的很详细,几乎能组成词的都拆分了。
  • 使用 ik_smart 分词器测试
入参:

{
	"analyzer": "ik_smart",
	"text": "明天早上吃什么呢"
}
出参:

 

{
    "tokens": [
        {
            "token": "明天",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "早上",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "吃什么",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "呢",
            "start_offset": 7,
            "end_offset": 8,
            "type": "CN_CHAR",
            "position": 3
        }
    ]
}

三、自定义中文分词器

IK默认分词器虽然很好用,但是会存在一个问题,像我们的网络用语,姓名等等它会分割为一个一个的字不符合我们的需求比如下面这个情况:

{
	"analyzer": "ik_max_word",
	"text": "周红"
}
{
    "tokens": [
        {
            "token": "周",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "红",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        }
    ]
}
我们希望它是一个完整的词,而不用被拆分开来。
自定义分词器
  • 在IK分词器安装目录下面的配置文件,增加一个custom.dic的字典文件

vim /usr/local/elasticsearch-7.10.1/plugins/ik/config/IKAnalyzer.cfg.xml

 

  • 在同级目录下新建一个custom.dic文件里面写上我们不需要拆分的词

  • 测试
入参:

{
	"analyzer": "ik_max_word",
	"text": "周红"
}
出参:

{
    "tokens": [
        {
            "token": "周红",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        }
    ]
}

 后面如果想扩展,只需在自定义的custom.dic里面添加词汇即可


已有 0 条评论

    欢迎您,新朋友,感谢参与互动!