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 文件中既可.小程序

相關文章
相關標籤/搜索