全部產品
Search
文件中心

Elasticsearch:使用AliNLP分詞外掛程式(analysis-aliws)

更新時間:Jun 30, 2024

AliNLP分詞外掛程式(analysis-aliws)是Elasticsearch(ES)內建的一個系統預設外掛程式。安裝該外掛程式後會在阿里雲ES中整合對應的分析器和分詞器,可用於文檔的分析和檢索。您還可以通過該外掛程式的詞庫配置功能實現詞典的熱更新。

外掛程式介紹

安裝analysis-aliws外掛程式後,阿里雲ES預設會整合以下分析器和分詞器。您可以使用這些分析器和分詞器查詢文檔,也可以通過詞庫配置功能自訂更新分詞詞庫。

  • 分析器:aliws(不會截取虛詞、虛詞短語、符號)

  • 分詞器:aliws_tokenizer

說明

前提條件

已安裝analysis-aliws外掛程式(預設未安裝)。安裝方法,請參見安裝或卸載系統預設外掛程式

使用限制

  • ES執行個體的記憶體要求4 GB及以上(生產環境中要求記憶體最低為8 GB)。如果記憶體不滿足要求,請先升級叢集,請參見升配叢集

  • 5.x版本和8.x版本執行個體暫不支援安裝analysis-aliws外掛程式,請以控制台為準。

使用aliws分析器查詢文檔

  1. 登入目標Elasticsearch執行個體的Kibana控制台,根據頁面提示進入Kibana首頁。
    登入Kibana控制台的具體操作,請參見登入Kibana控制台
    說明 本文以Elasticsearch 6.7.0版本為例,其他版本操作可能略有差別,請以實際介面為準。
  2. 在左側導覽列,單擊Dev Tools
  3. Console中,執行如下命令建立索引。

    • 7.0以下版本

      PUT /index
      {
         "mappings": {
              "fulltext": {
                  "properties": {
                      "content": {
                          "type": "text",
                          "analyzer": "aliws"
                      }
                  }
              }
          }
      }
    • 7.0及以上版本

      PUT /index
      {
        "mappings": {
          "properties": {
              "content": {
                  "type": "text",
                  "analyzer": "aliws"
                }
            }
        }
      }

    以上樣本建立了一個名稱為index的索引,類型為fulltext(7.x版本為_doc)。包含了一個content屬性,類型為text,並添加了aliws分析器。

    預期結果如下。

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "index"
    }
  4. 執行如下命令,添加文檔。

    重要

    如下命令僅適用於Elasticsearch 7.0以下版本,7.0及以上版本需要將fulltext修改為_doc

    POST /index/fulltext/1
    {
      "content": "I like go to school."
    }

    以上樣本建立了名稱為1的文檔,並設定了文檔中的content欄位的內容為I like go to school.

    預期結果如下。

    {
      "_index": "index",
      "_type": "fulltext",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }
  5. 執行如下命令,查詢文檔。

    重要

    如下命令僅適用於Elasticsearch 7.0以下版本,7.0及以上版本需要將fulltext修改為_doc

    GET /index/fulltext/_search
    {
      "query": {
        "match": {
          "content": "school"
        }
      }
    }

    以上樣本在所有fulltext類型的文檔中,使用aliws分析器,搜尋content欄位中包含school的文檔。

    預期結果如下。

    {
      "took": 5,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "index",
            "_type": "fulltext",
            "_id": "2",
            "_score": 0.2876821,
            "_source": {
              "content": "I like go to school."
            }
          }
        ]
      }
    }
說明

如果您在使用analysis-aliws外掛程式時,得到的結果不符合預期,可通過下文的測試分析器測試分詞器排查調試。

配置詞庫

analysis-aliws外掛程式支援詞庫配置,即上傳自訂的詞典檔案aliws_ext_dict.txt。上傳後節點能自動載入詞典檔案,實現詞典的熱更新操作(不會觸發叢集重啟)。

重要
  • analysis-aliws外掛程式安裝後,系統不會內建預設詞典檔案aliws_ext_dict.txt,需要您手動上傳。

  • 在配置詞庫前,您需要先準備自訂的詞典檔案,並重新命名為aliws_ext_dict.txt

  • 詞典檔案的內容中不能包含隱藏符號,例如以空格結尾的分詞。

  1. 登入Elasticsearch控制台
  2. 在左側導覽列,單擊Elasticsearch執行個體
  3. 進入目標執行個體。
    1. 在頂部功能表列處,選擇資源群組和地區。
    2. Elasticsearch執行個體中單擊目標執行個體ID。
  4. 在左側導覽列,選擇配置與管理 > 外掛程式配置

  5. 系統預設外掛程式列表中,單擊analysis-aliws外掛程式右側操作列下的詞庫配置

  6. 詞庫配置頁面下方,單擊配置

  7. 選擇詞典檔案的上傳方式,並按照以下說明上傳詞典檔案。

    重要

    analysis-aliws外掛程式僅支援上傳一個詞典檔案,且檔案名稱必須為aliws_ext_dict.txt。如果您已經上傳了aliws_ext_dict.txt檔案並且需要更新詞典檔案,可單擊aliws_ext_dict.txt右側的x,刪除已上傳的aliws_ext_dict.txt詞典檔案並重新上傳同名詞典檔案。

    更新ALIWS分詞詞庫

    詞典檔案要求如下:

    • 檔案名稱:必須是aliws_ext_dict.txt。

    • 檔案格式:必須是UTF-8格式。

    • 內容:每行一個詞,前後不能有空白字元;需要使用UNIX或Linux的分行符號,即每行結尾是\n。如果是在Windows系統中產生的檔案,需要在Linux機器上使用dos2unix工具將詞典檔案處理後再上傳。

    您可以通過Text檔案添加OSS檔案兩種方式上傳詞典檔案:

    • Text檔案:單擊上傳txt檔案,選擇一個本地檔案進行上傳。

    • 添加OSS檔案:輸入Bucket名稱和檔案名稱,單擊添加

      請確保Bucket與Elasticsearch執行個體在同一地區下。且源端(OSS)的檔案內容發生變化後,需要重新上傳詞典檔案才會生效,不支援自動同步更新。

  8. 單擊儲存

    儲存後,不會觸發叢集重啟,但會觸發叢集變更使詞典檔案生效,此過程需要10分鐘左右。

    說明

    如果您需要擷取已經上傳過的詞庫檔案,可在配置前單擊對應檔案的下載按鈕表徵圖進行下載。

測試分析器

執行如下命令,測試aliws分析器。

GET _analyze
{
  "text": "I like go to school.",
  "analyzer": "aliws"
}

預期結果如下。

{
  "tokens" : [
    {
      "token" : "i",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "like",
      "start_offset" : 2,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "go",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "school",
      "start_offset" : 13,
      "end_offset" : 19,
      "type" : "word",
      "position" : 8
    }
  ]
}

測試分詞器

執行如下命令,測試aliws_tokenizer分詞器。

GET _analyze
{
  "text": "I like go to school.",
  "tokenizer": "aliws_tokenizer"
}

預期結果如下。

{
  "tokens" : [
    {
      "token" : "I",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : " ",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "like",
      "start_offset" : 2,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : " ",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "go",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : " ",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "word",
      "position" : 5
    },
    {
      "token" : "to",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "word",
      "position" : 6
    },
    {
      "token" : " ",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "word",
      "position" : 7
    },
    {
      "token" : "school",
      "start_offset" : 13,
      "end_offset" : 19,
      "type" : "word",
      "position" : 8
    },
    {
      "token" : ".",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "word",
      "position" : 9
    }
  ]
}

自訂分詞器構造說明

  • analysis-aliws外掛程式分詞完成後,還會經過filter處理,包括:去詞根filter、LowerCaseFilter、PorterStemFilter和StopFilter。如果您的自訂分詞器上也需要使用這些filter,可在自訂分詞器中加入analysis-aliws外掛程式的分詞器aliws_tokenizer,並根據業務需要增加filter配置,樣本如下。其中stopwords內可以添加您業務所需配置的停用詞。

    PUT my-index-000001
    {
      "settings": {
        "analysis": {
         "filter": {
          "my_stop": {
           "type": "stop",
           "stopwords": [
            " ",
            ",",
            ".",
            " ",
            "a",
            "的"
           ]
          }
         },
         "analyzer": {
          "my_custom_analyzer": {
           "type": "custom",
           "tokenizer": "aliws_tokenizer",
           "filter": [
            "lowercase",
            "porter_stem",
            "my_stop"
           ]
          }
         }
        }
        }
    }
    說明

    如果您不需要filter,可自行刪除filter配置。

  • aliws_tokenizer支援通過synonym構造自訂分詞器,配置方式與IK分詞器一致,詳細資料請參見使用同義字

常見問題

  • 使用aliws分詞器進行單詞分詞後,單詞結尾字母缺失。例如:對iPhoneChinese進行分詞得到的結果是Iphonchines,結尾的e沒有了。

    • 原因:aliws在分詞後有去詞根的filter操作,導致結尾的e被去掉了。

    • 解決方案:執行下面命令自訂analysis為:my_custom_analyzer,去掉filter部分。

      PUT my-index1
      {
          "settings": {
              "number_of_shards": 1,
              "analysis": {
                  "analyzer": {
                      "my_custom_analyzer": {
                          "type": "custom",
                          "tokenizer": "aliws_tokenizer"
                      }
                  }
              }
          }
      }
    • 驗證:執行如下命令,測試分詞效果是否符合預期。

      GET my-index1/_analyze
      {
          "analyzer": "my_custom_analyzer",
          "text": ["iphone"]
      }

相關文檔