1. 程式人生 > >Elasticsearch 自定義分析器 analyzer API 檢視文字內容如何被分析

Elasticsearch 自定義分析器 analyzer API 檢視文字內容如何被分析

Elasticsearch內建了一系列分析器,但是ES支援自定義分析器。

通過在配置檔案中組合字元過濾器,分詞器和表徵過濾器可以滿足特定資料的要求。

分析器是三個順序執行的元件的結合(字元過濾器、分詞器、表徵過濾器)

  • 字元過濾器(char_filter):

讓字串在被分詞前變得更加“整潔”。

如,html_strip 字元過濾器可刪除所有的HTML標籤諸如<p>或<div>,並可將HTML實體轉換成對應的Unicode字元,如將 &Aacute; 轉成 A 。

  • 分詞器(filter):

將字串分割成單獨的詞(terms)或表徵(tokens)。如:

standard分詞器將字串分割成單獨的字詞,刪除大部分標點符號;

keyword分詞器輸出和它接收到的相同的字串,不做任何分詞處理;

whitespace分詞器只通過空格來分割文字;

pattern分詞器可通過正則表示式分割文字。

  • 表徵過濾器(analyzer):

分詞結果的表徵流根據各自情況傳遞給特定表徵過濾器。

表徵過濾器可能修改,新增或刪除表徵。如:

lowercase表徵過濾器將大寫轉換為小寫;

stop表徵過濾器刪除特定表徵;

stemmer表徵過濾器將單詞轉化為它們的根形態(root form);

ascii_folding表徵過濾器刪除變音符合(如從 très 轉為 tres );

ngram和edge_ngram可讓表徵更適合特殊匹配情況或自動完成。

建立自定義分析器 my_analyzer :

在 analysis 欄位下配置字元過濾器、分詞器和表徵過濾器:

PUT /my_index
{
   "settings":{
     "analysis":{
       "char_filter":{ ... custom character filters ... },
       "tokenizer":{ ... custom tokenizers ... },
       "filter":{ ... custom token  filter ... },
       "analyzer":{ ... custom analyzers ... }
     }
  }
}

我們將配置一個這樣的分析器:

1.用 html_strip 字元過濾器去除所有的 HTML 標籤;

2.將 & 替換成 and ,將 # 替換成 four ,使用一個自定義的 mapping 字元過濾器;

3.使用 standard 分詞器分割單詞;

4.使用 lowercase 表徵過濾器將詞轉為小寫;

5.用 stop 表徵過濾器去除自定義停用詞。

DELETE es_analyzer_test

PUT es_analyzer_test
{
  "settings": {
    "analysis": {
      "char_filter": {
        "char_filter_test":{
          "type":"mapping",
          "mappings":["&=>and","#=>four"]
        }
      },
      "filter": {
        "my_stopwords":{
          "type":"stop",
          "stopwords":["the","a","and","stop"]
        }
      },
      "analyzer": {
        "my_analyzer":{
          "type":"custom",
          "char_filter":["html_strip","char_filter_test"],
          "tokenizer":"standard",
          "filter":["lowercase","my_stopwords"]
        }
      }
    }
  }
}

測試分詞器是否達到預期目標:

GET es_analyzer_test/_analyze
{
  "text": ["HELLO & # the a stop world"],
  "analyzer": "my_analyzer"
}

相應結果如下:

{
  "tokens": [
    {
      "token": "hello",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "four",
      "start_offset": 8,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "world",
      "start_offset": 21,
      "end_offset": 26,
      "type": "<ALPHANUM>",
      "position": 6
    }
  ]
}

 達成我們預期目標。