Commit Graph

28 Commits

Author SHA1 Message Date
Donal McBreen b571303385 Don't use Current.account for search records
It doesn't actually work, and even if we could make it work reliably
we are better off if the records always know to go to the right shard.

It does make the interface a bit more complicated as we need to select
the right shard class with `for(account_id)`.
2025-11-25 11:34:41 +00:00
Donal McBreen 04c9d9268b Remove wrapper methods and kwargs 2025-11-21 14:53:17 +00:00
Donal McBreen bef4b86212 Use card_search_records instead of join class method 2025-11-21 14:42:09 +00:00
Donal McBreen 01d16f96d4 Remove Search::Record.for_account
Instead we'll compute the table name dynamically based on
Current.account where needed. Also we'll prevent searchable records
from being saved if Current.account is not set, otherwise the after
commit callbacks will fail.
2025-11-21 12:09:21 +00:00
Donal McBreen 28efe28f24 Replace Search::Index with Search::Records
Lean on ActiveRecord models for searching and strip out the raw SQL.
Replaces the search_index_* tables with sharded search_records_* tables
as that allows us to use a Search::Record model name.

A Class is dynamically created for each record table shard so that we
and we can access it via the Search::Record.for_account(account_id)
method.
2025-11-17 09:12:40 -05:00
Donal McBreen fc56ad9d7c Combine uuid-old and uuid branch changes
- Switch to binary 16 for UUID keys
- Remove AccountScopedRecord base class, all model use binary uuids now
- Fix the search sql to serialize uuids properly
- Patch the MySQL schema dumper to output binary lengths
2025-11-17 09:12:34 -05:00
Donal McBreen 3aa4a1a562 Shard the search index into 16 tables
Create search_index_0 to search_index_15 tables and shard each index by
account id. MySQL has no ability to pre-filter fulltext indexes by
another field so this is the best bet for improving performance.

Each fulltest index internally creates 11 sub tables (see
https://dev.mysql.com/doc/refman/8.4/en/innodb-fulltext-index.html) so
actually we have 192 tables in total here.

The search_index table name is generated dynamically based on the
account_id.
2025-11-17 09:12:17 -05:00
Donal McBreen ddd7fe082a Ensure the mentioning scope search works
Include the filter by accessible board ids to avoid large joins from the
search_index table. Drop the unused search scope.
2025-11-17 09:12:17 -05:00
Stanko K.R. 2c3062fd86 Add a stemmer and highlighter 2025-11-17 09:12:17 -05:00
Donal McBreen e8abc66eba MySQL search
Add a single search_index table for full-text search of cards and
comments.

For the search there is a full-text index on the title and content
columns. The board_ids is also included in the table and accessible
board ids are pre-loaded and included in the search query. This allows
us to filter out inaccessible records before joining with other tables.

Right now the search is just using boolean search. This would give us
a bunch of syntax options
(see https://dev.mysql.com/doc/refman/8.4/en/fulltext-boolean.html)
except the search query filters those out.

I've removed the searchable_by method for now - everything is built
on the assumption that there's a single search index table and all data
must fit into it.

Queries are written in SQL, we don't have a SearchIndex ActiveRecord
model. That's because we'll likely want to shard the table and it will
be simpler to just keep with the raw SQL for that.

There's no stemming, highlighting or snippet extraction yet - we are
dumping the full description in the search results.

Data can be reindexed with the search:reindex rake task.
2025-11-17 09:12:17 -05:00
Jorge Manrubia aa1ffb3357 Remove AI summaries and semantic searches
We were not using either. We can restore if we revisit.
2025-10-29 11:55:32 +01:00
Jorge Manrubia 1c6adf54a8 Restore semantic searches 2025-07-24 16:47:57 +02:00
Jorge Manrubia cbeefc5b74 Remove unused code 2025-07-04 19:00:22 +02:00
Jorge Manrubia c500a2f178 format 2025-06-24 13:34:52 +02:00
Jorge Manrubia 7371147e5f Separate search paths 2025-06-24 13:32:31 +02:00
Jorge Manrubia e59b7fcd18 Format 2025-06-24 10:45:11 +02:00
Jorge Manrubia 0997b45e37 Make searchable work with multiple fields and index card descriptions as separated columns 2025-06-24 08:03:25 +02:00
Jorge Manrubia 5fe5419905 Move similarity search to a param
To keep current tests working. This is all quite experimental. Used as a sandbox for now.
2025-05-16 14:16:14 +02:00
Jorge Manrubia b568711809 Add cache for embed in queries 2025-05-16 13:29:18 +02:00
Jorge Manrubia 378f5e5891 Handle terminal output as a proper target 2025-05-16 13:29:18 +02:00
Jorge Manrubia 9d7438ba25 Use similarity searches and refined prompt 2025-05-16 13:29:18 +02:00
Jorge Manrubia 67984bf589 WIP for LLM experiment 2025-05-16 13:29:18 +02:00
Jorge Manrubia 2b98db9e66 Flatten out comments and messages
https://37s.fizzy.37signals.com/collections/693169850/cards/999008989#comment_994777841
2025-04-29 19:21:18 +02:00
Jorge Manrubia b0aae3ad9e Reapply "Add a description field for cards"
This reverts commit a4cc143b09.
2025-04-21 16:45:24 +02:00
Jorge Manrubia a4cc143b09 Revert "Add a description field for cards" 2025-04-21 16:41:33 +02:00
Jorge Manrubia 99dbc04e2c Format 2025-04-21 15:20:03 +02:00
Jorge Manrubia ffdec1cc3b Index description too 2025-04-21 15:18:11 +02:00
Jorge Manrubia 723e6d94f5 Rename bubbles => cards 2025-04-09 14:50:58 +02:00