mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-29 10:12:41 +01:00
96fe8c0b83
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. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9979 Differential Revision: https://secure.phabricator.com/D14846
26 lines
780 B
PHP
26 lines
780 B
PHP
<?php
|
|
|
|
final class PhabricatorOwnersPackageFulltextEngine
|
|
extends PhabricatorFulltextEngine {
|
|
|
|
protected function buildAbstractDocument(
|
|
PhabricatorSearchAbstractDocument $document,
|
|
$object) {
|
|
|
|
$package = $object;
|
|
$document->setDocumentTitle($package->getName());
|
|
|
|
// TODO: These are bogus, but not currently stored on packages.
|
|
$document->setDocumentCreated(PhabricatorTime::getNow());
|
|
$document->setDocumentModified(PhabricatorTime::getNow());
|
|
|
|
$document->addRelationship(
|
|
$package->isArchived()
|
|
? PhabricatorSearchRelationship::RELATIONSHIP_CLOSED
|
|
: PhabricatorSearchRelationship::RELATIONSHIP_OPEN,
|
|
$package->getPHID(),
|
|
PhabricatorOwnersPackagePHIDType::TYPECONST,
|
|
PhabricatorTime::getNow());
|
|
}
|
|
|
|
}
|