Elasticsearch 内置分析器Analyzer
java學習討論群:725562382?
?
無論是內置的分析器(analyzer),還是自定義的分析器(analyzer),都由三種構件塊組成的:character filters?,?tokenizers?,?token filters。
內置的analyzer將這些構建塊預先打包到適合不同語言和文本類型的analyzer中。
Character filters (字符過濾器)
字符過濾器以字符流的形式接收原始文本,并可以通過添加、刪除或更改字符來轉換該流。
舉例來說,一個字符過濾器可以用來把阿拉伯數字(????????????)?轉成成Arabic-Latin的等價物(0123456789)。
一個分析器可能有0個或多個字符過濾器,它們按順序應用。
(PS:類似Servlet中的過濾器,或者攔截器,想象一下有一個過濾器鏈)
Tokenizer (分詞器)
一個分詞器接收一個字符流,并將其拆分成單個token (通常是單個單詞),并輸出一個token流。例如,一個whitespace分詞器當它看到空白的時候就會將文本拆分成token。它會將文本“Quick brown fox!”轉換為[Quick, brown, fox!]
(PS:Tokenizer 負責將文本拆分成單個token ,這里token就指的就是一個一個的單詞。就是一段文本被分割成好幾部分,相當于Java中的字符串的 split )
分詞器還負責記錄每個term的順序或位置,以及該term所表示的原單詞的開始和結束字符偏移量。(PS:文本被分詞后的輸出是一個term數組)
一個分析器必須只能有一個分詞器
Token filters (token過濾器)
token過濾器接收token流,并且可能會添加、刪除或更改tokens。
例如,一個lowercase token filter可以將所有的token轉成小寫。stop token filter可以刪除常用的單詞,比如 the 。synonym token filter可以將同義詞引入token流。
不允許token過濾器更改每個token的位置或字符偏移量。
一個分析器可能有0個或多個token過濾器,它們按順序應用。
小結&回顧
- analyzer(分析器)是一個包,這個包由三部分組成,分別是:character filters (字符過濾器)、tokenizer(分詞器)、token filters(token過濾器)
- 一個analyzer可以有0個或多個character filters
- 一個analyzer有且只能有一個tokenizer
- 一個analyzer可以有0個或多個token filters
- character filter 是做字符轉換的,它接收的是文本字符流,輸出也是字符流
- tokenizer 是做分詞的,它接收字符流,輸出token流(文本拆分后變成一個一個單詞,這些單詞叫token)
- token filter 是做token過濾的,它接收token流,輸出也是token流
- 由此可見,整個analyzer要做的事情就是將文本拆分成單個單詞,文本 ---->? 字符? ---->? token
?
這有點類似攔截器
1.? 測試分析器
analyze API 是一個工具,可以幫助我們查看分析的過程。(PS:類似于執行計劃)
curl -X POST "192.168.0.120:9200/_analyze" -H 'Content-Type: application/json' -d' {"analyzer": "whitespace","text": "The quick brown fox." } '返回: {"tokens" : [{"token" : "The","start_offset" : 0,"end_offset" : 3,"type" : "word","position" : 0},{"token" : "quick","start_offset" : 4,"end_offset" : 9,"type" : "word","position" : 1},{"token" : "brown","start_offset" : 10,"end_offset" : 15,"type" : "word","position" : 2},{"token" : "fox.","start_offset" : 16,"end_offset" : 20,"type" : "word","position" : 3}] }?
curl -X POST "192.168.0.120:9200/_analyze" -H 'Content-Type: application/json' -d' {"tokenizer": "standard","filter": [ "lowercase", "asciifolding" ],"text": "Is this déja vu?" } '返回: {"tokens" : [{"token" : "is","start_offset" : 0,"end_offset" : 2,"type" : "<ALPHANUM>","position" : 0},{"token" : "this","start_offset" : 3,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "deja","start_offset" : 8,"end_offset" : 12,"type" : "<ALPHANUM>","position" : 2},{"token" : "vu","start_offset" : 13,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 3}] }?
可以看到,對于每個term,記錄了它的位置和偏移量
?
2.? Analyzer
2.1.? 配置內置的分析器
內置的分析器不用任何配置就可以直接使用。當然,默認配置是可以更改的。例如,standard分析器可以配置為支持停止字列表:
curl -X PUT "192.168.0.120:9200/my_index" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {"analyzer": {"std_english": { "type": "standard","stopwords": "_english_"}}}},"mappings": {"_doc": {"properties": {"my_text": {"type": "text","analyzer": "standard", "fields": {"english": {"type": "text","analyzer": "std_english" }}}}}} } '在這個例子中,我們基于standard分析器來定義了一個std_englisth分析器,同時配置為刪除預定義的英語停止詞列表。后面的mapping中,定義了my_text字段用standard,my_text.english用std_english分析器。因此,下面兩個的分詞結果會是這樣的:
curl -X POST "192.168.0.120:9200/my_index/_analyze" -H 'Content-Type: application/json' -d' {"field": "my_text", "text": "The old brown cow" } ' curl -X POST "192.168.0.120:9200/my_index/_analyze" -H 'Content-Type: application/json' -d' {"field": "my_text.english", "text": "The old brown cow" } '第一個由于用的standard分析器,因此分詞的結果是:[ the, old, brown, cow ]
第二個用std_english分析的結果是:[ old, brown, cow ]
2.2.??Standard Analyzer (默認)
如果沒有特別指定的話,standard 是默認的分析器。它提供了基于語法的標記化(基于Unicode文本分割算法),適用于大多數語言。
例如:
curl -X POST "192.168.0.120:9200/_analyze" -H 'Content-Type: application/json' -d' {"analyzer": "standard","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone." } '上面例子中,那段文本將會輸出如下terms:
[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]2.2.1.? 配置
標準分析器接受下列參數:
- max_token_length? :? 最大token長度,默認255
- stopwords? :??預定義的停止詞列表,如_english_?或 包含停止詞列表的數組,默認是?_none_
- stopwords_path? :? 包含停止詞的文件路徑
2.2.2.? 示例配置
curl -X PUT "192.168.0.120:9200/my_index" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {"analyzer": {"my_english_analyzer": {"type": "standard","max_token_length": 5,"stopwords": "_english_"}}}} } ' curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d' {"analyzer": "my_english_analyzer","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone." } '以上輸出下列terms:
[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]2.2.3.? 定義
standard分析器由下列兩部分組成:
Tokenizer
- Standard Tokenizer
Token Filters
- Standard Token Filter
- Lower Case Token Filter
- Stop Token Filter (默認被禁用)
你還可以自定義
curl -X PUT "192.168.0.120:9200/standard_example" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {"analyzer": {"rebuilt_standard": {"tokenizer": "standard","filter": ["lowercase" ]}}}} } '2.3.??Simple Analyzer
?simple 分析器當它遇到只要不是字母的字符,就將文本解析成term,而且所有的term都是小寫的。例如:
curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d' {"analyzer": "simple","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone." } '輸入結果如下:
[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]?
總結
以上是生活随笔為你收集整理的Elasticsearch 内置分析器Analyzer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 执行work count程序报错Coul
- 下一篇: STM32开发 -- 烧写/启动模式