前一段时间做了一个按照标签内容匹配文字的功能,由于匹配的文字不是很多。扩大匹配相关性。做了一个同义词相关联的查询。顺便记录一下工作中遇到的一些问题。 文中相关的地方,都会给出相关的文章链接。 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 并输入一下内容</br>
族,现代人,人类,智人,民族,史前人类,人民,人,大众
创建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 文件中既可.