Commit Graph

106 Commits

Author SHA1 Message Date
Mike Dalessio 2c765fa03f rubocop: style fixes 2025-11-17 09:12:41 -05: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
Mike Dalessio 6df681991f rubocop: fix style warnings 2025-11-17 09:12:36 -05:00
Donal McBreen b8baeadf66 Use a deterministic string hash 2025-11-17 09:12:36 -05:00
Donal McBreen f4729577b6 Use uuids in the search_index tables too 2025-11-17 09:12:35 -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 05a7ec84e2 Make search tables work with UUID references 2025-11-17 09:12:31 -05:00
Kevin McConnell a81986816f Move test-related UUID helper 2025-11-17 09:12:31 -05:00
Kevin McConnell e9e68646e3 Fix this test without changing app code 2025-11-17 09:12:31 -05:00
Kevin McConnell 63f8a9af78 Deterministic fixture UUIDs 2025-11-17 09:12:31 -05:00
Kevin McConnell 6c04b56f4b Compact the UUIDs to base36 2025-11-17 09:12:31 -05:00
Mike Dalessio e4011ef211 Update primary keys on customer data to UUIDs
- schema changes to primary and foreign keys
- fixture changes
- customer data models subclass AccountScopedRecord
- import script updated
2025-11-17 09:12:30 -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
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
Mike Dalessio 4ad1718d86 Stub searchable functionality and start to restore login/auth 2025-11-17 09:11:42 -05:00
Jorge Manrubia 56a85c261b Remove plain text mentions
They can cause duplicates

https://app.fizzy.do/5986089/cards/2874

Closes #https://github.com/basecamp/fizzy/pull/1549
2025-11-11 10:01:59 +01:00
Jorge Manrubia b686936230 Fix: extract mentions when publishing cards
This wasn't working when creation and publishing happened on separated instances
of the same record, which is what happens when you edit a draft and then you
publish it

https://app.fizzy.do/5986089/cards/2835/edit
2025-11-10 13:08:29 +01:00
Jorge Manrubia 03a345609e Baseline replacing collection with board across code 2025-11-05 13:31:54 +01:00
Jorge Manrubia 825184ab1b Memoize since these are invoked several times 2025-11-03 07:30:23 +01:00
Jorge Manrubia 2ec5d37947 Add support for remote videos too 2025-11-02 09:38:48 +01:00
Jorge Manrubia ac507aa754 Add support for remote images in the seeding system 2025-11-02 09:24:38 +01: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
Jason Zimdars 0afc738d19 Whitespace 2025-07-21 20:11:03 -05:00
Jason Zimdars a6e9e51071 Merge branch 'main' into web-push
* main: (28 commits)
  Clean up the /scripts directory
  Prevent recursion when invoking AI
  Bump sqlite3 from 2.7.2 to 2.7.3
  Port over Jeremy's fix for slow uploads
  .gitignore log files and portfolio's local storage
  Drop Current.account and just use Account.sole
  Use the utf8-patched mysql driver
  Call blob.preview for previewable attachments
  Make sure the image variants we use are preprocessed
  Add /user command
  Make sure it doesn't infer custom abbreviations when matching user names
  Script to load prod db in development
  Update Signup to use the queenbee_id for the tenant name
  Bump cache version
  Make sure it uses latest bundler to prevent error due to mismatch
  Invalidate cache
  Update ruby
  Update bundler to prevent error on lower version
  Update bundler to prevent error on lower version
  Resolve stages
  ...
2025-07-21 11:03:56 -05:00
Mike Dalessio ef6198d394 Make sure the image variants we use are preprocessed
to avoid implicitly creating a variant during a GET to a read replica,
which will raise an exception and cause the image to fail to load.

This feels pretty brittle, to be honest, and we'll need to be careful
in the future about creating and using new variants; we will probably
need to backfill the new variant for existing images because we can't
guarantee that they will be created implicitly/lazily if the GET lands
on the replica.

ref: https://fizzy.37signals.com/5986089/collections/7/cards/942
2025-07-18 15:43:31 -04:00
Jorge Manrubia a1e3835eb8 Prevent 500 when running /search with empty string 2025-07-18 10:55:36 +02:00
Jason Zimdars 38d13f78a3 Add pusher models and job 2025-07-15 13:16:18 -05:00
Jason Zimdars 97e20c5cd7 Make nil safe 2025-07-08 16:57:48 -05:00
Jorge Manrubia b8b4ef5463 Extract common concern to examine attachments 2025-07-04 17:53:37 +02:00
Jorge Manrubia 17f9df8df3 Don't create mentions from drafts until those are published
https://fizzy.37signals.com/5986089/collections/2/cards/982
2025-07-04 17:25:39 +02:00
Jorge Manrubia 9e3dbb0858 Remove semantic searches
We may revisit in the future but we'll go with keyword search only for launch
2025-06-25 09:36:14 +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 67fa9a46a8 Animate the search screen mockup 2025-06-24 09:58:48 +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 ba225f5b4f Format 2025-06-20 10:46:21 +02:00
Jorge Manrubia 5c98744743 Support rich text mentions 2025-06-20 10:39:22 +02:00
Jorge Manrubia 6446e5b409 Select cards with # 2025-06-19 13:00:26 +02:00
Jorge Manrubia 0cb5b9ecd6 Reactions reset entropy 2025-06-05 16:07:19 +02:00
Jorge Manrubia fa04016cbe Revert "Revert "Replace House with Lexical"" 2025-05-29 14:25:16 +02:00
Jorge Manrubia 08d8b2e5ff Revert "Replace House with Lexical" 2025-05-29 14:22:27 +02:00
Jorge Manrubia 10b2aad647 Replace House with lexical-powered actiontext 2025-05-23 11:41:08 +02:00
Jorge Manrubia 541f24ab0b Limit the tokens we send for embeds
See insight by Donal here https://github.com/basecamp/fizzy/pull/483#discussion_r2084766023
2025-05-16 16:39:18 +02:00
Jorge Manrubia 2c0f6913ce Test fixes 2025-05-16 15:02:59 +02:00
Jorge Manrubia 0a607fab4c Refresh search embeddings in jobs 2025-05-16 14:00:54 +02:00
Jorge Manrubia 6933449d2d Tweak prefix 2025-05-16 13:29:18 +02:00
Jorge Manrubia b568711809 Add cache for embed in queries 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