Summary: Q & A's on search patterns
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 ('!'):


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


$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.


A search for "/" displays the group name and the name of all the pages it contains. Names like Private.Budget seem to attract attention.

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.


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:).


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 Cookbook/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.

 $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