Go to the documentation of this file.
187 $resultSetOrStatus = $fn();
194 $resultSet = $resultSetOrStatus;
195 } elseif ( $resultSetOrStatus instanceof
Status &&
198 $resultSet = $resultSetOrStatus->getValue();
201 $resultSet->shrink( $this->limit );
204 return $resultSetOrStatus;
215 switch ( $feature ) {
216 case 'search-update':
218 case 'title-suffix-filter':
231 $this->features[$feature] = $data;
242 return $this->features[$feature] ??
null;
255 return MediaWikiServices::getInstance()->getContentLanguage()->segmentByWord( $string );
265 MediaWikiServices::getInstance()->getContentLanguage(),
275 $services = MediaWikiServices::getInstance();
276 $config = $services->getMainConfig();
277 return $services->newSearchEngine()->getNearMatcher( $config );
287 return "A-Za-z_'.0-9\\x80-\\xFF\\-";
298 $this->limit = intval(
$limit );
299 $this->offset = intval(
$offset );
311 $validNs = MediaWikiServices::getInstance()->getSearchEngineConfig()->searchableNamespaces();
313 return $ns < 0 || isset( $validNs[$ns] );
355 throw new InvalidArgumentException(
"Invalid sort: $sort. " .
356 "Must be one of: " . implode(
', ', $this->
getValidSorts() ) );
401 $withAllKeyword =
true,
402 $withPrefixSearchExtractNamespaceHook =
false
405 if ( strpos( $query,
':' ) ===
false ) {
408 $extractedNamespace =
null;
411 if ( $withAllKeyword ) {
414 $allkeywords[] =
wfMessage(
'searchall' )->inContentLanguage()->text() .
":";
416 if ( !in_array(
'all:', $allkeywords ) ) {
417 $allkeywords[] =
'all:';
420 foreach ( $allkeywords as $kw ) {
421 if ( strncmp( $query, $kw, strlen( $kw ) ) == 0 ) {
422 $extractedNamespace =
null;
423 $parsed = substr( $query, strlen( $kw ) );
430 if ( !$allQuery && strpos( $query,
':' ) !==
false ) {
431 $prefix = str_replace(
' ',
'_', substr( $query, 0, strpos( $query,
':' ) ) );
432 $index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex(
$prefix );
433 if ( $index !==
false ) {
434 $extractedNamespace = [ $index ];
435 $parsed = substr( $query, strlen(
$prefix ) + 1 );
436 } elseif ( $withPrefixSearchExtractNamespaceHook ) {
439 Hooks::runner()->onPrefixSearchExtractNamespace( $hookNamespaces, $hookQuery );
440 if ( $hookQuery !== $query ) {
441 $parsed = $hookQuery;
442 $extractedNamespace = $hookNamespaces;
451 return [ $parsed, $extractedNamespace ];
464 return [ $contextlines, $contextchars ];
516 return $c ? $c->getTextForSearchIndex() :
'';
539 if ( $queryAndNs !==
false ) {
541 return $queryAndNs[0];
575 $search = trim( $search );
577 if ( !in_array(
NS_SPECIAL, $this->namespaces ) &&
579 $this->namespaces, $search, $this->limit, $results, $this->offset )
598 if ( trim( $search ) ===
'' ) {
614 if ( trim( $search ) ===
'' ) {
620 $fallbackLimit = 1 + $this->limit - $results->getSize();
621 if ( $fallbackLimit > 0 ) {
622 $fallbackSearches = MediaWikiServices::getInstance()->getContentLanguage()->
623 autoConvertToAllVariants( $search );
624 $fallbackSearches = array_diff( array_unique( $fallbackSearches ), [ $search ] );
626 foreach ( $fallbackSearches as $fbs ) {
629 $results->appendAll( $fallbackSearchResult );
630 $fallbackLimit -= $fallbackSearchResult->getSize();
631 if ( $fallbackLimit <= 0 ) {
660 $suggestions->
shrink( $this->limit );
662 $search = trim( $search );
664 $linkBatchFactory = MediaWikiServices::getInstance()->getLinkBatchFactory();
665 $lb = $linkBatchFactory->newLinkBatch( $suggestions->
map(
static function (
SearchSuggestion $sugg ) {
668 $lb->setCaller( __METHOD__ );
675 MediaWikiServices::getInstance()->getStatsdDataFactory()
676 ->updateCount(
'search.completion.missing', $diff );
683 if ( $this->offset === 0 ) {
690 $rescoredResults = $rescorer->rescore( $search, $this->namespaces, $results, $this->limit );
695 $rescoredResults = $results;
698 if ( count( $rescoredResults ) > 0 ) {
699 $found = array_search( $rescoredResults[0], $results );
700 if ( $found ===
false ) {
704 $suggestions->
prepend( $exactMatch );
705 $suggestions->
shrink( $this->limit );
709 $suggestions->
rescore( $found );
723 if ( trim( $search ) ===
'' ) {
740 return $backend->
defaultSearchBackend( $this->namespaces, $search, $this->limit, $this->offset );
785 $models = MediaWikiServices::getInstance()->getContentHandlerFactory()->getContentModels();
787 $seenHandlers =
new SplObjectStorage();
788 foreach ( $models as $model ) {
790 $handler = MediaWikiServices::getInstance()
791 ->getContentHandlerFactory()
792 ->getContentHandler( $model );
799 if ( $seenHandlers->contains( $handler ) ) {
803 $seenHandlers->attach( $handler );
804 $handlerFields = $handler->getFieldsForSearchIndex( $this );
805 foreach ( $handlerFields as $fieldName => $fieldData ) {
806 if ( empty( $fields[$fieldName] ) ) {
807 $fields[$fieldName] = $fieldData;
810 $mergeDef = $fields[$fieldName]->merge( $fieldData );
812 throw new InvalidArgumentException(
"Duplicate field $fieldName for model $model" );
814 $fields[$fieldName] = $mergeDef;
819 $this->
getHookRunner()->onSearchIndexFields( $fields, $this );
831 $this->
getHookRunner()->onSearchResultsAugment( $setAugmentors, $rowAugmentors );
832 if ( !$setAugmentors && !$rowAugmentors ) {
838 foreach ( $rowAugmentors as $name => $row ) {
839 if ( isset( $setAugmentors[$name] ) ) {
840 throw new InvalidArgumentException(
"Both row and set augmentors are defined for $name" );
849 foreach ( $setAugmentors as $name => $augmentor ) {
850 $data = $augmentor->augmentAll( $resultSet );
874 if ( !$this->hookContainer ) {
878 $this->hookContainer = MediaWikiServices::getInstance()->getHookContainer();
892 if ( !$this->hookRunner ) {
static fromStrings(array $titles, $hasMoreResults=false)
Builds a new set of suggestion based on a string array.
getSearchIndexFields()
Get fields for search index.
getProfiles( $profileType, User $user=null)
Get a list of supported profiles.
getHookContainer()
Get a HookContainer, for running extension hooks or for hook metadata.
map( $callback)
Call array_map on the suggestions array.
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
augmentSearchResults(ISearchResultSet $resultSet)
Augment search results with extra data.
setFeatureData( $feature, $data)
Way to pass custom data for engines.
getValidSorts()
Get the valid sort directions.
const DEFAULT_CONTEXT_CHARS
completionSearchWithVariants( $search)
Perform a completion search with variants.
Performs prefix search, returning Title objects.
normalizeText( $string)
When overridden in derived class, performs database-specific conversions on text to be used for searc...
getSort()
Get the sort direction of the search results.
searchTitle( $term)
Perform a title-only search query and return a result set.
static userHighlightPrefs()
Find snippet highlight settings for all users.
const FT_QUERY_INDEP_PROFILE_TYPE
Profile type for query independent ranking features.
completionSearchBackend( $search)
Perform a completion search.
legalSearchChars( $type=self::CHARS_ALL)
Get chars legal for search.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
prepend(SearchSuggestion $suggestion)
Add a new suggestion at the top.
static parseNamespacePrefixes( $query, $withAllKeyword=true, $withPrefixSearchExtractNamespaceHook=false)
Parse some common prefixes: all (search everything) or namespace names.
doSearchTitle( $term)
Perform a title-only search query and return a result set.
completionSearchBackendOverfetch( $search)
Perform an overfetch of completion search results.
setHookContainer(HookContainer $hookContainer)
replacePrefixes( $query)
Parse some common prefixes: all (search everything) or namespace names and set the list of namespaces...
static fromTitle( $score, Title $title)
Create suggestion from Title.
defaultPrefixSearch( $search)
Simple prefix search for subpages.
const COMPLETION_PROFILE_TYPE
Profile type for completionSearch.
Generic operation result class Has warning/error list, boolean status and arbitrary value.
textAlreadyUpdatedForIndex()
If an implementation of SearchEngine handles all of its own text processing in getTextFromContent() a...
static fromTitles(array $titles, $hasMoreResults=false)
Builds a new set of suggestion based on a title array.
Interface for configuration instances.
setSort( $sort)
Set the sort direction of the search results.
An utility class to rescore search results by looking for an exact match in the db and add the page f...
Implementation of near match title search.
const CHARS_NO_SYNTAX
Integer flag for legalSearchChars: includes all chars allowed in a search term.
getNearMatcher(Config $config)
Get service class to finding near matches.
searchText( $term)
Perform a full text search query and return a result set.
Marker class for search engines that can handle their own pagination, by reporting in their ISearchRe...
setAugmentedData( $name, $data)
Sets augmented data for result set.
A set of SearchEngine results.
updateTitle( $id, $title)
Update a search index record's title only.
setNamespaces( $namespaces)
Set which namespaces the search should include.
filter( $callback)
Filter the suggestions array.
maybePaginate(Closure $fn)
Performs an overfetch and shrink operation to determine if the next page is available for search engi...
update( $id, $title, $text)
Create or update the search index record for the given page.
const DEFAULT_CONTEXT_LINES
getTextFromContent(Title $t, Content $c=null)
Get the raw text for updating the index from a content object Nicer search backends could possibly do...
static newGood( $value=null)
Factory function for good results.
shrink( $limit)
Remove any extra elements in the suggestions set.
static runner()
Get a HookRunner instance for calling hooks using the new interfaces.
getHookRunner()
Get a HookRunner for running core hooks.
normalizeNamespaces( $search)
Makes search simple string if it was namespaced.
rescore( $key)
Move the suggestion at index $key to the first position.
setShowSuggestion( $showSuggestion)
Set whether the searcher should try to build a suggestion.
doSearchArchiveTitle( $term)
Perform a title search in the article archive.
static emptySuggestionSet()
Contain a class for special pages Stable to extend.
static defaultNearMatcher()
Get near matcher for default SearchEngine.
Base interface for content objects.
completionSearch( $search)
Perform a completion search.
getSuggestedTitle()
Title object in the case this suggestion is based on a title.
doSearchText( $term)
Perform a full text search query and return a result set.
defaultSearchBackend( $namespaces, $search, $limit, $offset)
Unless overridden by PrefixSearchBackend hook...
makeSearchFieldMapping( $name, $type)
Create a search field definition.
simplePrefixSearch( $search)
Call out to simple search backend.
Represents a title within MediaWiki.
Null index field - means search engine does not implement this field.
Perform augmentation of each row and return composite result, indexed by ID.
extractTitles(SearchSuggestionSet $completionResults)
Extract titles from completion results.
const CHARS_ALL
Integer flag for legalSearchChars: includes all chars allowed in a search query.
Exception thrown when an unregistered content model is requested.
HookContainer $hookContainer
array $features
Feature values.
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
searchArchiveTitle( $term)
Perform a title search in the article archive.
setLimitOffset( $limit, $offset=0)
Set the maximum number of results to return and how many to skip before returning the first.
getFeatureData( $feature)
Way to retrieve custom data set by setFeatureData or by the engine itself.
processCompletionResults( $search, SearchSuggestionSet $suggestions)
Process completion search results.