From 5d07705220df37adbc0a2573cab6a5d4a630033e Mon Sep 17 00:00:00 2001 From: Jeremy Prevost Date: Tue, 13 Oct 2026 08:17:22 -0400 Subject: [PATCH] Reduce fulltext match boost Why are these changes being introduced: * Fulltext fields are very large blocks of text compared to other metadata-only fields. * Reducing the boost for fulltext fields ensures that matches in smaller, more specific metadata fields are not overshadowed by matches in large text blocks. * We had evidence that relevance scores as measured by Quepid were being negatively affected under some conditions. Relevant ticket(s): * https://mitlibraries.atlassian.net/browse/USE-723 How does this address that need: * Reduced the boost for fulltext fields in the search query. --- app/models/lexical_query_builder.rb | 2 +- test/models/lexical_query_builder_test.rb | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/lexical_query_builder.rb b/app/models/lexical_query_builder.rb index 4dbdeb81..5d7b301e 100644 --- a/app/models/lexical_query_builder.rb +++ b/app/models/lexical_query_builder.rb @@ -147,7 +147,7 @@ def fields_to_search(fulltext) fields = ['alternate_titles', 'call_numbers', 'citation', 'contents', 'contributors.value', 'dates.value', 'edition', 'funding_information.*', 'identifiers.value', 'languages', 'locations.value', 'notes.value', 'numbering', 'publication_information', 'subjects.value', 'summary', 'title'] - fields << 'fulltext' if fulltext + fields << 'fulltext^0.1' if fulltext fields end diff --git a/test/models/lexical_query_builder_test.rb b/test/models/lexical_query_builder_test.rb index ce318d98..1e6701f9 100644 --- a/test/models/lexical_query_builder_test.rb +++ b/test/models/lexical_query_builder_test.rb @@ -71,14 +71,16 @@ class LexicalQueryBuilderTest < ActiveSupport::TestCase builder = LexicalQueryBuilder.new params = { q: 'this' } - assert(builder.build(params, fulltext: true).to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title","fulltext"]')) + assert(builder.build(params, + fulltext: true).to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title","fulltext^0.1"]')) end test 'fulltext is not included by default' do builder = LexicalQueryBuilder.new params = { q: 'this' } - assert(builder.build(params, fulltext: false).to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title"]')) + assert(builder.build(params, + fulltext: false).to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title"]')) end test 'can search by geopoint' do