%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 | 
 $topictitle  | 
     Topic title, in order of sequence defined by: Form field named "Title", topic preference setting named TITLE, topic name | 
 $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.  | 
     
 $text(encode:type)  | 
      Same as above, but encoded in the specified type. Possible types are the same as in ENCODE. Though ENCODE can take the extra parameter, $text(encode:type) cannot. Example: $text(encode:html)  | 
     
 $locked  | 
     LOCKED flag (if any) | 
 $date  | 
      Time stamp of last topic update, e.g. 2025-11-04 - 08:04  | 
     
 $isodate  | 
      Time stamp of last topic update, e.g. 2025-11-04T08:04Z  | 
     
 $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, encode:type)  | 
      Form field value, encoded in the specified type. Possible types are the same as in ENCODE: quote, moderate, safe, entity, html, url and csv. The encode:type parameter can be combined with other parameters described below, but it needs to be the last parameter. Example: $formfield(Description, 20, encode:html)  | 
     
 $formfield(name, render:display)  | 
      Form field value, rendered for display. For example, a form field of type color will render as a colored box. If not specified, the raw value is returned, such as a color value #336699. The render:display parameter can be combined with other parameters, but must be used after the parameters described below.  | 
     
 $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  | 
     
 $query(query-syntax, quote:")  | 
      Strings in QuerySearch result are quoted with the specified quote. Useful to triple-quote strings for use in SpreadSheetPlugin's CALCULATE, such as $query(attachments.comment, quote:''') which returns a list of triple-quoted attachment comment strings -- the spreadhseet funcions will work properly even if comment strings contain commas and parenthesis  | 
     
 $query(query-syntax, encode:type)  | 
      QuerySearch result is encoded in the specified type. This is in parallel to $formfield(name, encode:type) mentioned above  | 
     
 $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  | 
     
 $pattern(reg-exp, encode:type)  | 
      A text extracted by reg-exp is encoded in the specified type. This is in parallel to $formfield(name, encode:type) mentioned above  | 
     
 $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 | 
 $tntopics  | 
     The total number of topics matched | 
 $nwebs  | 
     The number of webs searched | 
 $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 | 
 $tntopics  | 
     The total number of topics matched | 
 $nwebs  | 
     The number of webs searched | 
 $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 (>)  | 
     
default="..." parameter default="| *Note* | Nothing found in the [[$web.WebHome][$web]] web |"
Variables that can be used in the default 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 (>)  | 
     
%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.
Note: Another option, instead of a nested search, is to create a hash. Refer to the blog TWiki:Blog.BlogEntry201603x1
%SEARCH{
 "\.*"
 scope="topic"
 type="regex"
 nosearch="on"
 nototal="on"
 sort="modified"
 reverse="on"
 format="| [[$topic]] | $wikiusername  | $date |"
 limit="7"
}%=
To get this:
| UserReports | TWikiContributor | 29 May 2015 - 23:43 | 
| WebTopBar | TWikiContributor | 19 Jun 2014 - 03:03 | 
| TWikiAccessDotPm | TWikiContributor | 14 Oct 2013 - 08:02 | 
| WebPreferencesHelp | TWikiContributor | 25 Sep 2013 - 19:36 | 
| VarX | TWikiContributor | 14 Sep 2013 - 07:33 | 
| VarADDTOHEAD | TWikiContributor | 13 Sep 2013 - 00:05 | 
| WysiwygPluginSettings | TWikiContributor | 12 Sep 2013 - 05:06 | 
%CALCULATE{$SET(weekold, $TIMEADD($TIME(), -7, day))}% %SEARCH{ "." scope="topic" type="regex" web="Main" nonoise="on" sort="modified" reverse="on" format="$percntCALCULATE{$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 CALCULATE gets executed once for each search hit
weekold date
<nop> is returned, which gets removed at the end of the TWiki rendering process
date="..." paramter in SEARCH to restrict the date.
date="" parameter as shown in the next example.
%SEARCH{
 "."
 scope="topic"
 type="regex"
 web="%USERSWEB%"
 nonoise="on"
 sort="modified"
 reverse="on"
 format="| [[$web.$topic][$topic]] | $wikiusername | $date | $rev |"
 limit="100"
 date="P1w/$today"
}%=
To get this:
%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="search"}%"
 type="keyword"
 format="   * $web.$topic: %BR% $summary"
 nosearch="on"
}%
To get this:
Result:
Related Topics: UserDocumentationCategory, SearchHelp, VarSEARCH, VarENCODE, SearchResultsPagination, SearchPatternCookbook, RegularExpression, QuerySearch
-- Contributors: TWiki:Main.PeterThoeny