「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。
分词器的作用
Elasticsearch中默认的是标准分词器(standard),这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,这样对搜索中文不太友好,因此需要引入中文的分词器来解决这个问题。
分词,就是把一句话分成一个一个的词,比如 This is a banana. 如果按照elasticsearch默认的分词器来分词,会分成this,is,a,banana,分词出来的某些词,比如a其实对我们并没有什么用,因此分词需要注意:
·1 区分停顿词(a,or,and这种都属于停顿词)
·2 大小写转换(Banana与banana)
·3 时态的转换....
总之英文分词比较容易,按照空格和标点符合划分即可,然后去掉一些没有意义上的助词;
但是中文分词,就比较复杂,因为中文不能单纯的依靠空格,标点进行分词,比如“中华人民共和国国歌”,不能简单的分成一个一个的词,也不能粗暴的分成中华人民共和国和国歌,而 中华、人民、共和国、国歌等 都是一个词;
因此常见的分词算法就是拿一个标准的词典,关键词都在这个词典里面,然后按照几种规则去查找有没有关键词;
elasticsearch-analysis-ik提供了两种方式:
(1)ik_smart就是最少切分;
(2)ik_max_word则为细粒度的切分;
分词测试
//标准的英文分词是一个个分
GET _analyze
{
"analyzer":"standard",
"text":"中华人民共和国国歌"
}
//使用IK中文分词会按语义进行分
GET _analyze
{
"analyzer":"ik_smart",
"text":"中华人民共和国国歌"
}
//使用IK中文分词会按语义进行分
GET _analyze
{
"analyzer":"ik_max_word",
"text":"中华人民共和国国歌"
}
GET _analyze
{
"analyzer":"ik_max_word",
"text":"他是网红"
}
//创建一个索引test
PUT test
//设置索引字段的分词类型
POST test/_mapping
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
PUT /test/_doc/1
{
"name" : "xiao mi shou ji",
"price" : 2998.00,
"store" : 5000,
"content" : "中华人民共和国国歌"
}
GET /test/_doc/1
GET /test/_search
{
"query" : { "match" : { "content" : "中华" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}