同義詞也叫近義詞或相近詞盈咳,用來處理用戶不同搜索關(guān)鍵詞但表述相同的場景汛蝙;如當(dāng)用戶輸入“邀請函免費(fèi)“與“邀請函免費(fèi)版”故俐,其實都在找免費(fèi)的邀請函胁澳,那么在不考慮個性化的前提下返回的商品結(jié)果集不應(yīng)該是不一樣的鹿驼。
那么基于以上假設(shè)欲低,我們可嘗試通過ES自帶同義詞功能來解決。
創(chuàng)建同義詞文件
第一步在elasticsearch的config目錄下創(chuàng)建analysis文件夾創(chuàng)建自己的同義詞文件synonym.txt并編輯synonym.txt文件(切記文檔編碼格式一定要是UTF-8,)畜晰,內(nèi)容比如如下:
雙十一,雙11=>購物節(jié)
中秋,中秋節(jié)=>中秋節(jié)
免費(fèi),免費(fèi)版
iPhone,蘋果手機(jī)
耐克,Nike
一行一個同義詞砾莱,其中 AA,BB=>CC 這種寫法會將AA與BB都映射到CC,然后只對CC進(jìn)行索引凄鼻;而 AA,BB 這種當(dāng)文檔中存在AA時腊瑟,不僅僅會索引AA還會索引BB;這里需要注意的是如果文件中一個詞存在于多行块蚌,那么對應(yīng)的近義詞會累計闰非,如:
小米,小米手機(jī)
小米,小米電腦
此時“小米”對應(yīng)的近義詞是“小米手機(jī)”,“小米電腦”,但如果是輸入“小米手機(jī)”峭范,那么近義詞只有“小米”.
加載詞庫
需要重啟ES進(jìn)行詞庫加載
創(chuàng)建索引庫
創(chuàng)建索引庫時使用自定義分詞器
{
"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": "手機(jī)",
"start_offset": 0,
"end_offset": 6,
"type": "SYNONYM",
"position": 1
}]
}
通過結(jié)果可以看出,輸入詞“iPhone”經(jīng)過filter被映射到同義詞文件中配置的“iPhone”和“蘋果手機(jī)”纱控,之后經(jīng)過token analyzer處理后“蘋果手機(jī)”又被拆分成“蘋果”和“手機(jī)”辆毡。