SearchPatterns

Summary: Q & A's on search patterns
Version:
Prerequisites:
Status:
Maintainer:
Users: +1 (View / Edit)
Categories: Searching

How do I specify patterns to include, and patterns to exclude?

Patterns can be either regexes to include ('/'), regexes to exclude ('!'):

Exclusion:

$SearchPatterns['default'][] = '!^MyGroup\.ExcludeThisPage$!';

Inclusion:

$SearchPatterns['default'][] = '/^MyGroup\.IncludeThisPage$/';

How do I exclude certain pages from the search results?

$SearchPatterns['default'][] = '!^MyGroup\.ExcludeThisPage$!';

excludes MyGroup.ExcludeThisPage from the default search.

How do I remove groups from search

A search for "/" displays the group name and the name of all the pages it contains.

By using various search terms, information can be gleaned from the supposedly private pages. For example, a search for "Project X" hits the page "`Private.Budget", implying some discussion of the project in the budget.

Remove the Private group from searches, by adding:

$SearchPatterns['default'][] = '!^Private\.!';
$SearchPatterns['all'][] = '!^Private\.!';
$SearchPatterns['normal'][] = '!^Private\.!'; 

A side effect of the code above is that the (:pagelist:) markup no longer lists the Private pages. To make it work inside the Private group change your config.php to read:

if (strncmp($pagename, 'Private.', 8) != 0) {
'    # as above
} 

This excludes the Private group from searches only if you're not already in the Private group.

How do I stop search returning the current page

The pagelist macro lists itself in its search. Thus (:pagelist Category/Geese:) will return a page where the ONLY reference to "Category/Geese" is within the macro. If there were another reference, I understand, but this gets in the way of what I'm trying to do, which is have a page that lists all pages that mention that category in the page.

Add the following to your config.php:

$SearchPatterns['default'][] = FmtPageName('!^$FullName$!', $pagename);

This will prevent a page from listing itself in (:pagelist:) or (:searchresults:).

Include in search results a specific page

How can I include in a page the results of a search for (/ -"PmWiki" -"Profiles") by using (:searchresults:).

If you're wanting to do exactly what it says -- i.e., display all pages that do not have either "PmWiki" or "Profiles" in the text, then it's just (:searchresults -"PmWiki" -"Profiles" :).

But if you're wanting to display all pages that are not in the PmWiki or Profiles groups, you'll probably want to create a custom search list: In config.php:

$SearchPatterns['nopp'][] = '!^(PmWiki|Profiles)\.!';

Then in the markup, use one of (:pagelist list=nopp:) or (:searchlist list=nopp:). If you're wanting this to be the default for all searches/page listings, use 'default' instead of 'nopp':

$SearchPatterns['default'][] = '!^(PmWiki|Profiles)\.!';

This is somewhat described at SearchResults.

Is there a way to create an exclusion array for groups to feed to (:pagelist:) like $SearchPatterns?

$SearchPatterns works on full pagenames, not just the part after the group. So if you want to exclude the PmWiki group by default:

$SearchPatterns['default'][] = '!^PmWiki\.!';

If you want to exclude the PmWiki group from the "normal" page listings (i.e., via list=normal):

$SearchPatterns['normal'][] = '!^PmWiki\.!';

And if you want to create a list=restricted option that excludes a certain set of groups...

$SearchPatterns['restricted'][] = '!^(Secret|XXX|Verboten)\.!';

What is the syntax for excluding pages with the SearchPatterns?

The pagelist.php script contains:

$SearchPatterns['normal'][] = '!\.(All)?Recent(Changes|Uploads)$!';
$SearchPatterns['normal'][] = '!\.Group(Print)?(Header|Footer|Attributes)$!';

You can add other patterns in local/config.php

$SearchPatterns['default'][] = '!^PmWiki.*\.!';

The use of exclamation points as the pattern delimiters tells PmWiki this is a pattern to be excluded from the list rather than included.

Similarly:
$SearchPatterns['default'][] = '!^BMIT\.!';
$SearchPatterns['default'][] = '!\.GroupHeader$!'; # exclude all GroupHeaders
$SearchPatterns['default'][] = '!\.GroupFooter$!';
$SearchPatterns['default'][] = '!\.Template!';   # exclude all pages starting with "Template" 

What can you specify with the list-parameter for these markups?

The list= parameter specifies which set of $SearchPatterns you want to use. The default is "list=default", other built-in choices are "list=all" and "list=normal". (List=normal excludes RecentChanges, GroupHeader, GroupFooter, etc.)

How can I specify several groups to search (include search) and exclude others?

$SearchPatterns[] expects all INCLUSIVE conditions to be in a SINGLE entry while EXCLUSIVE patterns can be in as many array elements as you like. Use | as a delimiter:

$SearchPatterns['default'][] ='/^(Group1|Group2|Group3|Group4|M.*)\\./';
$SearchPatterns['default'][] ='!^Main\.!'; 
Result: limit search to articles in Group1 to Group4, and in groups starting with M but not in group Main.

Notes and Comments

See Also

Contributors