ElasticSearchでワイルドカード検索がしたい!
という顧客要望に応えるため、何とかできないか試したときのメモ。
結論
データ型がkeywordのフィールドに対しては、正規表現検索は有効。
データ型がtextのフィールドに対しては、意図に沿わないことが多い。
原因
データ型がkeywordはアナライザによる単語分割が行われないため、目的の単語がヒットしやすい。
データ型がtextのフィールドは文字数分割が行われ、かつ、ワイルドカードを使用した場合は「A * B」で一単語と判断するので、
分割文字単位より長い単語をヒットさせることができない。
(むしろワイルドカード使用しなければ、「A」と「B」で分割されるため、目的の単語をヒットできる)
例)
アナライザ(ngram)の最小文字単位が2、最大文字単位が10でかつ、
「使用済自動車の再資源化等に関する法律」を検索したい場合
検索ワード
「自動車法律」はヒットする。
「自動車*法律」はヒットしない。(自動車から法律まで15文字)
「使用済*再資源」はヒットする。(使用済から再資源まで10文字)
「使用済*再資源化」はヒットしない。(使用済から再資源化まで11文字)
「済*再資源化」はヒットする。(済から再資源化まで9文字)
備考
データ型がkeywordは完全一致を目的としたフィールドにすべきだと思うし、
データ型がtextに対して、正規表現やワイルドカード検索しようとすることがイケてないと思う。
正規表現検索が性能劣化するという記事しか見かけなかったから、仕様上もできると思ってた。
設定すれば何とかなるかもしれないけど、そもそも全文検索の思想上、ElasticSearchの持ち味活かしつつ正規表現検索ってできるのかな…?