elasticsearch版本:6.7.2
这里主要测试三种分词器:Ik(ik_smart 、 ik_max_word),standard(es自带的)
先看三种分词器分词效果:
可以看出 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:
而我们检索字段是:进口
进口 ik_smart 结果:【进口】
我们通过检索字段【进口】去匹配上面三条数据的 name 的 ik_max_word 结果
可见只有一条匹配结果!
我们再以 【口红】 为检索条件,结果如下图:
口红的 ik_smart 结果是 【口红】,去匹配上面三条数据的name,有两条数据匹配成功!
再用 口红酒 测试一下
口红酒的 ik_smart 结果: 【口】【红酒】
去匹配上面三条数据应该是第一和第三条数据,结果如图:
创建索引时,为desc字段指定的索引是:
"analyzer": "ik_smart",
"search_analyzer": "ik_max_word"
这里直接分析那三条数据的desc字段:
检索字段 球拍,
球拍 的ik_max_word 结果:【球拍】,匹配上面三条数据,只有一条匹配,结果如图:
检索字段 拍卖会,
拍卖会 的ik_max_word 结果:【拍卖会】【拍卖】【会】,匹配上面三条数据,只有两条匹配,结果如图:
检索字段 乒乓球拍,
拍卖会 的ik_max_word 结果:【乒乓球拍】【乒乓球】【乒乓】【球拍】,匹配上面三条数据,三条匹配,结果如图:
如图,我在查询条件里面指定一个分词器:standard(逐字分开)
然后只查到一条数据,原因是:拍卖会经过 standard分词后为【拍】【卖】【会】
然后再去匹配上面三条数据:可见只有一个【卖】匹配到了,所以结果只有一条数据
创建索引时,可以为每个字段指定分词器,若用 ik,需要自己在es里面安装ik插件,不指定则是默认的(默认的分词效果很不好)
就像上面的这条索引:
“analyzer” 指定 这个字段在创建索引的时候使用的分词器
“search_analyzer” : 指定 这个字段在被检索的时候,给定的检索字段所用的分词器,上面的最后一条测试,
检索的时候自己再指定分词器,那么这次查询就使用你新指定的分词器,而覆盖掉创建索引时指定的分词器