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