热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elasticik分词中文同义词查询实现案例

2019独角兽企业重金招聘Python工程师标准前一段时间做了一个按照标签内容匹配文字的功能,由于匹配的文字不是很多。扩大匹配相关性。做了一个同义词相关联的查询

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前一段时间做了一个按照标签内容匹配文字的功能,由于匹配的文字不是很多。扩大匹配相关性。做了一个同义词相关联的查询。顺便记录一下工作中遇到的一些问题。
文中相关的地方,都会给出相关的文章链接。
es版本为5.4.1
本文为默认安装了ik分词插件
服务器为linux服务器
elastic中关于同义词的实现链接: https://www.elastic.co/guide/cn/elasticsearch/guide/current/multi-word-synonyms.html#multi-word-synonyms

以及*同义词的词库*:https://github.com/laotoutou/AitSimwords首先在es中新建文件 /opt/elastic/config/ 下面新建文件 synonym.txt 并输入一下内容

族,现代人,人类,智人,民族,史前人类,人民,人,大众

创建es的索引

curl -XPUT 127.0.01:9200/test1 -d'
{"settings": {"analysis": {"filter": {"my_synonym_filter": {"type": "synonym", "synonyms_path": "synonym.txt"}},"analyzer": {"my_synonyms": {"tokenizer": "ik_smart","filter": ["lowercase","my_synonym_filter" ],"use_smart": true}}}}
}'

创建索引的mapping

curl -XPUT 127.0.01:9200/test1/_mapping/test1 -d'
{"properties" : {"id" : {"type" : "keyword"},"name" : {"type" : "text","analyzer" : "my_synonyms","include_in_all" : true},"content" : {"type" : "text","analyzer" : "my_synonyms","include_in_all" : true}}
}'

并在索引中新增相关的数据

curl -XPUT 127.0.0.1:9200/test1/test1/120 -d '{"name": "族"
}'curl -XPUT 127.0.0.1:9200/test1/test1/121 -d '{"name": "现代人"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/122 -d '{"name": "人类"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/123 -d '{"name": "智人"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/124 -d '{"name": "民族"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/125 -d '{"name": "史前人类"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/126 -d '{"name": "人民"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/127 -d '{"name": "大众"
}'
curl -XPUT 127.0.0.1:9200/test1/test1/128 -d '{"name": "人"
}'

尝试进行es查询

curl -XPOST '127.0.0.1:9200/test1/test1/_search?pretty' -d '
{"query": {"match_phrase": {"name": {"query": "大众","analyzer": "my_synonyms"}}}
}'

尝试查看结果

由于在网上找的一些资料都没有进行同义词的词库链接。
在github上找了一个同义词的词库链接。由于在测试阶段。还没有正式使用。实用性有待研究。 https://github.com/laotoutou/AitSimwords
链接里面的内容词语之间都是tab符号需要去除,换成es中的,符号。用java写了一个小程序修改。

public static void readFile(){try {FileReader fr = new FileReader("C:\\worksoft\\git\\AitSimwords\\AitSimwords.txt");BufferedReader reader = new BufferedReader(fr);String str = "";FileWriter fw = new FileWriter("C:\\worksoft\\git\\AitSimwords\\AitSimwords1.txt");BufferedWriter writer = new BufferedWriter(fw);while ((str = reader.readLine()) != null){System.out.println(str);if (StringUtils.isEmpty(str)){continue;}writer.write(str.replaceAll("\\t" , "," ).substring(0 , str.length()-1));writer.newLine();writer.flush();}reader.close();fr.close();writer.close();fw.close();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}

之前的文字 列举一部分,连接中的行数有2800行左右

鲜花 花 被子植物门 被子植物 开花植物 有花植物 花蕾 花卉 赏花 花朵 开花
绿色 绿
树木 树 Tree 大树
海 大海 海域 海子
Hong 蓝色 희열다나 红绿蓝 Yeol Na 홍성미 Mi Seong Da Hee Hi 洪性美 喜悦Dana Sung Dana 蓝
绿色植物 多年生草本 植物 多年草 植物界 宿根草 多年生 therophyte 一年生植物 多年生植物 一年生草本
四旬 大斋节期 红色 大斋节 预苦期 红 大斋期 严斋期 四旬期 大红色 紫色
五色旗 黄 红 黑 白色 白 蓝
背景

修改以后的问题

鲜花,花,被子植物门,被子植物,开花植物,有花植物,花蕾,花卉,赏花,花朵,开花
绿色,绿
树木,树,Tree,大树
海,大海,海域,海子
Hong,蓝色,희열다나,红绿蓝,Yeol,Na,홍성미,Mi,Seong,Da,Hee,Hi,洪性美,喜悦Dana,Sung,Dana,蓝
绿色植物,多年生草本,植物,多年草,植物界,宿根草,多年生,therophyte,一年生植物,多年生植物,一年生草本
四旬,大斋节期,红色,大斋节,预苦期,红,大斋期,严斋期,四旬期,大红色,紫色
五色旗,黄,红,黑,白色,白,蓝
背景

然后把修改以后的文件上传到es的config下面的synonym.txt 文件中既可.


转:https://my.oschina.net/u/1023341/blog/1559987



推荐阅读
author-avatar
小狐狸2502895237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有