ElasticSearch 的小雷

又一段時間沒 post 文章了。今天採到一個小雷, 但他也不算雷啦, 只能說我沒有看清楚說明文件。

ElasticSearch 可以使用 Lucene 的 Query Parser Syntax, 基本上就是所謂的 Query String Query。若是使用 pyelasticsearchelasticutils, 都有相對應的 function 可以直接下 Query String, 其實還滿方便的。因為我做了一個小後台, 讓我自己下 Query, 撈我想要看的 ElasticSearch 裡面的項目。

原本用得好好的, 但是我發現我想要查詢某個 Y 開頭, 或 S 開頭的東西, 不論我下 column_name:Y* 或者是改用 regular expression 下 column_name:/Y[0-9]*/ 或者是 column_name:/[a-zA-Z0-9]*/ 都沒有任何作用。但詭異的是, 如果只查詢數字, 就 work, 例如 column_name:/[0-9]*/ 這樣是 ok 的。然後又偶然的發現, 另外一個欄位的查詢也是 work 的, 例如 column_name2:x* 這樣也搜得到。這樣我不禁懷疑, 難道是欄位有問題嗎?

但詭異的事情是, 當我使用 wildcard  query 的時候, 下 Y* 又是 ok 的。因此, 我開始傾向於想, 該不會是 ElasticSearch 在 query string query 的 implementation 有 bug 吧 orz

正當我真的有點無言的時候, 重新把 documentation K 了一遍 (雖然她現在的 documentation 已經好很多, 但我覺得還是一樣沒有非常清楚), 赫然發現一件事情…

有個東西叫做 lowercase_expanded_terms, default 是 true。

Whether terms of wildcard, prefix, fuzzy, and range queries are to be automatically lower-cased or not (since they are not analyzed). Default it true.

所以我所有打大寫的東西, 都被改成小寫了…!!!

而在 elasticutils 的 query(field__query_string=’QUERY’) 無法設定, 只好使用 query_raw 了。

以上的踩地雷, 花了我大約兩個小時 orz