きり丸の技術日記

技術検証したり、資格等をここに残していきます。

ElasticSearchの「正規表現」「ワイルドカード検索」は性能的にも業務的にもメリットが薄かった

Qiitaで書いた記事を微妙に書き直して、はてなブログに移行させます。


「ElasticSearchで正規表現やワイルドカード検索がしたい!」

という顧客要望に応えるため、何とかできないか試したときのメモ。

環境

  • ElasticSearch

結論

  • データ型がkeywordのフィールドに対しては、正規表現検索は有効
  • データ型がtextのフィールドに対しては、意図に沿わないことが多い

書かないこと

  • 正規表現検索で劣化する性能の具体的な値

原因

データ型がkeywordはアナライザによる単語分割が行われないため、正規表現で目的の単語がヒットしやすいです。

データ型がtextのフィールドはアナライザによる文字数分割が行われます。
また、ワイルドカードを使用した場合は「A * B」で一単語と判断します。

一単語として扱うため、分割文字単位より長い単語をヒットさせることができません。

むしろワイルドカード使用しない方が、単語が「A」と「B」で分割されるため、目的の単語をヒットできます。

アナライザ(ngram)の最小文字単位が2、最大文字単位が10でかつ、「使用済自動車の再資源化等に関する法律」を検索したい場合。

検索ワードと検索結果

  • 「自動車法律」はヒットする
  • 「自動車*法律」はヒットしない
    • 自動車から法律まで15文字
  • 「使用済*再資源」はヒットする
    • 使用済から再資源まで10文字
  • 「使用済*再資源化」はヒットしない
    • 使用済から再資源化まで11文字
  • 「済*再資源化」はヒットする
    • 済から再資源化まで9文字

備考

データ型がkeywordは完全一致を目的としたフィールドにすべきです。

データ型がtextに対して、正規表現やワイルドカード検索しようとしてはいけません。

まぁ、「邪王炎殺黒龍波」とか「超級武神覇斬」とか、データ型がkeywordの単語でも正規表現で検索したくなりそうですが…。


正規表現検索が性能劣化するという記事しか見かけなかったので、仕様上もできると思ってました。

設定すれば何とかなるかもしれませんが、そもそも全文検索の思想上、ElasticSearchの持ち味活かしつつ正規表現検索ってできるんですかね?たぶん、無理だと思います。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。