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

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

以及*同义词的词库*: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"
      }
    }
  }
}'

尝试查看结果java

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

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行左右git

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

修改之后的问题github

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

而后把修改之后的文件上传到es的config下面的synonym.txt 文件中既可.小程序

相关文章
相关标签/搜索