45 public function rescore( $search, $namespaces, $srchres, $limit ) {
47 $ns = in_array(
NS_MAIN, $namespaces ) ?
NS_MAIN : reset( $namespaces );
48 $t = Title::newFromText( $search, $ns );
49 if ( !
$t || !
$t->exists() ) {
53 $string =
$t->getPrefixedText();
54 $key = array_search( $string, $srchres );
55 if ( $key !==
false ) {
57 return $this->pullFront( $key, $srchres );
60 if (
$t->isRedirect() ) {
61 $target = $this->getRedirectTarget(
$t );
62 $key = array_search( $target, $srchres );
63 if ( $key !==
false ) {
71 return $this->pullFront( $key, $srchres );
73 $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
74 if ( isset( $redirectTargetsToRedirect[$target] ) ) {
79 return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres );
82 $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
83 if ( isset( $redirectTargetsToRedirect[$string] ) ) {
86 array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 );
87 array_unshift( $srchres, $string );
93 array_unshift( $srchres, $string );
95 if ( count( $srchres ) > $limit ) {
96 array_pop( $srchres );
106 private function redirectTargetsToRedirect( array $titles ) {
108 foreach ( $titles as $key => $titleText ) {
109 $title = Title::newFromText( $titleText );
110 if ( !$title || !$title->isRedirect() ) {
113 $target = $this->getRedirectTarget( $title );
117 $result[$target] = $key;
129 private function pullFront( $key, array $array ) {
130 $cut = array_splice( $array, $key, 1 );
131 array_unshift( $array, $cut[0] );
140 private function getRedirectTarget( $title ) {
141 $redirectStore = MediaWikiServices::getInstance()->getRedirectStore();
142 $redir = $redirectStore->getRedirectTarget( $title );
145 $redir = Title::castFromLinkTarget( $redir );
146 return $redir ? $redir->getPrefixedText() :
null;
An utility class to rescore search results by looking for an exact match in the db and add the page f...
rescore( $search, $namespaces, $srchres, $limit)
Default search backend does proper prefix searching, but custom backends may sort based on other algo...