目錄
摘要:
本人最近頻繁用到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
- Standard Tokenizer(標準分詞器)
Token Filters
- Lower Case Token Filter(將詞項term全部轉化爲小寫)
- Stop Token Filter (disabled by default)(默認沒有開啓停用詞)
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
分析器的自帶參數爲:
|
最大term長度。如果看到term超過此長度,則將其 |
|
預定義的停用詞列表,例如 |
|
包含停用詞的文件的路徑。 |
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
- Lower Case Token Filter
- Stop Token Filter (disabled by default)
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:
|
A pre-defined stop words list like |
|
The path to a file containing stop words. This path is relative to the Elasticsearch |
下面是拓展案例:
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
- Lower Case Token Filter
- Stop Token Filter (disabled by default)
2.6.2可拓展支持的參數
|
A Java regular expression, defaults to |
|
Java regular expression flags. Flags should be pipe-separated, eg |
|
Should terms be lowercased or not. Defaults to |
|
A pre-defined stop words list like |
|
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
分析器接受以下參數:
|
用於連接術語的字符。默認爲空格。 |
|
發出的最大令牌大小。默認爲 |
|
預定義的停用詞列表,例如 |
|
包含停用詞的文件的路徑。 |
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)
- Lower Case Token Filter
- ASCII Folding Token Filter
- Stop Token Filter (disabled by default)
- Fingerprint Token Filter
2.7.4自定義語法
PUT /fingerprint_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_fingerprint": {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding",
"fingerprint"
]
}
}
}
}
}
2.8 Custom Analyzer(用戶自定義分析器)
上面的各種分析器基本也都講解的自定義的語法,現在來系統講一下自定義分析器的詳細知識。
2.8.1 自定義分析器的組成
- zero or more character filters
- a tokenizer
- zero or more token filters.
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 ]