999 - Elasticsearch Analysis 01
阿新 • • 發佈:2019-12-31
簡介
Analysis在建立索引或搜尋時指定,將文字解析成倒排索引
,以供搜尋。
簡單解釋下倒排索引:通常書本的目錄就是正排索引
,根據目錄找章節;而倒排索引
就是根據內容(例如一個單詞)找所在的章節。
Analyzer
analyzer
,內建或自定義,是一個包含三個構建塊(依次為character filters
,tokenizers
,token filters
)的包。
例如:一個內建的english
analyzer在轉換句子The QUICK brown foxes jumped over the lazy dog!
時:
- 轉為小寫。
- 刪除對搜尋無意義的詞元:the(停止詞,
stopwords
- 歸納詞幹,例如:foxes → fox,jumped → jump,lazy → lazi。
- 最後新增這些條件到倒排索引中:[quick,brown,fox,jump,over,lazi,dog]。
- 當查詢時,可以查詢
"a query fox"
,雖然該字串不在原文字中,但當使用了同樣的analyzer
時,該句子中的單詞與倒排索引中的詞元可以匹配上。
Character filters
- 接收字元流,通過新增、刪除、修改字元來轉換字元流。
- 例如從流中去掉
<b>
這樣的HTML元素。 - 可以有0或多個,按照設定的順序呼叫。
Tokenizer
- 接收一個字元流,分解為詞元,然後輸出詞元流。
- 例如,
whitespace
tokenizer就會把所有的空白符去掉,"Quick brown fox!"
就會被分解成詞元:[Quick,fox!]
。 - 同時Tokenizer負責記錄每個詞元的順序或位置,以及原單詞的起始結束字元偏移量。
- 必須而且只能有一個Tokenizer。
Token filters
- 接收詞元流,可以新增、刪除、修改詞元。
- 例如:
lowercase
token filter將所有的詞元轉為小寫,stop
token filter刪除掉停止詞,synonym
toekn filter將引入同義詞到詞元流中。 - Token filter不可以改變每個詞元的位置或字元偏移量。
- 可以有0或多個,按照設定的順序呼叫。
測試analyzers
可以在請求體中指定analyzer(或者tokenizer、token filter、Character Filter),
GET _analyze
{
"analyzer": "whitespace","text": "The quick brown fox."
}
GET _analyze
{
"analyzer": "english","text": "The QUICK brown foxes jumped over the lazy dog!"
}
GET _analyze
{
"tokenizer": "whitespace","filter": ["lowercase","stop"],"text": "The QUICK brown foxes jumped over the lazy dog!"
}
複製程式碼
從上面第二個的返回結果中可以看到位置和起始結束字元偏移量
offset
:詞項邊界,用於高亮查詢。
position
:在檔案中的位置,用於保證詞語查詢的詞語的順序。
{
"tokens" : [
{
"token" : "quick","start_offset" : 4,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 1
},{
"token" : "brown","start_offset" : 10,"end_offset" : 15,"position" : 2
},{
"token" : "fox","start_offset" : 16,"end_offset" : 21,"position" : 3
},{
"token" : "jump","start_offset" : 22,"end_offset" : 28,"position" : 4
},{
"token" : "over","start_offset" : 29,"end_offset" : 33,"position" : 5
},{
"token" : "lazi","start_offset" : 38,"end_offset" : 42,"position" : 7
},{
"token" : "dog","start_offset" : 43,"end_offset" : 46,"position" : 8
}
]
}
複製程式碼