Search nodes

Search nodes give you the power to find anything, anywhere in Tana. They are easy to make, and can exist anywhere you can add a node. The many search operators available put advanced tools in your hands to create very specific searches according to your needs.

Overview

Search nodes retrieve nodes from any workspace you have access to. Results show up as references to nodes. Editing these nodes will edit the original and every reference of it.

What a search node retrieves is based on the search query. The query specifies what you are looking for, and is made in the Query builder.

Search nodes have a magnifying glass as a bullet icon. So they're recognizable even when collapsed.

Basics

  • Search nodes run queries on your Tana data. Examples of queries include:
    • Look for recipes with specific ingredients: Find all nodes tagged #recipes with the field Ingredient==Tomatoes, Peppers
    • Look for filled-out Feedback fields under a draft: Find all nodes with field Feedback==Set that is descendant of the node Q4 workplan draft
    • Look for unfinished tasks with a date older than a specific date: Find nodes tagged #todo that is NOT DONE, and with a date that is older (less) than January 10
  • Queries are composed in the Query builder. The builder uses search operators that come in the form of Tana objects. All operators are listed here: Search operators. For an explainer on how to read queries, check out this article.
  • Search nodes only run when expanded. This means they are not running live in the background while collapsed.
  • You can add nodes via the list of results. These nodes end up on the daily page of the workspace the search node lives in. It will try to create a node that follows the conditions of the query. If it isn't able to, it will show as a "mismatch".
  • You can add a view to a search node. You can apply views to all nodes that have children, including search nodes.
  • Returned results are limited to a maximum of 2500 nodes. If you run searches that return more than 2500 nodes, it will not run and you'll be prompted to change your query to narrow your search even further.

Documentation

Creating a search node

Create a search node with a basic query

Find nodes in the command line guides you through a simple set of search terms:

  • Press Cmd/Ctrl+K > Find Nodes, then hit Enter and continue following the menu to specify what you're looking for.
  • Once you're done, choose the "show as list" option which will create the search node with the query pre-populated and as a list.

You can always modify the query after it's been created through the command line by opening the Query builder.

If you want to create an empty search node to have access to all options immediately, see the next section:

Create a search node with empty query

  • On any node, type ? , then click on the ✨Create search node button.
  • The Query builder will open immediately upon creation.

About queries

  • A search node filters results based on its query.
  • A query consists of one or more conditions that must be met in order for results to show up.
  • The queries can be seen by opening the Query builder.

Deleting a search node

  • Like with regular nodes, to delete a search node use right-click on the node and select "Delete node/reference", or use Cmd/Ctrl+Shift+Backspace
  • Treat a search node like you would deleting nodes and references.

Query builder

  1. The query builder (formerly "search expression") popup
  2. Area for composing the query
  3. Easy access to search operators, field values, system fields and more
  4. Linter that shows current query written out as plain code
  5. "Run once" refreshes results while the builder is still open, and "Done" closes builder and refresh results)

AND wrapper

The entire query is wrapped in an AND operator, so by default every search criteria on the the query will return results that match every condition. For example, the screenshot below is looking for all nodes tagged #todo, AND it has to be NOT DONE, AND with a date that is older (less) than January 10 . Nodes have to meet all criteria listed.

Search operators

Below is the full list of all operators that work in the query builder.

Nodes and text

Tana objects that can be used in the query builder:

OPERATORDESCRIPTIONLINTER
A referenceInserting a reference will return only descendants of the reference. Tip: Reference a Workspace to limit results to nodes that live in that Workspace only.DescendantOf:nodeName
A supertagInserting a supertag reference will return only instances of that supertag. Type # and a list of supertags will pop up.Tag:tagName
A field definitionInserting a field definition will return only nodes that have this field, and a value set for it.hasField:fieldName
A field with one or more valuesInserting one or more plain text or reference values in a field will return nodes with this field that contain any of these values.fieldName==Hello world
A plain text nodeInserting a plain text node that is not a reference will return nodes that match the text.StringMatch:"hello world"
A node with a dateInserting a date will return nodes whose name contains a dateDateWithin:date
A regular expression between /.../Inserting a regular expression between the two forward slashes will return nodes that match the regular expression.RegexpMatch:/yourRegEx/

Field operators

Add values to these fields to configure them.

OPERATORDESCRIPTIONLINTER
>ANDAll of the clauses in the field values should match. AND is implied at the top level of the query builder as well.AND
>ORAny of the clauses in the field values should match.OR
>NOTNegates a single clause (if you want to negate multiple, you need multiple NOT statements).NOT
>LTLT = Less than. The LT field value should be the field you want to query with a field value (a number/date). This finds nodes that have a value less than the value provided. Also works with dates.fieldName < fieldValue
>GTGT = Greater than. The GT field value should be the field you want to query with a field value (a number/date). This finds nodes that have a value greater than than the value provided. Also works with dates.fieldName > fieldValue
>LINKS TOThe LINKS TO operator finds all nodes that link to the reference in the field value. Only takes references or PARENT/GRANDPARENT. Similar to what is shown in a node's reference section.LinksTo:nodeName
>CHILD OFIf the field value is a reference, the CHILD OF operator finds nodes/references that are children of the reference. If the field value is a field definition, the operator finds nodes/references that are children of this field.ChildOf:nodeName
>OWNED BYThe OWNED BY operator finds nodes that are children of and owned by the reference in the field value.OwnedBy:nodeName

Keyword operators

Type these keywords into a first-level empty node in the query builder.

Node type

OPERATORDESCRIPTIONLINTER
IS TAGA keyword that finds any supertag definition.is:Tag
IS FIELDA keyword that finds any field definition.is:Field
IS CALENDAR NODEA keyword that finds year/week/day nodes under the calendar. Useful for excluding these from searches.is:CalendarNode
IS SEARCH NODEA keyword that finds any search node.is:SearchNode
IS COMMANDA keyword that finds any command node.is:Command
IS PUBLISHEDA keyword that finds any published node.is:PublishedNode

Node contents

OPERATORDESCRIPTIONLINTER
HAS FIELDA keyword that finds any node with a field.has:Field
HAS TAGA keyword that finds any node that has a supertag applied.has:Tag
HAS MEDIAA keyword that finds any node with a media attachment (audio, video, or image).has:Media
HAS AUDIOA keyword that finds any node with an audio attachment.has:Audio
HAS VIDEOA keyword that finds any node with a video attachment.has:Video
HAS IMAGEA keyword that finds any node with a image attachment.has:Image
FOR DATE [yyyy-mm-dd]A keyword that finds all nodes with an inline reference to the date specified.FOR DATE 2023-10-18

Scope

OPERATORDESCRIPTIONLINTER
PARENTS DESCENDANTSA keyword that finds nodes that are descendants of the parent of the search node, excluding references.DescendantOf:parentnodeName
GRANDPARENTS DESCENDANTSA keyword that finds nodes that are descendants of the grandparent of the search node, excluding references.DescendantOf:grandparentnodeName
PARENTS DESCENDANTS WITH REFSA keyword that finds nodes that are descendants of the parent of the search node, including references.InTreeUnder:parentnodeName
GRANDPARENTS DESCENDANTS WITH REFSA keyword that finds nodes that are descendants of the grandparent of the search node, including references.InTreeUnder:grandparentnodeName
IN LIBRARYA keyword that finds direct children of a Library node. The Library is a default node in each workspace.in:Library
ON DAY NODEA keyword that finds direct children of calendar day nodes.on:DayNode
SIBLING NAMED "[name]"A keyword that limits the search to descendants of the named sibling. Example: SIBLING NAMED "Meeting notes".DescendantOf:siblingnodeName

Checkbox

OPERATORDESCRIPTIONLINTER
TODOA keyword that finds all nodes with a checkbox, regardless if it is checked or not.is:Todo
DONEA keyword that finds any checked todos.is:Done
DONE LAST [num] DAYSA keyword that finds any todos that were manually checked within a certain number of days. Replace [num] with a number. Example: DONE LAST 7 DAYS.DONE LAST 3 DAYS
NOT DONEA keyword that finds any "not done" nodes, and unchecked todos. Combine with TODO to only find unchecked todos.NOT is:Done
OVERDUEAn old keyword that finds any unchecked todos 1. using the system-defined Due Date field, and 2. with a date value that is older than today's date. For a more robust overdue search query, see Examples section below.is:Overdue

Created/edited

OPERATORDESCRIPTIONLINTER
CREATED LAST [num] DAYSA keyword that finds any nodes created within a certain number of days. Replace [num] with a number. Example: CREATED LAST 7 DAYS.CREATED LAST 3 DAYS
EDITED BY [user email] LAST [num] DAYSA keyword that finds any nodes modified by a Tana user within a certain number of days. Replace [user email] with the email of the workspace member, and [num] with a number. Example: MODIFIED BY olaf@tana.inc LAST 7 DAYS.EDITED BY USER@TANA.COM LAST 3 DAYS
EDITED BY [user email] ANYTIMEA keyword that finds all nodes modified by a Tana user. Example: MODIFIED BY olaf@tana.inc ANYTIME. EDITED BY USER@TANA.COM ANYTIME
EDITED LAST [num] DAYSA keyword that finds all nodes edited within a certain number of days relative to today. Example: EDITED LAST 7 DAYS.EDITED LAST 3 DAYS

Field values

Use these as field values:

OPERATORDESCRIPTIONLINTER
PARENTUse in any field. Inserts the parent node relative to the search node. Useful for finding nodes with fields that use the parent/grandparent node as a field value, such as every #author node finding all #books they're the >Author of.fieldName==parentnodeName
GRANDPARENTUse in any field. Inserts the grandparent node relative to the search node. Useful for finding nodes with fields that use the parent/grandparent node as a field value, such as every #author node finding all #books they're the >Author of.fieldName==grandparentnodeName
FOR RELATIVE DATE [term]Use in date fields only. Inserts a date relative to today. Valid terms: yesterday, today, tomorrow, last/this/next week, last/this/next month. Example: FOR RELATIVE DATE next week.Date==RelativeDate:term=yyyy-mm-dd [timezone]
"Set"A system node you can use in any field. Finds nodes where this field exists and has a value.fieldName==Set
"Not Set"A system node you can use in any field. Finds nodes where this field does not exist, or has no value. Warning: will find many nodes.fieldName==Not set
"Defined" A system node you can use in any field. Finds nodes where a field is defined/used in a supertag template, but might still be empty.HasField:fieldName
"Not Defined"A system node you can use in any field. Finds nodes where a field is not defined/used in a supertag template, or does not exist. Warning: will find many nodes.NOT HasField:fieldName

PARENT/GRANDPARENT (P/GP) field values

Other than inserting the parent/grandparent node relative to the search node, these values have additional features that apply to fields and dates:

They can point to a field on the P/GP node using dot notation.

Example 1: PARENT.Description will point at the Description field on the parent.

Example 2: On a meeting node you could have a search to find other meetings for the related project of this meeting:

  • #meeting
  • >Related project==PARENT.Related project

They can be used for date comparisons under any calendar node

Using PARENT in a search node under a week or year node can now be used for date comparisons such as “find all tasks completed this week”. These date items will get the right granularity (day vs. week/month/year)

Also, PARENT that points at a date or a day/week/year node can do simple arithmetic. PARENT-7 on a day node would get the day 7 days earlier, PARENT+3 on a week node will get a date 3 weeks in the future.

Dot notation and date arithmetic can be combined in a field value

You can combine fields with date arithmetic, so PARENT.Due date+3 will be replaced with a date 3 days ahead of the date in the Due date field.

Search operator examples

Our Navigators have created a Tana Template full of search examples that allow you to interact with many of the operators below to see how they work. They cover the basics and will continuously be updated as we surface more useful examples from the community. Click below to save the resource in one of your Tana workspaces (opens a new tab):

Install: Tana Live Search Examples

Linter

About the linter

In the query builder, see marker 4 for the location of the linter.

The linter uses simple "code" to display the query logic without the fluff of the query builder interface.

By reading the output of the linter, you'll be able to tell if your query is configured as intended or not.

You'll know because all search operators show up in the linter in very specific ways. For instance, the linter will often "transform" from one state to the other as you're adding or typing out the operators. These provide clear clues on whether the operators are correctly setup or not.

See the column "Linter" in the list of search operators for what they should appear like in the linter if properly added.

Reading the linter structure

  • A condition is a question you're asking of Tana.
    • Example: Find all tasks that are not done, and due today.
  • Search operators are used to compose these questions, using one line for each condition. In the linter, they will look like this:
    • TODO
    • NOT DONE
    • Deadline < (RelativeDate:TODAY)
  • All conditions get wrapped in parentheses:
    • (TODO)
    • (NOT DONE)
    • (Deadline < (RelativeDate:TODAY))
  • Every top-level condition gets separated by the AND operator, because it wraps the entire query builder:
    • (TODO) AND (NOT DONE) AND (Deadline < (RelativeDate:TODAY))
  • To use the OR or NOT operators, they are added within the top-level AND operator, nested queries with OR and NOT operators will appear like this:
    • (TODO) AND (NOT DONE) AND (Deadline < (RelativeDate:TODAY)) AND ((Priority==P2) OR (Priority==P3)) AND (NOT Assigned to==Fei)
    • The above query is asking the following: Find nodes that are unchecked, with Deadline before Today, P2s or P3s, and are not assigned to Fei.

Examples

Searches in day supertag template

Put a search node in a day supertag template that has a field referencing the PARENT (will show up as "Date: Today, Wed, Oct 18" in linter). This will create searches that find nodes with dates that refer to that day like events, tasks, birthdays.

Searches in supertag template

Put a search node in a supertag template that has a field referencing the PARENT (will show up as INSTANCE in the linter). This will make searches adapt based on the instance. Example: a #person supertag with a search node that looks for all meetings where this #person has attended.

Find overdue tasks (using any field)

If your #tasks have checkboxes and a date field that signifies a due/do date, or deadline, you can build a query in your daily page (important) to find all tasks that are 1. unchecked, and 2. older than today. It will look like this:

  • #task
  • NOT DONE
  • >LT: >Date: PARENT


Related release notes

  • fixedWe fixed an issue where we used to allow you to delete nodes that are just created in a search node without having to Hard Delete ()
  • fixedPasting into a search results table no longer creates a spurious 🥸 new node. The nodes are now properly welcome to our table. 🍽️ ()
  • improvedYou can now use CHILD OF with a field definition to point to a field on the node that owns the search. So a search under "Brage" set up with: - "PARENTS DESCENDANTS", - and >CHILD OF::Properties. Would find "awesome" and "release note aficionado" ()
  • improvedWe removed the Done system field from the query builder, and added a lint suggestion to use "DONE" and "NOT DONE" instead. ()
  • improvedRemoved the 'Done' and 'Name' system fields from the search expression query builder UI: the 'Done' don't work like people expect and for 'Name' we have better ways... 🧙 ()
  • fixedIn the query builder, we used to be smart and get you a list of supertag definitions when you hit "#". Then we somehow reverted back to pre-2023 functionality that just inserted an empty, tagged node if you hit "#", which - let's face it - wasn't particularly useful in this context. Tag defs when you hit # is now back. ()
  • fixedWe fIxed a bug where newly created nodes in live searches did not immediately enter edit mode. ()
  • newYou can now easily create a search based on any tag from the slash menu. Just slash-and-search and your #soap-carving nodes will appear quick as you like. ()
  • improvedSlight improvement to search ranking. Every little helps. ()
  • fixedFixed issue with PARENT/PARENT.field not working correctly when pointing at a date field ()
  • fixedFixed issue for newly created nodes in searches with PARENT.field / PARENT+- number ()
  • fixedFixed issue where "Date from calendar node" search would not work with week/month/year input. ()
  • fixedCode blocks will now appear in search nodes (not in Cmd+S searches or at-mentions), as long as they meet the search query. ()

Related FAQs

  • How can I configure the view of a search node that exists in a supertag template? It's not showing me all options.

    Problem

    The query doesn't run in the template editor and so there are no search results available with which to set sort or group options.
    Until we have fixed this issue, this is a workaround that has been perfected by community member Darren Brierton (this is part of the new series called Darren's Frequently Answered Questions, or the D'FAQ if you may).

    Answer

    1. Create the search on the actual node, and adjust its options there.
    2. Then, open Filter and fill the text filter with gibberish (like "xyjzkwq") so the search node returns zero results
    3. Then, cut and paste (Cmd/Ctrl+X / Cmd/Ctrl+V) the search node into the supertag template
    4. Expand the node, and remove the gibberish text

    Are the gibberish text instructions necessary?

    The reason why the filter instructions are needed is because it prevents stale results from being copied over to the supertag template.

    Thank you Darren for drafting these thorough instructions until we sort things out!
  • How can I find all nodes that have a specific word?

    There are multiple ways to search for a specific word - say you're looking for all nodes with the word bottle in it.

    • Option 1: Use the global search (Cmd/Ctrl+S) and enter bottle - then Option+Enter - and the search will be made into a search node in your workspace, and shown in a panel
    • Option 2: Cmd/Ctrl+K > Find nodes with text="bottle" as list
    • Option 3: In a search node, enter >LINKS TO::@bottle to find only linked items to the node
    • Option 4: In a search node, if you're searching for a node that has this word within its field's value, enter the field in the search and the value /bottle/ . Be sure to put the slashes as shown, this will run the value as a regex match
    Source of FAQ: Tana Community Resource Hub
  • How can I find all tags that extend a tag?

    One way is to create this search node:

    • >system field Tags : #tag (use supertag that was extended)
    • IS TAG

    Example: