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
F19886235: D14846.diff
Sat, Mar 21, 6:36 PM
F19870887: D14846.diff
Sun, Mar 15, 8:50 AM
F19863796: D14846.id35903.diff
Sat, Mar 14, 1:01 PM
F19863794: D14846.id35903.diff
Sat, Mar 14, 1:01 PM
F19859655: D14846.id35903.diff
Sat, Mar 14, 5:09 AM
F19824463: D14846.id35881.diff
Sat, Mar 7, 11:25 PM
F19813130: D14846.diff
Wed, Mar 4, 7:42 AM
F19801459: D14846.id35881.diff
Sat, Feb 28, 11:44 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