diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index 476178e86e1adc46b7ac4d0d7b4ca74c8bf92d1f..1ec21d1a0bb203da8c8ded412a4a0857f847a042 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -58,5 +58,9 @@ class CustomEmoji < ApplicationRecord
 
       where(shortcode: shortcodes, domain: domain, disabled: false)
     end
+
+    def search(shortcode)
+      where('"custom_emojis"."shortcode" ILIKE ?', "%#{shortcode}%")
+    end
   end
 end
diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb
index 2c09ed65ca658d86000041e88b4315648a876d25..c4bc310bb0773d60b5136117a6832edff6435ccb 100644
--- a/app/models/custom_emoji_filter.rb
+++ b/app/models/custom_emoji_filter.rb
@@ -28,7 +28,7 @@ class CustomEmojiFilter
     when 'by_domain'
       CustomEmoji.where(domain: value)
     when 'shortcode'
-      CustomEmoji.where(shortcode: value)
+      CustomEmoji.search(value)
     else
       raise "Unknown filter: #{key}"
     end
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index bb150b837645248199f0464cf474f747efcbc2b2..87367df5003a47b20e4b090f8822bc66a29eb28d 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -1,6 +1,30 @@
 require 'rails_helper'
 
 RSpec.describe CustomEmoji, type: :model do
+  describe '#search' do
+    let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: shortcode) }
+
+    subject  { described_class.search(search_term) }
+
+    context 'shortcode is exact' do
+      let(:shortcode) { 'blobpats' }
+      let(:search_term) { 'blobpats' }
+
+      it 'finds emoji' do
+        is_expected.to include(custom_emoji)
+      end
+    end
+
+    context 'shortcode is partial' do
+      let(:shortcode) { 'blobpats' }
+      let(:search_term) { 'blob' }
+
+      it 'finds emoji' do
+        is_expected.to include(custom_emoji)
+      end
+    end
+  end
+
   describe '#local?' do
     let(:custom_emoji) { Fabricate(:custom_emoji, domain: domain) }