add NIP-50 query extension

This commit is contained in:
Yasuhiro Matsumoto
2026-01-02 01:37:06 +09:00
parent fa9281af8b
commit e943ab847a

43
50.md
View File

@@ -26,11 +26,50 @@ Relays SHOULD interpret the query to the best of their ability and return events
Relays SHOULD perform matching against `content` event field, and MAY perform
matching against other fields if that makes sense in the context of a specific kind.
Results SHOULD be returned in descending order by quality of search result (as defined by the implementation),
not by the usual `.created_at`. The `limit` filter SHOULD be applied after sorting by matching score.
A query string may contain `key:value` pairs (two words separated by colon), these are extensions, relays SHOULD ignore
extensions they don't support.
### Query Expression Extensions
Relays MAY support query expressions with boolean operators and filter attributes. When supported, this MUST be advertised in NIP-11:
```json
{
"supported_nips": [50],
"nip50_search": {
"boolean_operators": true,
"filter_attributes": ["limit", "since", "until"]
}
}
```
When `boolean_operators` is `true`, relays SHOULD support:
- Terms split by whitespace (implicit AND)
- Double quotes for phrase matching: `"hello world"`
- Boolean operators: `AND`, `OR` (uppercase, case-sensitive)
- Parentheses for grouping: `(cat AND dog) OR bird`
- Operator precedence: `AND` binds tighter than `OR`
Examples:
- `hello world` → both terms required (implicit AND)
- `hello OR world` → either term matches
- `cat AND (dog OR bird)` → "cat" plus either "dog" or "bird"
When `filter_attributes` is present, relays SHOULD support filter attributes in the query string:
- `limit:<number>` - limit number of results (e.g., `limit:50`)
- `since:<unix timestamp>` - filter events after timestamp (e.g., `since:1609459200`)
- `until:<unix timestamp>` - filter events before timestamp (e.g., `until:1640995200`)
Examples:
- `nostr limit:50` → search "nostr" and return up to 50 results
- `bitcoin since:1609459200` → search "bitcoin" for events after the specified time
- `cats OR dogs limit:100 since:1640995200` → combined query with filters
Results SHOULD be returned in descending order by quality of search result (as defined by the implementation),
not by the usual `.created_at`. The `limit` filter SHOULD be applied after sorting by matching score.
Clients may specify several search filters, i.e. `["REQ", "", { "search": "orange" }, { "kinds": [1, 2], "search": "purple" }]`. Clients may
include `kinds`, `ids` and other filter field to restrict the search results to particular event kinds.