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
F15456040: D14846.id35903.diff
Sun, Mar 30, 6:37 AM
F15438241: D14846.id35881.diff
Tue, Mar 25, 11:48 PM
F15434272: D14846.id.diff
Tue, Mar 25, 2:50 AM
F15431933: D14846.diff
Mon, Mar 24, 3:25 PM
F15428669: D14846.id35881.diff
Sun, Mar 23, 9:35 PM
F15401693: D14846.id35903.diff
Mon, Mar 17, 6:52 PM
F15386761: D14846.diff
Sat, Mar 15, 1:15 AM
Unknown Object (File)
Feb 24 2025, 7:28 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