2013/12/09

ElasticSearch中token filters的順序

在ElasticSearch中,一個analyzer可以有多個token filters。而這些filters的順序有時會很重要。
這兩天在玩一個案例,我有一自訂的analyzer,其filters定義為 [standard, lowercase, stop, snowball, synonym],並定義 spanning tree protocol 與 stp為synonym,期望當用spanning tree protocol去搜尋時,也能找到內容中也有stp的文章,反之亦然

但是玩了老半天卻一直失敗,用spanning tree protocol一直無法把文章中有stp的documents給找出來

再用其他之前試驗過的同義字卻是可以成功的,顯然ElasticSearch的機制是OK的,但不知在那個環節出了錯

不斷的try-error,不停的思考,總算悟出了道理。filter的順序是 standard -> lowercase -> stop -> snowball -> synonym
用 "spanning tree protocol" 去搜尋時,從standard到stop都還不會有問題,但到了snowball filter時,filter會把spanning轉變為span,這讓我們的query string從"spanning tree protocol"變成"span tree protocol",當再進到synonym filter時,就無法轉變成同義字stp了,所以同義字的搜詢就會失敗

將filter改成[standard, synonym, lowercase, stop, snowball],把順序調者一下,這樣就解決問題了

沒有留言: