1. 程式人生 > 其它 >ElasticSearch Analyzer 分析器

ElasticSearch Analyzer 分析器

目錄

簡介


做全文搜尋就需要對文件分析、建索引。從文件中提取詞元(Token)的演算法稱為分詞器(Tokenizer),在分詞前預處理的演算法稱為字元過濾器(Character Filter),進一步處理詞元的演算法稱為詞元過濾器(Token Filter),最後得到詞(Term)。這整個分析演算法稱為分析器(Analyzer)。

分析器有3部分構成:

  • character filters
    (字元過濾器)
    :對原始文字進行加工操作,為後續的分詞做準備;
  • tokenizers(分詞器):字串被分詞器分為單個的詞條。一個簡單的分詞器遇到空格和標點的時候,可能會將文字拆分成詞條;
  • token filters(分詞過濾器):接收分詞器的處理結果,並可以將切分好的詞語進行加工和修改,進而對分詞結果進行規範化、統一化和優化處理。

Analyzer處理流程:

Analyzer按順序做三件事:

  1. 使用CharacterFilter過濾字元;
  2. 使用Tokenizer分詞;
  3. 使用TokenFilter過濾詞。

DEMO

PUT /common_index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "common_analyzer": {                // 自定義分析器
                    "char_filter": ["html_strip"],  // 字元過濾器
                    "tokenizer": "standard",        // 分詞器
                    "filter": ["lowercase"]         // 分詞過濾器
                }
            }
        }
    }
}

它完成以下工作:

  1. 使用html_strip字元過濾器,移除html標籤;
  2. 使用standard分詞器分詞;
  3. 使用lowercase詞過濾器,轉為小寫單詞。

character filters(字元過濾器)

字元過濾器是分析器處理文字資料的第一道工序,它接收原始的字元流,對原始字元流中的字元進行新增、刪除或者轉換操作,進而改變原始的字元流。

ES內建的字元過濾器:

名稱 功能
對映關係字元過濾器 根據配置的對映關係替換字元
HTML擦除過濾器 去掉HTML元素
正則表示式替換過濾器 用正則表示式處理字串

tokenizers(分詞器)

分詞器對文字進行切分後,需要保留詞語與原始文字之間的對應關係,因此分詞器還負責記錄每個Token的位置,以及開始和結束的字元偏移量。

ES內建的分詞器:

名稱 功能
標準分詞器 對英文分詞時,基於語法分詞;對中文分詞時,切分成單字
字母分詞器 使用非字母的字元作為分詞標記
小寫分詞器 功能上等同於字母分詞器,並且把所有分詞結果轉換為小寫形式
空格分詞器 使用空格作為分詞標記

token filters(分詞過濾器)

ES內建的分詞過濾器:

名稱 功能
Lower Case過濾器 將所有字母轉換成小寫形式
Stop Token過濾器 將停用詞從分詞結果中移除
同義詞分詞過濾器 為分詞結果新增同義詞

分析器的使用


測試分析API

通過analyze檢視搜尋關鍵詞的分析結果:

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "測試結果"
}

執行結果:

{
  "tokens" : [
    {
      "token" : "測試",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "結果",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}

自定義分析器

手機號分詞器:

PUT /mobile_index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "digits_only": {
          "type": "pattern_replace",
          "pattern": "[^\\d]"
        }
      },
      "tokenizer": {
        "comm_number_tokenizer": {
          "type": "ngram",
          "token_chars": [
            "digit"
          ],
          "min_gram": "4",
          "max_gram": "5"
        }
      },
      "analyzer": {
        "number_analyzer": {
          "char_filter": "digits_only",
          "tokenizer": "comm_number_tokenizer"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "phone_number": {
        "type": "text",
        "analyzer": "number_analyzer"
      }
    }
  }
}

參考資料

Analyzing U.S. Phone Numbers In Elasticsearch

認識 ElasticSearch Analyzer 分析器

elasticsearch對身份證號碼的處理(ngarm分詞或者pipeline)