mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-22 21:40:55 +01:00
Support Ferret engine for searching users
Summary: Ref T12819. Adds support for indexing user accounts so they appear in global fulltext results. Also, always rank users ahead of other results. Test Plan: Indexed users. Searched for a user, got that user. Reviewers: chad Reviewed By: chad Maniphest Tasks: T12819 Differential Revision: https://secure.phabricator.com/D18552
This commit is contained in:
parent
a2a2b3f7f4
commit
3ff9d4a4ca
11 changed files with 118 additions and 0 deletions
|
@ -0,0 +1,9 @@
|
|||
CREATE TABLE {$NAMESPACE}_user.user_user_fdocument (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
objectPHID VARBINARY(64) NOT NULL,
|
||||
isClosed BOOL NOT NULL,
|
||||
authorPHID VARBINARY(64),
|
||||
ownerPHID VARBINARY(64),
|
||||
epochCreated INT UNSIGNED NOT NULL,
|
||||
epochModified INT UNSIGNED NOT NULL
|
||||
) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
|
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE {$NAMESPACE}_user.user_user_ffield (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
documentID INT UNSIGNED NOT NULL,
|
||||
fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT},
|
||||
termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT},
|
||||
normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}
|
||||
) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
|
|
@ -0,0 +1,5 @@
|
|||
CREATE TABLE {$NAMESPACE}_user.user_user_fngrams (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
documentID INT UNSIGNED NOT NULL,
|
||||
ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}
|
||||
) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
|
|
@ -4257,6 +4257,10 @@ phutil_register_library_map(array(
|
|||
'PhabricatorUserEditorTestCase' => 'applications/people/editor/__tests__/PhabricatorUserEditorTestCase.php',
|
||||
'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php',
|
||||
'PhabricatorUserEmailTestCase' => 'applications/people/storage/__tests__/PhabricatorUserEmailTestCase.php',
|
||||
'PhabricatorUserFerretDocument' => 'applications/people/storage/PhabricatorUserFerretDocument.php',
|
||||
'PhabricatorUserFerretEngine' => 'applications/people/search/PhabricatorUserFerretEngine.php',
|
||||
'PhabricatorUserFerretField' => 'applications/people/storage/PhabricatorUserFerretField.php',
|
||||
'PhabricatorUserFerretNgrams' => 'applications/people/storage/PhabricatorUserFerretNgrams.php',
|
||||
'PhabricatorUserFulltextEngine' => 'applications/people/search/PhabricatorUserFulltextEngine.php',
|
||||
'PhabricatorUserIconField' => 'applications/people/customfield/PhabricatorUserIconField.php',
|
||||
'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.php',
|
||||
|
@ -9840,6 +9844,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorFlaggableInterface',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
'PhabricatorFulltextInterface',
|
||||
'PhabricatorFerretInterface',
|
||||
'PhabricatorConduitResultInterface',
|
||||
),
|
||||
'PhabricatorUserBadgesCacheType' => 'PhabricatorUserCacheType',
|
||||
|
@ -9862,6 +9867,10 @@ phutil_register_library_map(array(
|
|||
'PhabricatorUserEditorTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorUserEmail' => 'PhabricatorUserDAO',
|
||||
'PhabricatorUserEmailTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorUserFerretDocument' => 'PhabricatorFerretDocument',
|
||||
'PhabricatorUserFerretEngine' => 'PhabricatorFerretEngine',
|
||||
'PhabricatorUserFerretField' => 'PhabricatorFerretField',
|
||||
'PhabricatorUserFerretNgrams' => 'PhabricatorFerretNgrams',
|
||||
'PhabricatorUserFulltextEngine' => 'PhabricatorFulltextEngine',
|
||||
'PhabricatorUserIconField' => 'PhabricatorUserCustomField',
|
||||
'PhabricatorUserLog' => array(
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorUserFerretEngine
|
||||
extends PhabricatorFerretEngine {
|
||||
|
||||
public function newNgramsObject() {
|
||||
return new PhabricatorUserFerretNgrams();
|
||||
}
|
||||
|
||||
public function newDocumentObject() {
|
||||
return new PhabricatorUserFerretDocument();
|
||||
}
|
||||
|
||||
public function newFieldObject() {
|
||||
return new PhabricatorUserFerretField();
|
||||
}
|
||||
|
||||
public function newSearchEngine() {
|
||||
return new PhabricatorPeopleSearchEngine();
|
||||
}
|
||||
|
||||
public function getObjectTypeRelevance() {
|
||||
// Always sort users above other documents, regardless of relevance
|
||||
// metrics. A user profile is very likely to be the best hit for a query
|
||||
// which matches a user.
|
||||
return 500;
|
||||
}
|
||||
|
||||
}
|
|
@ -19,6 +19,7 @@ final class PhabricatorUser
|
|||
PhabricatorFlaggableInterface,
|
||||
PhabricatorApplicationTransactionInterface,
|
||||
PhabricatorFulltextInterface,
|
||||
PhabricatorFerretInterface,
|
||||
PhabricatorConduitResultInterface {
|
||||
|
||||
const SESSION_TABLE = 'phabricator_session';
|
||||
|
@ -1434,6 +1435,14 @@ final class PhabricatorUser
|
|||
}
|
||||
|
||||
|
||||
/* -( PhabricatorFerretInterface )----------------------------------------- */
|
||||
|
||||
|
||||
public function newFerretEngine() {
|
||||
return new PhabricatorUserFerretEngine();
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorConduitResultInterface )---------------------------------- */
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorUserFerretDocument
|
||||
extends PhabricatorFerretDocument {
|
||||
|
||||
public function getApplicationName() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
public function getIndexKey() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorUserFerretField
|
||||
extends PhabricatorFerretField {
|
||||
|
||||
public function getApplicationName() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
public function getIndexKey() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorUserFerretNgrams
|
||||
extends PhabricatorFerretNgrams {
|
||||
|
||||
public function getApplicationName() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
public function getIndexKey() {
|
||||
return 'user';
|
||||
}
|
||||
|
||||
}
|
|
@ -11,6 +11,10 @@ abstract class PhabricatorFerretEngine extends Phobject {
|
|||
return 'all';
|
||||
}
|
||||
|
||||
public function getObjectTypeRelevance() {
|
||||
return 1000;
|
||||
}
|
||||
|
||||
public function getFieldForFunction($function) {
|
||||
$function = phutil_utf8_strtolower($function);
|
||||
|
||||
|
|
|
@ -34,7 +34,10 @@ final class PhabricatorFerretMetadata extends Phobject {
|
|||
}
|
||||
|
||||
public function getRelevanceSortVector() {
|
||||
$engine = $this->getEngine();
|
||||
|
||||
return id(new PhutilSortVector())
|
||||
->addInt($engine->getObjectTypeRelevance())
|
||||
->addInt(-$this->getRelevance());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue