2019独角兽企业重金招聘Python工程师标准>>>
前一段时间做了一个按照标签内容匹配文字的功能,由于匹配的文字不是很多。扩大匹配相关性。做了一个同义词相关联的查询。顺便记录一下工作中遇到的一些问题。 文中相关的地方,都会给出相关的文章链接。 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 文件中既可.