%SEARCH{...}% is a table consisting of topic names and topic summaries. Use the format="..." parameter to customize the search result. The format parameter typically defines a bullet or a table row containing variables, such as %SEARCH{ "food" format="| $topic | $summary |" }%. See %SEARCH{...}% for other search parameters, such as separator="".
header="..." parameter header="| *Topic:* | *Summary:* |"
Variables that can be used in the header string:
             | Name: | Expands To: | 
|---|---|
 $web  | 
     Name of the web | 
 $n or $n()  | 
      New line. Use $n() if followed by alphanumeric character, e.g. write Foo$n()Bar instead of Foo$nBar  | 
     
 $nop or $nop()  | 
     Is a "no operation". This variable gets removed; useful for nested search | 
 $quot or \"  | 
      Double quote (")  | 
     
 $aquot  | 
      Apostrophe quote (')  | 
     
 $percnt  | 
      Percent sign (%)  | 
     
 $dollar  | 
      Dollar sign ($)  | 
     
 $lt  | 
      Less than sign (<)  | 
     
 $gt  | 
      Greater than sign (>)  | 
     
format="..." parameter format="| $topic | $summary |"
Variables that can be used in the format string:
             | Name: | Expands To: | 
|---|---|
 $web  | 
     Name of the web | 
 $topic  | 
     Topic name | 
 $topic(20)  | 
     Topic name, "- " hyphenated each 20 characters | 
 $topic(30, -<br />)  | 
     Topic name, hyphenated each 30 characters with separator "-<br />" | 
 $topic(40, ...)  | 
     Topic name, shortened to 40 characters with "..." indication | 
 $parent  | 
     Name of parent topic; empty if not set | 
 $parent(20)  | 
      Name of parent topic, same hyphenation/shortening like $topic()  | 
     
 $text  | 
      Formatted topic text. In case of a multiple="on" search, it is the line found for each search hit.  | 
     
 $locked  | 
     LOCKED flag (if any) | 
 $date  | 
      Time stamp of last topic update, e.g. 04 Nov 2025 - 13:31  | 
     
 $isodate  | 
      Time stamp of last topic update, e.g. 2025-11-04T13:31Z  | 
     
 $rev  | 
      Number of last topic revision, e.g. 4  | 
     
 $username  | 
      Login name of last topic update, e.g. jsmith  | 
     
 $wikiname  | 
      Wiki user name of last topic update, e.g. JohnSmith  | 
     
 $wikiusername  | 
      Wiki user name of last topic update, like Main.JohnSmith  | 
     
 $createdate  | 
     Time stamp of topic revision 1 | 
 $createusername  | 
      Login name of topic revision 1, e.g. jsmith  | 
     
 $createwikiname  | 
      Wiki user name of topic revision 1, e.g. JohnSmith  | 
     
 $createwikiusername  | 
      Wiki user name of topic revision 1, e.g. Main.JohnSmith  | 
     
 $summary  | 
     Topic summary, just the plain text, all TWiki variables, formatting and line breaks removed; up to 162 characters | 
 $summary(50)  | 
     Topic summary, up to 50 characters shown | 
 $summary(showvarnames)  | 
      Topic summary, with %ALLTWIKI{...}% variables shown as ALLTWIKI{...}  | 
     
 $summary(expandvar)  | 
      Topic summary, with %ALLTWIKI{...}% variables expanded  | 
     
 $summary(noheader)  | 
      Topic summary, with leading ---+ headers removedNote: The tokens can be combined, for example $summary(100, showvarnames, noheader)  | 
     
 $changes  | 
     Summary of changes between latest rev and previous rev | 
 $changes(n)  | 
     Summary of changes between latest rev and rev n | 
 $formname  | 
     The name of the form attached to the topic; empty if none | 
 $formfield(name)  | 
      The field value of a form field; for example, $formfield(TopicClassification) would get expanded to PublicFAQ. This applies only to topics that have a TWikiForm  | 
     
 $formfield(name, 10)  | 
     Form field value, "- " hyphenated each 10 characters | 
 $formfield(name, 20, -<br />)  | 
     Form field value, hyphenated each 20 characters with separator "-<br />" | 
 $formfield(name, 30, ...)  | 
     Form field value, shortened to 30 characters with "..." indication | 
 $query(query-syntax)  | 
      Access topic meta data using SQL-like QuerySearch syntax. Example:  • $query(attachments.arraysize) returns the number of files attached to the current topic • $query(attachments[name~'*.gif'].size) returns an array with size of all .gif attachments, such as 848, 1425, 923 • $query(parent.name) is equivalent to $parent  | 
     
 $pattern(reg-exp)  | 
      A regular expression pattern to extract some text from a topic (does not search meta data; use $formfield instead). In case of a multiple="on" search, the pattern is applied to the line found in each search hit.• Specify a RegularExpression that covers the whole text (topic or line), which typically starts with .*, and must end in .* • Put text you want to keep in parenthesis, like $pattern(.*?(from here.*?to here).*) • Example: $pattern(.*?\*.*?Email\:\s*([^\n\r]+).*) extracts the e-mail address from a bullet of format * Email: ... • This example has non-greedy .*? patterns to scan for the first occurance of the Email bullet; use greedy .* patterns to scan for the last occurance • Limitation: Do not use .*) inside the pattern, e.g. $pattern(.*foo(.*)bar.*) does not work, but $pattern(.*foo(.*?)bar.*) does • Note: Make sure that the integrity of a web page is not compromised; for example, if you include an HTML table make sure to include everything including the table end tag  | 
     
 $count(reg-exp)  | 
      Count of number of times a regular expression pattern appears in the text of a topic (does not search meta data). Follows guidelines for use and limitations outlined above under $pattern(reg-exp). Example: $count(.*?(---[+][+][+][+]) .*) counts the number of <H4> headers in a page.  | 
     
 $ntopics  | 
     Number of topics found in current web. This is the current topic count, not the total number of topics | 
 $nhits  | 
      Number of hits if multiple="on". Cumulative across all topics in current web. Identical to $ntopics unless multiple="on"  | 
     
 $n or $n()  | 
      New line. Use $n() if followed by alphanumeric character, e.g. write Foo$n()Bar instead of Foo$nBar  | 
     
 $nop or $nop()  | 
     Is a "no operation". This variable gets removed; useful for nested search | 
 $quot or \"  | 
      Double quote (")  | 
     
 $aquot  | 
      Apostrophe quote (')  | 
     
 $percnt  | 
      Percent sign (%)  | 
     
 $dollar  | 
      Dollar sign ($)  | 
     
 $lt  | 
      Less than sign (<)  | 
     
 $gt  | 
      Greater than sign (>)  | 
     
footer="..." parameter footer="| *Topic* | *Summary* |"
Variables that can be used in the footer string:
             | Name: | Expands To: | 
|---|---|
 $web  | 
     Name of the web | 
 $ntopics  | 
     Number of topics found in current web | 
 $nhits  | 
      Number of hits if multiple="on". Cumulative across all topics in current web. Identical to $ntopics unless multiple="on"  | 
     
 $n or $n()  | 
      New line. Use $n() if followed by alphanumeric character, e.g. write Foo$n()Bar instead of Foo$nBar  | 
     
 $nop or $nop()  | 
     Is a "no operation". This variable gets removed; useful for nested search | 
 $quot or \"  | 
      Double quote (")  | 
     
 $aquot  | 
      Apostrophe quote (')  | 
     
 $percnt  | 
      Percent sign (%)  | 
     
 $dollar  | 
      Dollar sign ($)  | 
     
 $lt  | 
      Less than sign (<)  | 
     
 $gt  | 
      Greater than sign (>)  | 
     
%SEARCH{}% are evaluated once before the search. This is OK for variables that do not change, such as %SCRIPTURLPATH%. Variables that should be evaluated once per search hit must be escaped. For example, to escape a conditional:
    %IF{ "..." then="..." else="..." }%
    format="$percntIF{ \"...\" then=\"...\" else=\"...\" }$percnt"
%SEARCH{ "FAQ" scope="topic" nosearch="on" nototal="on" header="   * *Topic: Summary:*" format="   * [[$topic]]: $summary"  footer="   * *Topic: Summary*"  }%
To get this:
 TopicClassification field, an OperatingSystem field and an OsVersion field we could write:
| *Topic:* | *OperatingSystem:* | *OsVersion:* | %SEARCH{ "[T]opicClassification.*?value=\"[P]ublicFAQ\"" scope="text" type="regex" nosearch="on" nototal="on" format="| [[$topic]] | $formfield(OperatingSystem) | $formfield(OsVersion) |" }%
To get this:
| Topic: | OperatingSystem | OsVersion | 
|---|---|---|
| IncorrectDllVersionW32PTH10DLL | OsWin | 95/98 | 
| WinDoze95Crash | OsWin | 95 | 
%SEARCH{ "__Back to\:__ TWikiFAQ" scope="text" type="regex" nosearch="on" nototal="on" header="TWiki FAQs:" format="   * $pattern(.*?FAQ\:[\n\r]*([^\n\r]+).*) [[$topic][Answer...]]" }%
To get this:
TWiki FAQs: %SEARCH{ "culture" format="   * $topic is referenced by: (list all references)" nosearch="on" nototal="on" }%
%SEARCH{ "(topic found in first search)" format="$topic" nosearch="on" nototal="on" separator=", " }%
$percnt to escape the leading percent of the second search
\" to escape the double quotes
$dollar to escape the $ of $topic
$nop to escape the }% sequence
%SEARCH{ "culture" format="   * $topic is referenced by:$n      * $percntSEARCH{ \"$topic\" format=\"$dollartopic\" nosearch=\"on\" nototal=\"on\" separator=\", \" }$nop%" nosearch="on" nototal="on" }%
To get this:
 $dollarpercntSEARCH{ for level three, $dollardollarpercntSEARCH{ for level four, etc.
%SEARCH{ "\.*" scope="topic" type="regex" nosearch="on" nototal="on" order="modified" reverse="on"  format="| [[$topic]] | $wikiusername  | $date |" limit="7" }%
To get this:
| WebLeftBarCommon | SvenLofgren | 2025-03-30 - 20:37 | 
| RegOmegaUser | SvenLofgren | 2019-08-27 - 19:13 | 
| TablePlugin | TWikiContributor | 2015-07-28 - 09:21 | 
| WebSearchAttachments | TWikiContributor | 2015-05-19 - 23:16 | 
| VarMETASEARCH | TWikiContributor | 2015-04-22 - 03:26 | 
| TopMenuSkinTopBar | TWikiContributor | 2014-06-19 - 03:01 | 
| TWikiDashboardAddOn | TWikiContributor | 2014-04-11 - 07:09 | 
%CALC{$SET(weekold, $TIMEADD($TIME(), -7, day))}% %SEARCH{ "." scope="topic" type="regex" web="Main" nonoise="on" order="modified" reverse="on" format="$percntCALC{$IF($TIME($date) < $GET(weekold), <nop>, | [[$web.$topic][$topic]] | $wikiusername | $date | $rev |)}$percnt" limit="100" }%
 weekold variable to the serialized date of exactly one week ago
$percnt makes sure that the CALC gets executed once for each search hit
weekold date
<nop> is returned, which gets removed at the end of the TWiki rendering process
| SiteStatistics | TWikiGuest | 2025-11-03 - 21:15 | 1954 | 
| WebStatistics | TWikiGuest | 2025-11-03 - 21:15 | 3775 | 
date="" parameter as shown in the next example.
%SEARCH{ "." scope="topic" type="regex" web="Main" nonoise="on" order="modified" reverse="on" format="| [[$web.$topic][$topic]] | $wikiusername | $date | $rev |" limit="100" date="P1w/$today" }%
To get this:
| SiteStatistics | TWikiGuest | 2025-11-03 - 21:15 | 1954 | 
| WebStatistics | TWikiGuest | 2025-11-03 - 21:15 | 3775 | 
%URLPARAM{"..."}% variable. Example:
Write this:
<form action="%SCRIPTURLPATH{"view"}%/%WEB%/%TOPIC%">
Find Topics: 
<input type="text" name="q" size="32" value="%URLPARAM{"q" encode="entity"}%" /> <input type="submit" class="twikiSubmit" value="Search" />
</form>
Result:
%SEARCH{ search="%URLPARAM{"q" encode="quote"}%" type="keyword" format="   * $web.$topic: %BR% $summary" nosearch="on" }%
To get this:
Result:
Related Topics: UserDocumentationCategory, SearchHelp, VarSEARCH, SearchPatternCookbook, RegularExpression, QuerySearch
-- Contributors: TWiki:Main.PeterThoeny