Hackorum's search supports powerful query syntax that lets you find exactly what you're looking for in the PostgreSQL Hackers mailing list archive. This guide covers all available search operators and shows you how to combine them for precise results.
The simplest search is just typing keywords:
vacuum performance
This finds topics containing both "vacuum" AND "performance" in the title or message body.
For phrases, use quotes:
"query planning"
Selectors let you search specific fields. The format is selector:value.
| Selector | Description | Example |
|---|---|---|
title: |
Search in topic titles only | title:vacuum |
body: |
Search in message bodies only | body:"shared buffers" |
Without a selector, plain text searches both title and body.
| Selector | Description | Example |
|---|---|---|
from: |
Topics with messages from author | from:andres |
starter: |
Topics started by author | starter:heikki |
last_from: |
Topics where author sent last message | last_from:robert |
me- Your own messages (requires sign-in)- Team names - Messages from any team member (e.g.,
from:core-reviewers) - Contributor types - Messages from PostgreSQL contributors:
contributor- Any contributorcommitter- PostgreSQL committerscore_team- Core team membersmajor_contributor- Major contributorssignificant_contributor- Significant contributors
from:me # Your messages
from:committer # Messages from any committer
starter:core_team # Topics started by core team members
If your search value contains @, it searches email addresses only:
from:peter@example.org # Partial email match (finds any email containing this)
from:peter # Searches both name and email (partial match)
Use quotes for exact matches:
from:"peter@example.org" # Exact email match
from:"Peter Eisentraut" # Exact name match
| Selector | Description | Example |
|---|---|---|
first_after: |
Topics created after date | first_after:2024-01-01 |
first_before: |
Topics created before date | first_before:2023 |
messages_after: |
Topics with messages after date | messages_after:1w |
messages_before: |
Topics with messages before date | messages_before:2024-06 |
last_after: |
Topics with last activity after date | last_after:today |
last_before: |
Topics with last activity before date | last_before:yesterday |
Absolute dates:
- Full date:
2024-01-15 - Month:
2024-01(first day of month) - Year:
2024(January 1st) - ISO timestamp:
2024-01-15T10:30:00
Relative dates:
today- Todayyesterday- Yesterday7d- 7 days ago2w- 2 weeks ago3m- 3 months ago (approximately 90 days)1y- 1 year ago (approximately 365 days)
first_after:2024 # Topics started in 2024 or later
last_after:1w # Topics with activity in the last week
messages_before:yesterday # Messages sent before yesterday
Search for topics by commitfest.
| Selector | Description | Example |
|---|---|---|
commitfest:name |
Topics from commitfest with this name | commitfest:PG19-Final |
commitfest:[name:name] |
Topics from commitfest with this name | commitfest:[name:PG19-Draft] |
commitfest:[status:status] |
Topics from commitfest with this status | commitfest:[status:commited] |
commitfest:[tag:tag] |
Topics from commitfest with this tag | commitfest:[tag:bugfix] |
| Selector | Description | Example |
|---|---|---|
messages: |
Filter by message count | messages:>10 |
participants: |
Filter by participant count | participants:>=5 |
contributors: |
Filter by contributor count | contributors:>0 |
messages:10- Exactly 10 messagesmessages:>10- More than 10 messagesmessages:<10- Fewer than 10 messagesmessages:>=10- 10 or more messagesmessages:<=10- 10 or fewer messages
messages:>50 participants:>10 # Large, active discussions
messages:1 has:patch # Single-message patch submissions
The has: selector checks for the presence of specific attributes:
| Value | Description |
|---|---|
has:attachment |
Topics with any attachments |
has:patch |
Topics with .patch or .diff files |
has:contributor |
Topics with PostgreSQL contributor activity |
has:committer |
Topics with committer activity |
has:core_team |
Topics with core team activity |
has:patch first_after:1m # Recent topics with patches
has:contributor messages:>5 # Active discussions with contributor input
These require being signed in and filter based on your reading state:
| Selector | Description |
|---|---|
unread:me |
Topics with unread messages |
read:me |
Topics you've fully read |
reading:me |
Topics you've partially read |
new:me |
Topics you've never seen |
starred:me |
Topics you've starred |
notes:me |
Topics where you've added notes |
Replace me with a team name to filter by team state (you must be a team member):
unread:core-reviewers # Topics unread by anyone on the team
starred:review-team # Topics starred by any team member
Search for topics by tags added to notes. Tags are private to the note author and mentioned users/teams.
| Selector | Description | Example |
|---|---|---|
tag:tagname |
Topics with this tag (from any accessible note) | tag:needs-review |
tag:tagname[from:me] |
Topics with this tag from your own notes | tag:important[from:me] |
tag:tagname[from:team] |
Topics with this tag from team member notes | tag:follow-up[from:reviewers] |
tag:[from:me] |
Topics with any tag from your notes | tag:[from:me] |
tag:[from:team] |
Topics with any tag from team's notes | tag:[from:reviewers] |
Use the [from:] condition to filter by who created the tag:
from:me- Your own tagsfrom:teamname- Tags from any team member (you must be a team member)from:username- Tags from a specific user
tag:blocked # Topics tagged "blocked" by anyone you can see
tag:review-needed[from:me] # Topics I tagged "review-needed"
tag:priority[from:core_team] # Topics tagged "priority" by core_team members
tag:[from:me] # Any topics I've tagged
-tag:done # Exclude topics tagged "done"
tag:important[from:me] unread:me # My important tags that are unread
Some selectors support dependent conditions using bracket notation. These sub-conditions apply specifically to the entity matched by the parent selector, rather than to the topic globally.
Without dependent conditions:
from:andres messages:>=10
This finds topics where Andres posted AND the topic has 10+ total messages (from anyone).
With dependent conditions:
from:andres[messages:>=10]
This finds topics where Andres specifically posted 10 or more messages.
Dependent conditions use brackets after the selector value, with comma-separated conditions inside:
selector:value[condition1:value1, condition2:value2]
Filter by the author's specific activity within a topic:
| Condition | Description | Example |
|---|---|---|
messages: |
Author's message count | from:andres[messages:>=10] |
last_before: |
Author's last message before date | from:heikki[last_before:1m] |
last_after: |
Author's last message after date | from:magnus[last_after:1w] |
first_before: |
Author's first message before date | from:michael[first_before:2024] |
first_after: |
Author's first message after date | from:amit[first_after:2024-01-01] |
body: |
Author posted content matching | from:alvaro[body:"patch"] |
from:andres[messages:>=10] # Andres posted 10+ messages
from:heikki[last_before:1m] # Heikki hasn't posted in 1 month
from:thomas[body:"LGTM"] # Thomas posted containing "LGTM"
from:core_team[messages:>=5] # Team posted 5+ combined messages
from:magnus[messages:>=3, last_after:1w] # Magnus: 3+ msgs and recent activity
When using a team name with dependent conditions:
- Message counts are aggregated:
from:team[messages:>=10]matches if team members combined posted 10+ messages - Date conditions apply per-member:
from:team[last_before:1m]matches topics where team members who posted have been inactive for 1 month
Filter attachments by author or count:
| Condition | Description | Example |
|---|---|---|
from: |
Attachments from author | has:attachment[from:nathan] |
count: |
Number of attachments | has:attachment[count:>=3] |
name: |
Attachment filename contains | has:attachment[name:v2] |
has:attachment[from:nathan] # Attachments from Nathan
has:attachment[count:>=5] # 5+ attachments total
has:attachment[from:peter,count:>=3] # 3+ attachments from Peter
has:attachment[name:patch] # Attachments with "patch" in name
Filter patch files by author or count:
| Condition | Description | Example |
|---|---|---|
from: |
Patches from author | has:patch[from:michael] |
count: |
Number of patches | has:patch[count:>=2] |
has:patch[from:michael] # Patches from Michael
has:patch[count:>=3] # 3+ patch files
has:patch[from:committer] # Patches from any committer
Filter tags by author or when added:
| Condition | Description | Example |
|---|---|---|
from: |
Tag added by source | tag:review[from:me] |
added_before: |
Tag added before date | tag:important[added_before:1w] |
added_after: |
Tag added after date | tag:urgent[added_after:yesterday] |
tag:review[from:me] # "review" tag from me
tag:[from:me] # Any tag from me
tag:important[added_after:1w] # "important" tags added this week
tag:blocked[from:core_team] # "blocked" by core team
tag:review[from:me, added_after:1m] # My recent "review" tags
Dependent conditions work with all other search features:
from:andres[messages:>=10] has:patch # Andres posted 10+ msgs AND has patches
has:attachment[from:amit] unread:me # Amit's attachments I haven't read
from:committer[last_before:1m] -has:contributor # Inactive committers
(from:alvaro[body:patch] OR has:patch[from:alvaro]) first_after:1m
You can negate selectors with dependent conditions:
-from:heikki[messages:>=10] # Topics where Heikki did NOT post 10+ msgs
-has:attachment[from:bot] # No attachments from bot
Terms separated by spaces are combined with AND:
vacuum autovacuum # Both terms must match
You can also use explicit AND:
vacuum AND autovacuum # Same as above
Use OR to match either term:
vacuum OR autovacuum # Either term matches
from:robert OR from:thomas # Messages from either author
AND binds more tightly than OR. This query:
from:robert unread:me OR from:thomas
Is interpreted as:
(from:robert AND unread:me) OR from:thomas
Use parentheses to control grouping:
(from:robert OR from:thomas) unread:me
This finds unread topics from either Robert or Thomas.
More complex example:
(has:patch OR has:attachment) first_after:1m -has:contributor
This finds recent topics with patches or attachments that haven't received contributor attention.
Prefix any term or selector with - to exclude matches:
-from:bot # Exclude bot messages
vacuum -autovacuum # Vacuum but not autovacuum
-has:contributor # No contributor activity
Negate grouped expressions:
-(from:tom OR from:bruce) # Exclude both authors
Text searches use PostgreSQL's full-text search with English stemming:
runningmatches "run", "runs", "running"databasesmatches "database", "databases"- Common words (stop words) like "the", "a", "is" are ignored
For exact phrase matching, use quotes:
"shared buffers" # Exact phrase
title:"query planning" # Exact phrase in title
has:patch messages:1 first_after:1m
Single-message topics with patches submitted in the last month.
unread:my-team has:contributor first_after:2w
Recent topics with contributor activity that no team member has read.
"logical replication" from:committer first_after:2023
Discussions about logical replication from committers since 2023.
from:me first_after:1y
Topics where you've participated in the last year.
messages:>20 last_after:1w -has:committer
Long discussions with recent activity but no committer involvement.
has:patch -has:contributor first_after:2w participants:<3
Recent patches that haven't received contributor attention and have few participants.
from:committer[last_before:1m, messages:>=5]
Topics where a committer was actively participating (5+ messages) but hasn't posted in over a month.
has:patch[from:nathan,count:>=2] first_after:1m
Recent topics with multiple patches submitted by Nathan.
tag:needs-review[from:me, added_after:1w] -read:me
Topics you tagged "needs-review" in the last week that you haven't fully read.
| Category | Selectors |
|---|---|
| Content | title:, body: |
| Author | from:*, starter:, last_from: |
| Dates | first_after:, first_before:, messages_after:, messages_before:, last_after:, last_before: |
| Counts | messages:, participants:, contributors: |
| Presence | has:attachment, has:patch, has:contributor, has:committer, has:core_team |
| State | unread:, read:, reading:, new:, starred:, notes: |
| Tags | tag:tagname*, tag:[from:source] |
*Supports dependent conditions
| Parent Selector | Available Conditions |
|---|---|
from: |
messages:, last_before:, last_after:, first_before:, first_after:, body: |
has:attachment |
from:, count:, name: |
has:patch |
from:, count: |
tag: |
from:, added_before:, added_after: |