Page MenuHomePhabricator

Implement basic ngram search for Owners Package names
ClosedPublic

Authored by epriestley on Dec 21 2015, 9:07 PM.
Tags
None
Referenced Files
F20006181: D14846.id35903.diff
Fri, May 29, 9:03 PM
F20006096: D14846.diff
Fri, May 29, 9:02 PM
Unknown Object (File)
Mar 21 2026, 6:36 PM
Unknown Object (File)
Mar 15 2026, 8:50 AM
Unknown Object (File)
Mar 14 2026, 1:01 PM
Unknown Object (File)
Mar 14 2026, 1:01 PM
Unknown Object (File)
Mar 14 2026, 5:09 AM
Unknown Object (File)
Mar 7 2026, 11:25 PM
Subscribers
None

Details

Summary

Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:

< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>

When the user searches for exam, we join this table for packages with tokens exa and xam. MySQL can do this a lot more efficiently than it can process a LIKE "%exam%" query against a huge table.

When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.

Test Plan
  • Ran storage upgrades and search indexer.
  • Searched for stuff with "name contains".
  • Used typehaead and got sensible results.
  • Searched for aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz and saw only 16 joins.

Diff Detail

Repository
rP Phabricator
Lint
Lint Not Applicable
Unit
Tests Not Applicable