From 554182f4b4ef5348441f88e900a15315459193b4 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 19 Feb 2026 16:16:39 -0600 Subject: [PATCH 1/3] Fix stemmer stripping hyphens instead of splitting on them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stemmer was concatenating tokens across hyphens (e.g. "BC3-IOS-1D8B" → "bc3ios1d8b") while the query sanitizer split on them, causing MySQL MATCH AGAINST to never find the indexed token. Replace non-word chars with spaces instead of stripping them so indexing and querying tokenize consistently. Requires search:reindex after deploy to rebuild existing search records. Co-Authored-By: Claude Opus 4.6 --- app/models/search/stemmer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/search/stemmer.rb b/app/models/search/stemmer.rb index f6a6c56d4..21cb75f97 100644 --- a/app/models/search/stemmer.rb +++ b/app/models/search/stemmer.rb @@ -5,7 +5,7 @@ module Search::Stemmer def stem(value) if value.present? - value.gsub(/[^\w\s]/, "").split(/\s+/).map { |word| STEMMER.stem(word.downcase) }.join(" ") + value.gsub(/[^\w\s]/, " ").split(/\s+/).map { |word| STEMMER.stem(word.downcase) }.join(" ") else value end From 3932fce3096482593f858b94071e0fb4d59c9176 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 19 Feb 2026 16:16:44 -0600 Subject: [PATCH 2/3] Add tests for hyphenated string search Cover the stemmer tokenizing hyphenated input into separate words and end-to-end search finding cards with hyphenated titles. Co-Authored-By: Claude Opus 4.6 --- test/models/search/stemmer_test.rb | 6 ++++++ test/models/search_test.rb | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/test/models/search/stemmer_test.rb b/test/models/search/stemmer_test.rb index 858ed2dca..147e77869 100644 --- a/test/models/search/stemmer_test.rb +++ b/test/models/search/stemmer_test.rb @@ -12,4 +12,10 @@ class Search::StemmerTest < ActiveSupport::TestCase assert_equal "test run jump walk", result end + + test "stem hyphenated words" do + result = Search::Stemmer.stem("BC3-IOS-1D8B") + + assert_equal "bc3 io 1d8b", result + end end diff --git a/test/models/search_test.rb b/test/models/search_test.rb index 44996404b..c52a397f4 100644 --- a/test/models/search_test.rb +++ b/test/models/search_test.rb @@ -35,4 +35,11 @@ class SearchTest < ActiveSupport::TestCase results = Search::Record.for(user_without_access.account_id).search("anything", user: user_without_access) assert_empty results end + + test "search for hyphenated strings" do + card = @board.cards.create!(title: "BC3-IOS-1D8B", creator: @user, status: "published") + + results = Search::Record.for(@user.account_id).search("BC3-IOS-1D8B", user: @user) + assert results.find { |it| it.card_id == card.id } + end end From 85dc8ba455fb3c4b6007063b1d19e9fd78876f11 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 19 Feb 2026 16:23:26 -0600 Subject: [PATCH 3/3] Add repeated punctuation search stemmer test --- test/models/search/stemmer_test.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/models/search/stemmer_test.rb b/test/models/search/stemmer_test.rb index 147e77869..33334ada4 100644 --- a/test/models/search/stemmer_test.rb +++ b/test/models/search/stemmer_test.rb @@ -18,4 +18,10 @@ class Search::StemmerTest < ActiveSupport::TestCase assert_equal "bc3 io 1d8b", result end + + test "stem words separated by repeated punctuation" do + result = Search::Stemmer.stem("foo---bar") + + assert_equal "foo bar", result + end end