Elasticsearch (ES篇): 分词器的作用

589 阅读2分钟

「这是我参与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" : {}

        }

    }

}