---
title: "Watch searches that find nothing or get no · Agent Wranglers"
url: https://agentwranglers.se/playbook/search/relevance/zero-result-searches
id: SRH-19
level: Recommended
updated: 2026-10-27
build: a2a6bdfed830
tokens: 906
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Watch searches that find nothing or get no click

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Relevance](https://agentwranglers.se/playbook/search/relevance.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-27.

- ID: SRH-19
- Level: Recommended
- Chapter: [Relevance](https://agentwranglers.se/playbook/search/relevance.md)
- Rule: Count each week's share of searches with no hits and with no click on any hit, per query. Review the 20 most frequent of each every month.
- Check: The dashboard shows the weekly no-hit and no-click shares for the last 12 weeks, and the two top-20 lists. Each monthly review leaves a dated note with the changes made.
- How: A search with no hits shows a missing synonym, a spelling the analyser misses or a product you do not stock. A search with hits but no click shows results in the wrong order. Log the hit count and the clicked position with each cleaned query, as [Keep personal data out of search logs](https://agentwranglers.se/playbook/search/access-and-limits/search-log-privacy.md) says. Fix each common case with an alias, a language rule or new content, and add it to the [fixed query set](https://agentwranglers.se/playbook/search/relevance/search-quality-tests.md) so it stays fixed. Words people use for an item go in its aliases, as [Give every item the words people use for it](https://agentwranglers.se/playbook/search/language-and-matching/item-aliases.md) says.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### SQL example

```sql
SELECT query,
       count(*) AS searches,
       avg((hits = 0)::int) AS no_hit_share,
       avg((hits > 0 AND clicked_position IS NULL)::int) AS no_click_share
FROM search_log
WHERE at > now() - interval '7 days'
GROUP BY query
ORDER BY searches DESC
LIMIT 20;
```

### Python example

```python
def weekly_shares(rows: list[dict]) -> dict:
    total = len(rows) or 1
    return {
        "no_hit": sum(row["hits"] == 0 for row in rows) / total,
        "no_click": sum(row["hits"] > 0 and row["clicked_position"] is None for row in rows) / total,
    }
```

### JavaScript example

```js
export function weeklyShares(rows) {
  const total = rows.length || 1;
  return {
    noHit: rows.filter(row => row.hits === 0).length / total,
    noClick: rows.filter(row => row.hits > 0 && row.clickedPosition == null).length / total,
  };
}
```

## Related rules

- SRH-12 [Keep personal data out of search logs](https://agentwranglers.se/playbook/search/access-and-limits/search-log-privacy.md) in Search
- SRH-17 [Test search results with a fixed query set](https://agentwranglers.se/playbook/search/relevance/search-quality-tests.md) in Search
- SRH-16 [Give every item the words people use for it](https://agentwranglers.se/playbook/search/language-and-matching/item-aliases.md) in Search

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/search/relevance/zero-result-searches">Agent Wranglers search playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Say when nothing fits](https://agentwranglers.se/playbook/search/relevance/say-when-nothing-fits.md)
- [Relevance](https://agentwranglers.se/playbook/search/relevance.md)
