elasticsearch 分析器-analyzers

目錄

摘要:

 

一:認識analyzers三大組件 

1.Character filters (字符過濾器)

2.Tokenizer (分詞器)

3.Token filters (token過濾器)

 二:各種分析器Analyzer 介紹

2.1Standard Analyzer(標準分析器)

    2.11拓展標準分析器的語法

2.12 自定義分析器的語法

2.2Simple Analyzer

2.21Simple Analyzer組成

 2.3Whitespace Analyzer

2.3.1 Whitespace Analyzer 組成

2.4Stop Analyzer

Configuration

 2.4.1其組成部分

2.4.2用戶自定義

2.5Keyword Analyzer

2.5.1keyword analyzer組成部分

2.5.2 keyword analyzer自定義

2.6Pattern Analyzer

2.6.1組成部分

2.6.2可拓展支持的參數

 

2.6.3拓展例子

2.6.4用戶自定義

2.7 Fingerprint Analyzer

2.7.1 拓展參數

2.7.2 拓展語法

 2.7.3組成部分

2.7.4自定義語法

2.8 Custom Analyzer(用戶自定義分析器)

2.8.1 自定義分析器的組成

2.9自定義語法兩個例子



 

摘要:

   本人最近頻繁用到Elasticsearch 分析器,因此準備將官網所講解的整個模塊的內容做一個詳細的整理,翻譯,測試!整個過程可能會持續比較長的時間,因此這篇文章會持續更新,一方面是爲了做筆記,一方面方便大家查看。首先要了解什麼是分析器,es的分析器由三部分組成,分別: 

Character filters (字符過濾器)Tokenizer (分詞器)  Token filters (token過濾器)

 

一:認識analyzers三大組件 

1.Character filters (字符過濾器)

字符過濾器以字符流的形式接收原始文本,並可以通過添加、刪除或更改字符來轉換該流。

舉例來說,一個字符過濾器可以用來把阿拉伯數字(٠‎١٢٣٤٥٦٧٨‎٩)‎轉成成Arabic-Latin的等價物(0123456789)。

一個分析器可能有0個或多個字符過濾器,它們按順序依次生效。功能是針對流入的字符流進行預處理。


2.Tokenizer (分詞器)

分詞器接收被Character filters 預處理後的字符流,並將其拆分成單個token (通常是單個單詞),同時生成詞頻信息,以及隨影詞頻搜索的索引信息,這其實就是es搜索的核心。這部分工作是luence完成的,簡單來說有了詞項term  詞頻才能生成可以被檢索的數據結構。


3.Token filters (token過濾器)

token過濾器接收的是被Tokenizer (分詞器)分好的字符流,針對分詞器處理後的一個個的單詞,token filter可以進一步處理,並且可能會添加、刪除或更改tokens。對於搜索來說沒社麼價值的單詞就可以在這裏被去掉,比如說  a an  the  等等。另外,一個lowercase token filter可以將所有的token轉成小寫。stop token filter可以刪除常用的單詞,比如 the 。synonym token filter可以將同義詞引入token流。  所以說傳入es中的數據經過Character filters (字符過濾器)>Tokenizer (分詞器)>Token filters (token過濾器)  之後纔會正式的去生成索引結構。下面粘貼一下官網的一個例子,你可以先熟悉一下,首先說明一點,analyzers要在setting中進行設置。


//analysis屬性中可以添加多個分析器analyzer,在我們下面的例子中只有一個
//仔細想想就知道,我們可以讓不同的字段用不同的分析器analyzer,每一個analyzer都有一個唯一的名字。
//下面的analyzer的名字是std_folded,這個名字就是可以在其他字段引用的唯一標識。
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_folded": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type": "text",
        "analyzer": "std_folded" 
      }
    }
  }
}

GET my_index/_analyze 
{
  "analyzer": "std_folded", 
  "text":     "Is this déjà vu?"
}

GET my_index/_analyze 
{
  "field": "my_text", 
  "text":  "Is this déjà vu?"
}

 


 二:各種分析器Analyzer 介紹

2.1Standard Analyzer(標準分析器)

    standard分析器是默認分析器,如果未指定,則使用該分析器,適用於大多數語言。分割算法用的是http://unicode.org/reports/tr29/,有興趣的讀者可以去了解,我大概看了一下比較複雜。通俗來說就是以非字符未邊界進行string的切割。

standard 由下面組成:

Tokenizer

Token Filters

    2.11拓展標準分析器的語法

    拓展語法,是針對已有的分析器,對其默認的屬性進行一個更改,主要參數是:

  •     type  指定要拓展的分析器是什麼分析器
  • 該分析器的系統自帶的參數: 語法爲: param:值
POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出結果爲:[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

              所述standard分析器的自帶參數爲:

max_token_length

最大term長度。如果看到term超過此長度,則將其max_token_length間隔分割。默認爲255

stopwords

預定義的停用詞列表,例如_english_或包含停用詞列表的數組。默認爲_none_。默認情況下,沒有停用詞。我們可以在自定義analyzer的時候對stardard analyzer進行拓展,下面的例子展示了這樣的用法。

stopwords_path

包含停用詞的文件的路徑。

 

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard",
          "max_token_length": 5,
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_english_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
Copy as cURL
View in Console
 
#可以看到拓展了standard analyzer之後,the 這個英文單詞被"stopwords": "_english_"幹掉了:

[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]

 

2.12 自定義分析器的語法

自定義語法:分析器有三個模塊,你可以自定義就行了,看下面的例子

PUT /standard_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_standard": {          ---》這是自定義的分析器的name
          "tokenizer": "standard",     ---》這是token分詞器
          "filter": [                  ---》這是token詞項過濾器可以有多個
            "lowercase"       
          ]
        }
      }
    }
  }
}

//  分析器三大組件   字符過濾器   token分詞器   token 詞項過濾器

 2.13 standard Analyze組成部分

Tokenizer

Token Filters

2.2Simple Analyzer

simple分析器遇到非字母的字符時,它會將文本分解爲多個詞。所有術語均小寫。該simple分析儀是不支持拓展配置。也就是說下面用type參數拓展simple分析器是無效的。這一點要注意,注意看下面的例子:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "simple"
        }
      }
    }
  }
}

//雖然不支持拓展,但是支持自定義,下面是正確的自定義方式

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "tokenzer": "lowercase"
        }
      }
    }
  }
}
//當tokerzer爲 lowercase其實就是simple Analyzer分析器的自定義,因爲simple Analyzer的組成部分就是lowercase  tokenzer

2.21Simple Analyzer組成

simple Analyzer組成部分如下:

Tokenizer

 2.3Whitespace Analyzer

Whitespace Analyzer用空格分割string生成詞項,該whitespace分析儀是和simple Analyzer一樣都是不可拓展的,但是可以自定義,語法如下。

PUT /whitespace_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_whitespace": {
          "tokenizer": "whitespace",
          "filter": [         
          ]
        }
      }
    }
  }
}

2.3.1 Whitespace Analyzer 組成

Tokenizer

2.4Stop Analyzer

stop Analyzer和simple分析 基本一樣,但增加了對stopwords。默認情況下使用 _english_停用詞.且支持拓展和自定義,拓展參數如下。(自定義和拓展其實大概意思一樣,都是定義生成一個新的analyzer,只是前者事通過type  和參數拓展,後者事根據其組成部分的組件自定義。若你看不懂這句話,可以多看看想想)

Configuration

The stop analyzer accepts the following parameters:

stopwords

A pre-defined stop words list like _english_ or an array containing a list of stop words. Defaults to _english_.

stopwords_path

The path to a file containing stop words. This path is relative to the Elasticsearch config directory.

下面是拓展案例:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

#下面是結果:

[ quick, brown, foxes, jumped, lazy, dog, s, bone ]

 2.4.1其組成部分

It consists of:

Tokenizer

Token filters

simple Analyser 只包含 Lower Case Tokenizer,stop Analyzer 除了包含Lower Case Tokenizer之外,還有Stop Token Filter

2.4.2用戶自定義

PUT /stop_example
{
  "settings": {
    "analysis": {
      "filter": {#這是自定義的filter 後面再講解
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "tokenizer": "lowercase",
          "filter": [  #使用自定義的toker filter,這是一個數組可以有多個
            "english_stop"          
          ]
        }
      }
    }
  }
}

#The default stopwords can be overridden with the stopwords or stopwords_path parameters.


#You’d add any token filters after english_stop.

2.5Keyword Analyzer

 

keyword分析器是“ noop ”分析器,不支持拓展沒有額外拓展參數,但是支持自定義。它將整個輸入字符串作爲單個令牌返回。 也就是說對你輸入的字符串,在生成索引token的時候,不會做任何處理,也就是說,你輸入的是  "welcom beijing",在以前的時候生成兩個詞項,“welcom"  "beiijing",現在只會生成一個詞項“welcom beijing”,也就是說在任何時候你搜索的時候只搜索“welcom”,或者是“beijing”的時候根本不可能搜索出來,因爲底層索引的是“welcom beijing” 。這種分析器適用於精確索引某一個字段,提供精準搜索。

2.5.1keyword analyzer組成部分

The keyword analyzer consists of:

Tokenizer

2.5.2 keyword analyzer自定義

PUT /keyword_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": [         
          ]
        }
      }
    }
  }
}

2.6Pattern Analyzer

pattern分析儀使用一個正則表達式的分析儀。正則表達式默認爲\W+(或所有非單詞字符),正則分析器支持拓展也支持自定義。這個功能是解決特殊情況下的分此,我就遇到過。比如你想用“/”或者是任何空白字符,包括空格、製表符、換頁符等等進行分詞設置,那麼就可以自定義如下。


PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "[/\\s]", 
          "lowercase": true
        }
      }
    }
  }
}

2.6.1組成部分

Tokenizer

Token Filters

2.6.2可拓展支持的參數

 

pattern

Java regular expression, defaults to \W+.

flags

Java regular expression flags. Flags should be pipe-separated, eg "CASE_INSENSITIVE|COMMENTS".

lowercase

Should terms be lowercased or not. Defaults to true.

stopwords

A pre-defined stop words list like _english_ or an array containing a list of stop words. Defaults to _none_.

stopwords_path

The path to a file containing stop words.

2.6.3拓展例子

 

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "\\W|_", 
          "lowercase": true
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_email_analyzer",
  "text": "[email protected]"
}

The above example produces the following terms:

[ john, smith, foo, bar, com ]

2.6.4用戶自定義

PUT /pattern_example
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "split_on_non_word": {
          "type":       "pattern",
          "pattern":    "\\W+" 
        }
      },
      "analyzer": {
        "rebuilt_pattern": {
          "tokenizer": "split_on_non_word",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}

2.7 Fingerprint Analyzer

輸入文本是小寫的,經過規範化以刪除擴展的字符,經過排序,重複數據刪除並將其組合爲單個標記。如果配置了停用詞列表,停用詞也將被刪除。支持拓展也支持自定義。

2.7.1 拓展參數

所述fingerprint分析器接受以下參數:

separator

用於連接術語的字符。默認爲空格。

max_output_size

發出的最大令牌大小。默認爲255。大於此大小的令牌將被丟棄。

stopwords

預定義的停用詞列表,例如_english_或包含停用詞列表的數組。默認爲_none_

stopwords_path

包含停用詞的文件的路徑。

2.7.2 拓展語法

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_fingerprint_analyzer": {
          "type": "fingerprint",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_fingerprint_analyzer",
  "text": "Yes yes, Gödel said this sentence is consistent and."
}


 
The above example produces the following term:

[ consistent godel said sentence yes ]

 2.7.3組成部分

Tokenizer

Token Filters (in order)

2.7.4自定義語法

PUT /fingerprint_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_fingerprint": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding",
            "fingerprint"
          ]
        }
      }
    }
  }
}

2.8 Custom Analyzer(用戶自定義分析器)

上面的各種分析器基本也都講解的自定義的語法,現在來系統講一下自定義分析器的詳細知識。

2.8.1 自定義分析器的組成

2.9自定義語法兩個例子

 

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard", --》要素1
          "char_filter": [         --》要素2
            "html_strip"
          ],
          "filter": [              --》要素3
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": "Is this <b>déjà vu</b>?"
}

分析器的三大要素:character  filter >>tokenizer>>token filter
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": { 
          "type": "custom",
          "char_filter": [
            "emoticons"
          ],
          "tokenizer": "punctuation",
          "filter": [
            "lowercase",
            "english_stop"
          ]
        }
      },
      "tokenizer": {
        "punctuation": { 
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "char_filter": {
        "emoticons": { 
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "filter": {
        "english_stop": { 
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}


POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":     "I'm a :) person, and you?"
}


The above example produces the following terms:

[ i'm, _happy_, person, you ]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章