Elasticsearch之插件Ik分词器详细测试

Elasticsearch之插件Ik分词器详细测试 elasticsearch版本:6.7.2
这里主要测试三种分词器:Ik(ik_smart 、 ik_max_word),standard(es自带的)
先看三种分词器分词效果:

Elasticsearch之插件Ik分词器详细测试
文章图片
Elasticsearch之插件Ik分词器详细测试
文章图片
Elasticsearch之插件Ik分词器详细测试
文章图片
Elasticsearch之插件Ik分词器详细测试
文章图片
Elasticsearch之插件Ik分词器详细测试
文章图片
Elasticsearch之插件Ik分词器详细测试
文章图片
可以看出 ik_smar :智能中文语法拆分 | ik_max_word :中文语法详细拆分 | standard:逐字拆分
然后创建索引,捏造数据开始测试:创建索引:
PUT ik2_index#索引名字 { "mappings": {#映射集 "userInfo": {#类型 "properties": {#参数集 "name": {#该类型中的第一个字段 "type": "text",#该字段的类型,就是String类型 "index": true,#是否创建索引 "analyzer": "ik_max_word", #使用这种分词器创建索引 "search_analyzer": "ik_smart" #指定查询字段的分词器 }, "desc": {#第二个字段名 "type": "text", "index": true, "analyzer": "ik_smart", "search_analyzer": "ik_max_word" }, "desc2":{#第三个字段名 "type": "text", "index": true, "analyzer": "standard", "search_analyzer": "standard" } } } } }

往新建的索引中插入几条数据:
PUT /ik2_index/userInfo/1#/索引名/类型名/id { "name":"进口红酒", "desc":"乒乓球拍卖完了", "desc2":"进口红酒" } PUT /ik2_index/userInfo/2 { "name":"这是一支口红", "desc":"球拍卖完了", "desc2":"进口红酒" } PUT /ik2_index/userInfo/3 { "name":"一口一红", "desc":"乒乓球拍卖会", "desc2":"进口红酒" }

查询测试:
第一次检索:
GET /ik2_index/userInfo/_search { "query":{ "match": { "name": { "query":"进口" } } } }

结果:
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.2876821, "hits" : [ { "_index" : "ik2_index", "_type" : "userInfo", "_id" : "1", "_score" : 0.2876821, "_source" : { "name" : "进口红酒", "desc" : "乒乓球拍卖完了", "desc2" : "进口红酒" } } ] } }

只检索出一条数据,分析一下:
name字段在创建索引的时候设置了两个属性:
"analyzer": "ik_max_word", "search_analyzer": "ik_smart"

也就是es创建索引的时候用的是ik_max_word分词器,看我们上面存的三条数据的name:
  • name : 进口红酒
    ik_max_word分词结果:【进口】【进】【口红】【红酒】
  • name :这是一支口红
    ik_max_word分词结果:【这是】【一支】【一】【支】【口红】
  • name :一口一红
    ik_max_word分词结果:【一口】【一】【口】【一红】【一】【红】
而我们检索字段是:进口
进口 ik_smart 结果:【进口】
我们通过检索字段【进口】去匹配上面三条数据的 name 的 ik_max_word 结果
可见只有一条匹配结果!
我们再以 【口红】 为检索条件,结果如下图:
口红的 ik_smart 结果是 【口红】,去匹配上面三条数据的name,有两条数据匹配成功!
Elasticsearch之插件Ik分词器详细测试
文章图片

再用 口红酒 测试一下
口红酒的 ik_smart 结果: 【口】【红酒】
去匹配上面三条数据应该是第一和第三条数据,结果如图:
Elasticsearch之插件Ik分词器详细测试
文章图片

第二个检索测试:创建索引时,为desc字段指定的索引是:
"analyzer": "ik_smart", "search_analyzer": "ik_max_word"

这里直接分析那三条数据的desc字段:
  • desc : 乒乓球拍卖完了
    ik_smart 分词结果: 【乒乓球】【拍卖】【完了】
  • desc : 球拍卖完了
    ik_smart 分词结果: 【球拍】【卖】【完了】
  • desc : 乒乓球拍卖会
    ik_smart 分词结果: 【乒乓球】【拍卖会】
检索字段 球拍,
球拍 的ik_max_word 结果:【球拍】,匹配上面三条数据,只有一条匹配,结果如图:
【Elasticsearch之插件Ik分词器详细测试】Elasticsearch之插件Ik分词器详细测试
文章图片

检索字段 拍卖会,
拍卖会 的ik_max_word 结果:【拍卖会】【拍卖】【会】,匹配上面三条数据,只有两条匹配,结果如图:
Elasticsearch之插件Ik分词器详细测试
文章图片

检索字段 乒乓球拍,
拍卖会 的ik_max_word 结果:【乒乓球拍】【乒乓球】【乒乓】【球拍】,匹配上面三条数据,三条匹配,结果如图:
Elasticsearch之插件Ik分词器详细测试
文章图片

检索时自带分词器如图,我在查询条件里面指定一个分词器:standard(逐字分开)
然后只查到一条数据,原因是:拍卖会经过 standard分词后为【拍】【卖】【会】
然后再去匹配上面三条数据:可见只有一个【卖】匹配到了,所以结果只有一条数据
Elasticsearch之插件Ik分词器详细测试
文章图片

测试结果:创建索引时,可以为每个字段指定分词器,若用 ik,需要自己在es里面安装ik插件,不指定则是默认的(默认的分词效果很不好)
就像上面的这条索引:
“analyzer” 指定 这个字段在创建索引的时候使用的分词器
“search_analyzer” : 指定 这个字段在被检索的时候,给定的检索字段所用的分词器,上面的最后一条测试,
检索的时候自己再指定分词器,那么这次查询就使用你新指定的分词器,而覆盖掉创建索引时指定的分词器

    推荐阅读