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

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

elasticsearch版本:6.7.2

这里主要测试三种分词器:Ik(ik_smart 、 ik_max_word),standard(es自带的)
先看三种分词器分词效果:

Elasticsearch之插件Ik分词器详细测试_第1张图片 Elasticsearch之插件Ik分词器详细测试_第2张图片
Elasticsearch之插件Ik分词器详细测试_第3张图片 Elasticsearch之插件Ik分词器详细测试_第4张图片
Elasticsearch之插件Ik分词器详细测试_第5张图片 Elasticsearch之插件Ik分词器详细测试_第6张图片

可以看出 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 结果:【进口】

我们通过检索字段【进口】去匹配上面三条数据的 nameik_max_word 结果
可见只有一条匹配结果!


我们再以 【口红】 为检索条件,结果如下图:
口红的 ik_smart 结果是 【口红】,去匹配上面三条数据的name,有两条数据匹配成功!

Elasticsearch之插件Ik分词器详细测试_第7张图片


再用 口红酒 测试一下
口红酒的 ik_smart 结果: 【口】【红酒】
去匹配上面三条数据应该是第一和第三条数据,结果如图:

Elasticsearch之插件Ik分词器详细测试_第8张图片


第二个检索测试:

创建索引时,为desc字段指定的索引是:

 "analyzer": "ik_smart",
 "search_analyzer": "ik_max_word"

这里直接分析那三条数据的desc字段:

  • desc : 乒乓球拍卖完了
    ik_smart 分词结果: 【乒乓球】【拍卖】【完了】
  • desc : 球拍卖完了
    ik_smart 分词结果: 【球拍】【卖】【完了】
  • desc : 乒乓球拍卖会
    ik_smart 分词结果: 【乒乓球】【拍卖会】

检索字段 球拍
球拍 的ik_max_word 结果:【球拍】,匹配上面三条数据,只有一条匹配,结果如图:

Elasticsearch之插件Ik分词器详细测试_第9张图片

检索字段 拍卖会
拍卖会 的ik_max_word 结果:【拍卖会】【拍卖】【会】,匹配上面三条数据,只有两条匹配,结果如图:

Elasticsearch之插件Ik分词器详细测试_第10张图片

检索字段 乒乓球拍
拍卖会 的ik_max_word 结果:【乒乓球拍】【乒乓球】【乒乓】【球拍】,匹配上面三条数据,三条匹配,结果如图:

Elasticsearch之插件Ik分词器详细测试_第11张图片


检索时自带分词器

如图,我在查询条件里面指定一个分词器:standard(逐字分开)
然后只查到一条数据,原因是:拍卖会经过 standard分词后为【拍】【卖】【会】
然后再去匹配上面三条数据:可见只有一个【卖】匹配到了,所以结果只有一条数据

Elasticsearch之插件Ik分词器详细测试_第12张图片

测试结果:

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

你可能感兴趣的:(Elasticsearch之插件Ik分词器详细测试)