%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 | 
| $nor$n() | New line. Use $n()if followed by alphanumeric character, e.g. writeFoo$n()Barinstead ofFoo$nBar | 
| $nopor$nop() | Is a "no operation". This variable gets removed; useful for nested search | 
| $quotor\" | 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 ENCODEcan take theextraparameter,$text(encode:type)cannot. Example:$text(encode:html) | 
| $locked | LOCKED flag (if any) | 
| $date | Time stamp of last topic update, e.g. 2025-10-31 - 16:57 | 
| $isodate | Time stamp of last topic update, e.g. 2025-10-31T16:57Z | 
| $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 asALLTWIKI{...} | 
| $summary(expandvar) | Topic summary, with %ALLTWIKI{...}%variables expanded | 
| $summary(noheader) | Topic summary, with leading ---+ headersremovedNote: 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 toPublicFAQ. 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,urlandcsv. Theencode:typeparameter 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. Therender:displayparameter 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.gifattachments, such as848, 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 $formfieldinstead). In case of amultiple="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$ntopicsunlessmultiple="on" | 
| $nor$n() | New line. Use $n()if followed by alphanumeric character, e.g. writeFoo$n()Barinstead ofFoo$nBar | 
| $nopor$nop() | Is a "no operation". This variable gets removed; useful for nested search | 
| $quotor\" | 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$ntopicsunlessmultiple="on" | 
| $nor$n() | New line. Use $n()if followed by alphanumeric character, e.g. writeFoo$n()Barinstead ofFoo$nBar | 
| $nopor$nop() | Is a "no operation". This variable gets removed; useful for nested search | 
| $quotor\" | 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 | 
| $nor$n() | New line. Use $n()if followed by alphanumeric character, e.g. writeFoo$n()Barinstead ofFoo$nBar | 
| $nopor$nop() | Is a "no operation". This variable gets removed; useful for nested search | 
| $quotor\" | 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 . A search using hashes, if possible, may be significantly faster than a nested search.
. A search using hashes, if possible, may be significantly faster than a nested search.
%SEARCH{
 "\.*"
 scope="topic"
 type="regex"
 nosearch="on"
 nototal="on"
 sort="modified"
 reverse="on"
 format="| [[$topic]] | $wikiusername  | $date |"
 limit="7"
}%=
To get this:
| BeamTeamMettings | PeterKammel | 2025-10-28 - 15:48 | 
| PeterBeamResults | PeterKammel | 2025-02-27 - 19:30 | 
| G4BLStudiesPeter | PeterKammel | 2025-02-27 - 06:03 | 
| WelcomeGuest | GaryHolman | 2025-01-02 - 19:25 | 
| WikiWord | GaryHolman | 2025-01-02 - 19:25 | 
| TWikiTutorial | GaryHolman | 2025-01-02 - 19:25 | 
| TWikiUpgradeGuide | GaryHolman | 2025-01-02 - 19:25 | 
 . The following example shows all topics in the Main web that have been updated in the last 7 days.
Write this:
. The following example shows all topics in the Main web that have been updated in the last 7 days.
Write this:
%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 , TWiki:Main.CrawfordCurrie
, TWiki:Main.CrawfordCurrie , TWiki:Main.SopanShewale
, TWiki:Main.SopanShewale 
  
  Copyright &© 1999-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Copyright &© 1999-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.