Elasticsearch之插件Ik分词器详细测试
Elasticsearch之插件Ik分词器详细测试 elasticsearch版本:6.7.2
这里主要测试三种分词器:Ik(ik_smart 、 ik_max_word),standard(es自带的)
先看三种分词器分词效果:
文章图片 |
文章图片 |
---|---|
文章图片 |
文章图片 |
文章图片 |
文章图片 |
然后创建索引,捏造数据开始测试:创建索引:
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,有两条数据匹配成功!
文章图片
再用 口红酒 测试一下
口红酒的 ik_smart 结果: 【口】【红酒】
去匹配上面三条数据应该是第一和第三条数据,结果如图:
文章图片
第二个检索测试:创建索引时,为desc字段指定的索引是:
"analyzer": "ik_smart",
"search_analyzer": "ik_max_word"
这里直接分析那三条数据的desc字段:
- desc : 乒乓球拍卖完了
ik_smart 分词结果: 【乒乓球】【拍卖】【完了】 - desc : 球拍卖完了
ik_smart 分词结果: 【球拍】【卖】【完了】 - desc : 乒乓球拍卖会
ik_smart 分词结果: 【乒乓球】【拍卖会】
球拍 的ik_max_word 结果:【球拍】,匹配上面三条数据,只有一条匹配,结果如图:
【Elasticsearch之插件Ik分词器详细测试】
文章图片
检索字段 拍卖会,
拍卖会 的ik_max_word 结果:【拍卖会】【拍卖】【会】,匹配上面三条数据,只有两条匹配,结果如图:
文章图片
检索字段 乒乓球拍,
拍卖会 的ik_max_word 结果:【乒乓球拍】【乒乓球】【乒乓】【球拍】,匹配上面三条数据,三条匹配,结果如图:
文章图片
检索时自带分词器如图,我在查询条件里面指定一个分词器:standard(逐字分开)
然后只查到一条数据,原因是:拍卖会经过 standard分词后为【拍】【卖】【会】
然后再去匹配上面三条数据:可见只有一个【卖】匹配到了,所以结果只有一条数据
文章图片
测试结果:创建索引时,可以为每个字段指定分词器,若用 ik,需要自己在es里面安装ik插件,不指定则是默认的(默认的分词效果很不好)
就像上面的这条索引:
“analyzer” 指定 这个字段在创建索引的时候使用的分词器
“search_analyzer” : 指定 这个字段在被检索的时候,给定的检索字段所用的分词器,上面的最后一条测试,
检索的时候自己再指定分词器,那么这次查询就使用你新指定的分词器,而覆盖掉创建索引时指定的分词器
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息