diff --git a/ee/lib/search/elastic/queries.rb b/ee/lib/search/elastic/queries.rb
index b9a7c02a1fefcfa1f5847572d7ad0545894c0674..b1e3c4d362e519c4132f84f7331a567d0bf121f2 100644
--- a/ee/lib/search/elastic/queries.rb
+++ b/ee/lib/search/elastic/queries.rb
@@ -39,8 +39,9 @@ def by_full_text(query:, options:)
         end
 
         def by_multi_match_query(fields:, query:, options:)
-          fields = ::Elastic::Latest::CustomLanguageAnalyzers.add_custom_analyzers_fields(fields)
-          fields = remove_fields_boost(fields) if options[:count_only]
+          query_fields = fields.dup
+          query_fields = ::Elastic::Latest::CustomLanguageAnalyzers.add_custom_analyzers_fields(query_fields)
+          query_fields = remove_fields_boost(query_fields) if options[:count_only]
 
           bool_expr = ::Search::Elastic::BoolExpr.new
 
@@ -57,8 +58,8 @@ def by_multi_match_query(fields:, query:, options:)
             end
 
             multi_match_bool = ::Search::Elastic::BoolExpr.new
-            multi_match_bool.should << multi_match_query(fields, query, options.merge(operator: :and))
-            multi_match_bool.should << multi_match_phrase_query(fields, query, options)
+            multi_match_bool.should << multi_match_query(query_fields, query, options.merge(operator: :and))
+            multi_match_bool.should << multi_match_phrase_query(query_fields, query, options)
             multi_match_bool.minimum_should_match = 1
 
             if options[:count_only]
@@ -75,14 +76,15 @@ def by_multi_match_query(fields:, query:, options:)
           query_hash = { query: { bool: bool_expr } }
           query_hash[:track_scores] = true unless query.present?
 
-          query_hash[:highlight] = apply_highlight(fields) unless options[:count_only]
+          query_hash[:highlight] = apply_highlight(query_fields) unless options[:count_only]
 
           query_hash
         end
 
         def by_simple_query_string(fields:, query:, options:)
-          fields = ::Elastic::Latest::CustomLanguageAnalyzers.add_custom_analyzers_fields(fields)
-          fields = remove_fields_boost(fields) if options[:count_only]
+          query_fields = fields.dup
+          query_fields = ::Elastic::Latest::CustomLanguageAnalyzers.add_custom_analyzers_fields(query_fields)
+          query_fields = remove_fields_boost(query_fields) if options[:count_only]
 
           bool_expr = ::Search::Elastic::BoolExpr.new
           if query.present?
@@ -98,11 +100,11 @@ def by_simple_query_string(fields:, query:, options:)
             end
 
             if options[:count_only]
-              bool_expr.filter << simple_query_string(fields, query, options)
+              bool_expr.filter << simple_query_string(query_fields, query, options)
             elsif options[:keyword_match_clause] == :should
-              bool_expr.should << simple_query_string(fields, query, options)
+              bool_expr.should << simple_query_string(query_fields, query, options)
             else
-              bool_expr.must << simple_query_string(fields, query, options)
+              bool_expr.must << simple_query_string(query_fields, query, options)
             end
           else
             bool_expr.must = { match_all: {} }
@@ -111,7 +113,7 @@ def by_simple_query_string(fields:, query:, options:)
           query_hash = { query: { bool: bool_expr } }
           query_hash[:track_scores] = true unless query.present?
 
-          query_hash[:highlight] = apply_highlight(fields) unless options[:count_only]
+          query_hash[:highlight] = apply_highlight(query_fields) unless options[:count_only]
 
           query_hash
         end
diff --git a/ee/spec/lib/search/elastic/queries_spec.rb b/ee/spec/lib/search/elastic/queries_spec.rb
index 22ccce72eb822fbe7153c0f2cda74938a8f5b6b6..a1563e7db4df18d47e4fe1b755ab4bf2eeeaa72f 100644
--- a/ee/spec/lib/search/elastic/queries_spec.rb
+++ b/ee/spec/lib/search/elastic/queries_spec.rb
@@ -83,6 +83,20 @@
 
         expect(by_simple_query_string[:query][:bool][:must]).to eql(expected_must)
       end
+
+      context 'when fields is a frozen array' do
+        let(:fields) { %w[iid^3 title^2 description].freeze }
+
+        it 'applies custom analyzer fields' do
+          expected_must = [
+            { simple_query_string: { _name: 'my_type:match:search_terms',
+                                     fields: %w[iid^3 title^2 description title.smartcn description.smartcn],
+                                     query: 'foo bar', lenient: true, default_operator: :and } }
+          ]
+
+          expect(by_simple_query_string[:query][:bool][:must]).to eql(expected_must)
+        end
+      end
     end
 
     it 'applies highlight in query' do
@@ -195,6 +209,26 @@
 
         expect(by_multi_match_query[:query][:bool][:must]).to eql(expected_must)
       end
+
+      context 'when fields is a frozen array' do
+        let(:fields) { %w[iid^3 title^2 description].freeze }
+
+        it 'applies custom analyzer fields to multi_match_query' do
+          expected_must = [{ bool: {
+            should: [
+              { multi_match: { _name: 'my_type:multi_match:and:search_terms',
+                               fields: %w[iid^3 title^2 description title.smartcn description.smartcn],
+                               query: 'foo bar', operator: :and, lenient: true } },
+              { multi_match: { _name: 'my_type:multi_match_phrase:search_terms',
+                               type: :phrase, fields: %w[iid^3 title^2 description title.smartcn description.smartcn],
+                               query: 'foo bar', lenient: true } }
+            ],
+            minimum_should_match: 1
+          } }]
+
+          expect(by_multi_match_query[:query][:bool][:must]).to eql(expected_must)
+        end
+      end
     end
 
     it 'applies highlight in query' do