字符過濾器
注意:字符過濾器用于在將字符流傳遞給分詞器之前對其進行預處理
html_strip HTML元素替換過濾器
此過濾器會替換掉HTML標簽,且會轉換HTML實體 如:& 會被替換為 &。
{
"tokenizer": "keyword",
"char_filter": [
"html_strip"
],
"text": "<p>I'm so <b>happy</b>!</p>"
}
解析結果:
[ \nI'm so happy!\n ]
因為是 p 標簽,所以有前后的換行符。如果使用<span>標簽就不會有換行符了。
可配參數說明
- escaped_tags
(可選,字符串數組)不包含尖括號 ( < >) 的 HTML 元素數組。當從文本中剝離 HTML 時,過濾器會跳過這些 HTML 元素。例如,設置 [ “p” ] 將會跳過 <p> HTML 元素。
自定義字符過濾器
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": [
"my_custom_html_strip_char_filter"
]
}
},
"char_filter": {
"my_custom_html_strip_char_filter": {
"type": "html_strip",
"escaped_tags": [
"b"
]
}
}
}
}
}
自定義字符過濾器 my_custom_html_strip_char_filter ,以 html_strip 過濾器為基礎,設置了跳過 b 標簽不過濾。
mapping 鍵值替換過濾器
配置鍵和值的映射,每當遇到與鍵相同的字符串時,它就會用與該鍵關聯(lián)的值替換它們
{
"tokenizer": "keyword",
"char_filter": [
{
"type": "mapping",
"mappings": [
"0 => 零",
"1 => 壹",
"2 => 貳",
"3 => 叁",
"4 => 肆",
"5 => 伍",
"6 => 陸",
"7 => 柒",
"8 => 捌",
"9 => 玖"
]
}
],
"text": "9527就是你的終身代號"
}
解析結果:
{
"tokens": [
{
"token": "玖伍貳柒就是你的終身代號",
"start_offset": 0,
"end_offset": 12,
"type": "word",
"position": 0
}
]
}
可配參數說明
- mappings
(必需*,字符串數組)映射數組,每個元素的形式為key => value. - mappings_path
(必需*,字符串)包含映射的文件的路徑key => value。
此路徑必須是絕對路徑或相對于config位置的路徑,并且文件必須是 UTF-8 編碼的。文件中的每個映射必須用換行符分隔。
以上兩個參數二選一即可。
pattern_replace 正則替換過濾器
{
"tokenizer": "keyword",
"char_filter": [
{
"type": "pattern_replace",
"pattern": "(\\d{3})(\\d{4})(\\d{4})",
"replacement":"$1****$3"
}
],
"text": "13199838273"
}
解析結果:
{
"tokens": [
{
"token": "131****8273",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 0
}
]
}
看到結果你就知道我們示例的作用了,關于寫法可以看看可配參數的說明。
可配參數說明
- pattern
必需,Java正則表達式。 - replacement
替換字符串,用 $1…$9來表示正則表達式匹配的內容。注意,我們的示例中每一個正則匹配都用了()括號擴起來。 - flags
Java 正則表達式標志。
常用分詞器
分析器只能配置一個分詞器,所以很多分詞器的名稱和分析器的名稱是一致的
標準分詞器
standard詞器提供基于語法的分詞(基于 Unicode 文本分割算法)并且適用于大多數語言。
POST _analyze
{
"tokenizer": "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 ]
如果仔細對比,你還是能發(fā)現和 standard 分析器處理結果的區(qū)別的。
我們來試試中文
{
"tokenizer": "standard",
"text": "我是中國人"
}
解析結果:
[我,是,中,國,人]
分詞是分詞了,但是貌似不符合我們的要求,關于中文的分詞我們后面再說。
可配參數說明
- max_token_length
單個詞語的最大長度。如果詞語長度超過該長度,則按max_token_length間隔將其拆分。默認為255。
自定義分詞器
PUT /person1
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "standard",
"max_token_length": 5
}
}
}
}
}
注意配置參數:我們配置了一個自定義的分詞器 my_tokenizer ,以 standard 為基礎類型,然后配置了一個自定義的分析器 my_analyzer,設置該分析器的分詞器為 my_tokenizer 。
letter 字母分詞器
只要遇到不是字母的字符,分詞器就會將文本分解。它對大多數歐洲語言都做得很好,但對一些亞洲語言來說就很糟糕,因為在這些語言中單詞沒有用空格分隔。
POST _analyze
{
"tokenizer": "letter",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
解析結果:
[ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone]
lowercase 小寫分詞器
其作用和 letter 分詞器一樣,只是會將字母轉換為小寫。此處我們就不貼示例了。
classic 經典分詞器
適用于英語文檔。此分詞器具有對首字母縮寫詞、公司名稱、電子郵件地址和 Internet 主機名進行特殊處理的啟發(fā)式方法。然而,這些規(guī)則并不總是有效,分詞器對除英語以外的大多數語言都不能很好地工作
POST _analyze
{
"tokenizer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone. email: abc@cormm.com"
}
解析結果:
{
"tokens": [
{
"token": "The",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "2",
"start_offset": 4,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "QUICK",
"start_offset": 6,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "Brown",
"start_offset": 12,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "Foxes",
"start_offset": 18,
"end_offset": 23,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "jumped",
"start_offset": 24,
"end_offset": 30,
"type": "<ALPHANUM>",
"position": 5
},
{
"token": "over",
"start_offset": 31,
"end_offset": 35,
"type": "<ALPHANUM>",
"position": 6
},
{
"token": "the",
"start_offset": 36,
"end_offset": 39,
"type": "<ALPHANUM>",
"position": 7
},
{
"token": "lazy",
"start_offset": 40,
"end_offset": 44,
"type": "<ALPHANUM>",
"position": 8
},
{
"token": "dog's",
"start_offset": 45,
"end_offset": 50,
"type": "<APOSTROPHE>",
"position": 9
},
{
"token": "bone",
"start_offset": 51,
"end_offset": 55,
"type": "<ALPHANUM>",
"position": 10
},
{
"token": "email",
"start_offset": 57,
"end_offset": 62,
"type": "<ALPHANUM>",
"position": 11
},
{
"token": "abc@cormm.com",
"start_offset": 64,
"end_offset": 77,
"type": "<EMAIL>",
"position": 12
}
]
}
關于與 standard 分詞器的區(qū)別,可以自行驗證一下。
可配參數說明
- max_token_length
單個詞語的最大長度。如果詞語長度超過該長度,則按max_token_length間隔將其拆分。默認為255。
path_hierarchy 路徑層次分詞器
POST _analyze
{
"tokenizer": "path_hierarchy",
"text": "/one/two/three"
}
解析結果:
[ /one, /one/two, /one/two/three ]
可配參數說明
- delimiter
用作路徑分隔符的字符。默認為 / - replacement
用于分隔符的可選替換字符。默認為delimiter. - buffer_size
單次讀取到術語緩沖區(qū)的字符數。默認為1024. 術語緩沖區(qū)將按此大小增長,直到所有文本都被消耗掉。建議不要更改此設置。 - reverse:是否反轉,默認為false。
- skip
要跳過的初始標記數。默認為0.
示例2
拆分 - 字符,并將它們替換為 / 并跳過前兩個標記
PUT /person1
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "path_hierarchy",
"delimiter": "-",
"replacement": "/",
"skip": 2
}
}
}
}
}
{
"analyzer": "my_analyzer",
"text": "one-two-three-four-five"
}
解析結果:
[ /three, /three/four, /three/four/five ]
如果設置 reverse 為 true
[ one/two/three/, two/three/, three/ ]
uax_url_email 電子郵件分詞器
{
"tokenizer": "uax_url_email",
"text": "Email me at john.smith@global-international.com"
}
解析結果:
[ Email, me, at, john.smith@global-international.com ]
可配參數說明
- max_token_length
單個詞語的最大長度。如果詞語長度超過該長度,則按max_token_length間隔將其拆分。默認為255。
令牌過濾器
令牌過濾器,是在標記之后執(zhí)行。es 提供的令牌過濾器非常多,我們只列一些可能會有用的來說一說。
uppercase 大寫過濾器
{
"tokenizer" : "standard",
"filter" : ["uppercase"],
"text" : "the Quick FoX JUMPs"
}
解析結果
[ THE, QUICK, FOX, JUMPS ]
lowercase 小寫過濾器
{
"tokenizer" : "standard",
"filter" : ["lowercase"],
"text" : "THE Quick FoX JUMPs"
}
解析結果:
[ the, quick, fox, jumps ]
stemmer 詞干過濾器
{
"tokenizer": "standard",
"filter": [ "stemmer" ],
"text": "fox running and jumping jumped"
}
解析結果:
[ fox, run, and, jump, jump ]
注意標記提取了詞干。比如:jumping 和 jumped 提取為了 jump 。
可配參數說明
- language
(可選,字符串)用于詞干標記的依賴于語言的詞干提取算法。可以設置很多語言,我們常用的也就 english(默認:英語)german 德語、spanish 西班牙語等等,但還是不包括中文。
stop 停用詞過濾器
該過濾器默認將如下詞語作為停用詞:
a, an, and, are, as, at, be, but, by, for, if, in, into, is,
it, no, not, of, on, or, such, that, the, their, then, there,
these, they, this, to, was, will, with
{
"tokenizer": "standard",
"filter": [ "stop" ],
"text": "a quick fox jumps over the lazy dog"
}
解析結果:
[ quick, fox, jumps, over, lazy, dog ]
cjk_bigram 中日韓雙字母標記過濾器
此過濾器支持中日韓的文字,但標記只對文字進行兩兩組合,嚴格上說對中文的支持也不是十分好。
{
"tokenizer" : "standard",
"filter" : ["cjk_bigram"],
"text" : "我們都是中國人"
}
解析結果:文章來源:http://www.zghlxwxcb.cn/news/detail-481271.html
{
"tokens": [
{
"token": "我們",
"start_offset": 0,
"end_offset": 2,
"type": "<DOUBLE>",
"position": 0
},
{
"token": "們都",
"start_offset": 1,
"end_offset": 3,
"type": "<DOUBLE>",
"position": 1
},
{
"token": "都是",
"start_offset": 2,
"end_offset": 4,
"type": "<DOUBLE>",
"position": 2
},
{
"token": "是中",
"start_offset": 3,
"end_offset": 5,
"type": "<DOUBLE>",
"position": 3
},
{
"token": "中國",
"start_offset": 4,
"end_offset": 6,
"type": "<DOUBLE>",
"position": 4
},
{
"token": "國人",
"start_offset": 5,
"end_offset": 7,
"type": "<DOUBLE>",
"position": 5
}
]
}
除去我們以上介紹的,ES 的令牌過濾器還有很多,我們就不過多說明了,因為他們大多數都是不支持中文的。文章來源地址http://www.zghlxwxcb.cn/news/detail-481271.html
到了這里,關于Elasticsearch 文本分析器(下)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!