Qiitaで書いた記事を微妙に書き直して、はてなブログに移行させます。
「ElasticSearchで正規表現やワイルドカード検索がしたい!」
という顧客要望に応えるため、何とかできないか試したときのメモ。
環境
- ElasticSearch
結論
- データ型がkeywordのフィールドに対しては、正規表現検索は有効
- データ型がtextのフィールドに対しては、意図に沿わないことが多い
書かないこと
- 正規表現検索で劣化する性能の具体的な値
原因
データ型がkeywordはアナライザによる単語分割が行われないため、正規表現で目的の単語がヒットしやすいです。
データ型がtextのフィールドはアナライザによる文字数分割が行われます。
また、ワイルドカードを使用した場合は「A * B」で一単語と判断します。
一単語として扱うため、分割文字単位より長い単語をヒットさせることができません。
むしろワイルドカード使用しない方が、単語が「A」と「B」で分割されるため、目的の単語をヒットできます。
例
アナライザ(ngram)の最小文字単位が2、最大文字単位が10でかつ、「使用済自動車の再資源化等に関する法律」を検索したい場合。
検索ワードと検索結果
- 「自動車法律」はヒットする
- 「自動車*法律」はヒットしない
- 自動車から法律まで15文字
- 「使用済*再資源」はヒットする
- 使用済から再資源まで10文字
- 「使用済*再資源化」はヒットしない
- 使用済から再資源化まで11文字
- 「済*再資源化」はヒットする
- 済から再資源化まで9文字
備考
データ型がkeywordは完全一致を目的としたフィールドにすべきです。
データ型がtextに対して、正規表現やワイルドカード検索しようとしてはいけません。
まぁ、「邪王炎殺黒龍波」とか「超級武神覇斬」とか、データ型がkeywordの単語でも正規表現で検索したくなりそうですが…。
正規表現検索が性能劣化するという記事しか見かけなかったので、仕様上もできると思ってました。
設定すれば何とかなるかもしれませんが、そもそも全文検索の思想上、ElasticSearchの持ち味活かしつつ正規表現検索ってできるんですかね?たぶん、無理だと思います。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。