同义词也叫近义词或相近词,用来处理用户不同搜索关键词但表述相同的场景;如当用户输入“邀请函免费“与“邀请函免费版”,其实都在找免费的邀请函,那么在不考虑个性化的前提下返回的商品结果集不应该是不一样的。
那么基于以上假设,我们可尝试通过ES自带同义词功能来解决。
创建同义词文件
第一步在elasticsearch的config目录下创建analysis文件夹创建自己的同义词文件synonym.txt并编辑synonym.txt文件(切记文档编码格式一定要是UTF-8,),内容比如如下:
双十一,双11=>购物节
中秋,中秋节=>中秋节
免费,免费版
iPhone,苹果手机
耐克,Nike
一行一个同义词,其中 AA,BB=>CC 这种写法会将AA与BB都映射到CC,然后只对CC进行索引;而 AA,BB 这种当文档中存在AA时,不仅仅会索引AA还会索引BB;这里需要注意的是如果文件中一个词存在于多行,那么对应的近义词会累计,如:
小米,小米手机
小米,小米电脑
此时“小米”对应的近义词是“小米手机”,“小米电脑”,但如果是输入“小米手机”,那么近义词只有“小米”.
加载词库
需要重启ES进行词库加载
创建索引库
创建索引库时使用自定义分词器
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "ik_max_word",
"filter" : ["my_synonym"]
}
},
"filter" : {
"my_synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
其中synonyms_path指定第一步配置的索引文件路径。
验证效果
{ "analyzer": "my_analyzer", "text": ["iphone"]}
{
"tokens": [{
"token": "iphone",
"start_offset": 0,
"end_offset": 6,
"type": "ENGLISH",
"position": 0
}, {
"token": "苹果",
"start_offset": 0,
"end_offset": 6,
"type": "SYNONYM",
"position": 0
}, {
"token": "手机",
"start_offset": 0,
"end_offset": 6,
"type": "SYNONYM",
"position": 1
}]
}
通过结果可以看出,输入词“iPhone”经过filter被映射到同义词文件中配置的“iPhone”和“苹果手机”,之后经过token analyzer处理后“苹果手机”又被拆分成“苹果”和“手机”。
网友评论