Web Search in (Un)Perplexed Spready

Web Search Features in (Un)Perplexed Spready

Introduction

At Matasoft, we believe that technology exists to amplify human creativity, not to burden it with repetitive and tedious tasks. Yet, countless professionals still spend hours manually searching the web for information that should be automated -- looking up company websites, contact pages, regulatory data, market intelligence, and dozens of other routine lookups that the modern web was designed to expose programmatically.

(Un)Perplexed Spready is a spreadsheet application that combines the power of traditional spreadsheets with advanced AI capabilities. Version 1.2.X brought a revolutionary integration of web search directly into spreadsheet cells -- read all about it in our previous article Web Search in (Un)Perplexed Spready v1.2.X.

Recently, in version 1.2.6, we have taken the next logical step. The new release introduces:

  • Ollama Web Search as a fully integrated search engine -- no middleware, no Docker containers, no Open WebUI required
  • Extended input ranges for the =ASK_LOCAL_WEB and =ASK_REMOTE_WEB formula families -- from a single input up to five inputs
  • Improved engine orchestration that makes the choice of search engine a one-click decision

In this article, we will demonstrate how the same spreadsheet task -- enriching a list of U.S. school districts with their official web pages -- can be performed using three different web search engines: Ollama Web Search, Brave Search, and SearXNG. The results will show the strengths and trade-offs of each engine, helping you choose the one that best fits your workflow.


The Evolution of Web Search in (Un)Perplexed Spready

Web search in Spready has evolved through four distinct phases since its introduction. Understanding this evolution helps to appreciate the design decisions behind recent enhancements and the role of each engine.

Phase 1: Open WebUI + SearXNG Middleware (Article #150: (Un)Perplexed Spready with web search enabled Ollama models)

The first web search integration required a three-service stack:

  1. Ollama -- local LLM runtime (or Ollama Cloud endpoint)
  2. Open WebUI -- chat interface that exposes a chat-completions-compatible API
  3. SearXNG -- self-hosted meta-search engine running in Docker

Spready would send prompts to the Open WebUI endpoint, which would forward them to Ollama. When the model decided it needed web information, it would call the web_search tool exposed by Open WebUI, which in turn would query SearXNG. This setup was fully self-hosted and privacy-friendly, but complex to install and maintain. Read the complete setup guide in (Un)Perplexed Spready with web search enabled Ollama models.

Phase 2: Matasoft Web Search and Web Reader Tools (Article #152: An example of using (Un)Perplexed Spready in a real life use case - Furniture catalog taxonomy classification)

While the Open WebUI + SearXNG stack worked, it had limitations -- most notably, page content was not fetched in a way that handled JavaScript-heavy websites well. To address this, Matasoft developed two custom Open WebUI tools:

  • matasoft_web_search -- SearXNG-based search with enhanced result formatting
  • matasoft_web_reader -- BeautifulSoup + Selenium hybrid that detects whether a page is server-rendered (HTML) or client-rendered (JavaScript SPA) and applies the appropriate fetching strategy

These tools were validated in a real-life use case: classifying 2,751 furniture catalog products into a 129-category taxonomy. The demonstration showed that with the right tools, Spready could handle production-scale data enrichment tasks. See An example of using (Un)Perplexed Spready in a real life use case - Furniture catalog taxonomy classification for the full case study.

Phase 3: Native Web Search in Spready v1.2.X (Article #156: (Un)Perplexed Spready v1.2.X -- Web Search in (Un)Perplexed Spready)

Version 1.2.X was the largest release in Spready's history. It introduced a native web search subsystem that eliminated the need for an Open WebUI middleware in most cases. Key features:

  • 9 built-in search engines -- SearXNG, DuckDuckGo, Brave Search, Google Custom Search, Bing Web Search, Mojeek, Startpage, Wikipedia, Wikidata
  • 3 formula families -- =WEBSEARCH(), =ASK_LOCAL_WEB(), =ASK_REMOTE_WEB()
  • Chromium-based page content fetching for deep page reading
  • Configurable per-engine in Settings -> Web Search Settings

Open WebUI integration remained supported as a fallback for users with existing Open WebUI deployments. For the complete v1.2.X feature walkthrough, see (Un)Perplexed Spready v1.2.X -- Web Search in (Un)Perplexed Spready.

Phase 4: Ollama Web Search Engine and Expanded Inputs (v1.2.6, This Article)

Version 1.2.6 brings two key additions:

  1. Ollama Web Search as a first-class engine -- When your Ollama endpoint supports it, Spready can request web search results directly from Ollama's runtime without any external service. The integration is a single checkbox in Settings -> Web Search Settings.
  2. Five-input range variants -- =ASK_LOCAL_WEB2(), =ASK_LOCAL_WEB3(), =ASK_LOCAL_WEB4(), =ASK_LOCAL_WEB5() (and corresponding =ASK_REMOTE_WEB*() variants) allow the model to consider up to five context fields when deciding what to search for and how to interpret the results.

In this article we will focus on Phase 4, with a practical demonstration comparing the three most relevant engines.


What Can Web Search Do For You?

In Spready v1.2.6, every web-search-capable formula fits into five use-case families. You don't need to learn the families up-front -- the formula name tells you what to expect:

Formula What it does When to use it
=ASK_LOCAL_WEB(...)
=ASK_REMOTE_WEB(...)
Asks your AI "you may search the web if you need to". The model decides whether to search or answer from its own knowledge. Comes in six variants (0..5) for one to six input values.

The preferred, straight-forward approach. No external web search tools needed, just (Un)Perplexed Spready and Ollama endpoint.

When you want to keep things simple and use the AI endpoint (typically Ollama endpoint) directly, without setting additional layer of Open WebUI middleware and web search tools.

When the user just wants an up-to-date answer and trusts the model to know when to search. This is the family we demonstrate below.

=ASK_LOCAL(...)
=ASK_REMOTE(...)
Plain chat with the AI -- no built-in web search. But: if you connect the endpoint to an Open WebUI server and switch on tools in the settings, Open WebUI can still search the web for you behind the scenes.

In this approach web search can be established too, but it requires additional Open WebUI middleware installation and setup. Web search runs through Open WebUI with web tools configured.

Moreover, Open WebUI can bridge LLM models of other providers, not only Ollama.

=WEBSEARCH(...) Always searches the web first, then asks the AI to summarise the results. The model has no say -- search is mandatory. When you know you need fresh data and don't want to rely on the model's training knowledge. Good for "look this up" tasks where the model otherwise might guess.
=PERPLEXITY(...) Sends the question straight to Perplexity.ai's cloud. Perplexity does the search and returns an answer with citations. Spready is not in the loop. When you already have a Perplexity Pro / Max subscription and want the highest-quality synthesised answers without configuring anything on Spready's side.

Each family comes in six variants named =FAMILY0 through =FAMILY5, accepting one to six input values (input ranges + prompt) respectively. The bare alias =ASK_LOCAL_WEB is shorthand for the single-input variant =ASK_LOCAL_WEB,.where no input ranges are given, only input prompt. Pick the variant that matches how many fields you want to feed in.

Three Ways to Get Web Search Done

Regardless of which family you pick, the actual web search is performed by one of three web search backends:

Backend How it works Who's it for
Spready's built-in engines
(SearXNG, DuckDuckGo, Brave, Google CSE, Bing, Mojeek, Startpage, Wikipedia, Wikidata)
Spready calls one or more search engines you have enabled in Settings -> Web Search Settings -> Engines, deduplicates the results, and feeds them to the AI for summarising. Users who want full control over the search backend -- pick the engines you trust, configure your own API keys, or self-host SearXNG for maximum privacy.
Ollama Web Search
(paid, via Ollama Cloud)
A shortcut that hands the search off to the Ollama runtime itself. Tick the Use Ollama Web Search box in Web Search Settings -> General and Ollama returns cited results directly. Ollama Cloud subscribers (Pro or Max) who want the simplest setup -- no engine configuration, no API keys, results come back already cited.
Perplexity Cloud
(paid, Perplexity.ai)
Bypasses Spready entirely. The =PERPLEXITY* family calls Perplexity's API directly. Spready never sees the search -- Perplexity does the work and returns the answer. Users who want Perplexity's premium answer quality and are happy to pay per query.

In this article we demonstrate all three backends head-to-head: Ollama Web Search (Ollama-native, fastest path), Brave Search (Spready-managed, cloud API), and SearXNG (Spready-managed, self-hosted). This gives a fair head-to-head comparison of a speed-first, a quality-first, and a privacy-first option.

Practical rule of thumb: If you use locally installed Ollama models, start with =ASK_LOCAL_WEB*(...) with some of the free engines to get idea how it works. If you are existing Ollama Cloud Pro or Max subscriber, use Ollama Web Search engine — it is by far the fastest option (our test completed in under 2 hours vs. 28+ hours for Brave and 94+ hours for SearXNG). Use Brave Search if you need the highest result quality and video/livestream discovery, and you are willing to pay Brave Search API costs. Use SearXNG if you want a free, privacy-first deep search, know how to setup SearXNG, and time is not a limiting factor. If you don't want to setup Ollama or anything else, you are already Perplexity subscriber and willing to pay high costs of API usage, then =PERPLEXITY*(...) with web search included out-of-box is an option.

The Multi-Range Variants -- Why They Matter

In real-world spreadsheets, the relevant context for a single record is rarely contained in one cell. A school district is identified by name + state + county + city, not by name alone. A product is identified by SKU + name + category + manufacturer, not by SKU alone.

The multi-range variants of =ASK_LOCAL_WEB allow the model to see all of these context fields in a single call. When the model decides to perform a web search, it can construct a more precise query (e.g., "Waskom Independent School District Harrison County Texas") and can also disambiguate results that match multiple entities.

Example formula used in the demonstration below:

=ASK_LOCAL_WEB3(A2, B2:D2, E2, Prompts!$B$1)

Where:

  • A2 -- School District name (the entity you're looking up)
  • B2:D2 -- State, County, City (3-cell range -- disambiguates the district from others with the same name)
  • E2 -- Home Page URL (optional, used if already known from a previous step)
  • Prompts!$B$1 -- The instruction template, kept on the Prompts sheet so the formula stays short and reusable

At-a-Glance Comparison

Engine / Method Internal Path Triggered by Setup Cost Privacy Best For
SearXNG (one of 9 native engines) Path 1 -- Spready-managed =WEBSEARCH* and =*_WEB* with Ollama Web Search off Medium (install SearXNG, point Spready at it) Free, self-hosted High (queries never leave your machine) Privacy-conscious users; air-gapped or LAN-only setups
Brave Search (one of 9 native engines) Path 1 -- Spready-managed =WEBSEARCH* and =*_WEB* with Ollama Web Search off Low (just an API key in Web Search Settings) Free tier 2,000 queries/month, then paid Medium (queries sent to Brave's cloud) High-quality results with minimal setup
Ollama Web Search (native Ollama feature) Path 2 -- Ollama-native =*_WEB* with Ollama Web Search on and Ollama-native endpoint Lowest (tick one checkbox in Web Search Settings) Requires Ollama Pro or Max plan Medium (search is performed by Ollama's infrastructure) Existing Ollama Cloud subscribers who want the fastest path from zero to working web search
Open WebUI tools (e.g. searxng_search) Bonus -- Open WebUI-side =ASK_LOCAL* / =ASK_REMOTE* (suffix-less) with non-empty API_TOOLS and an Open WebUI endpoint Medium-High (install Open WebUI, install web-search tool inside it) Free, self-hosted High (everything self-hosted) Users already running Open WebUI who want web search without the nine-engine machinery
Perplexity Cloud (vendor API) Path 3 -- Perplexity Cloud =PERPLEXITY* / =ASK_PERPLEXITY* Lowest (just an API key in Perplexity Settings) Pay-per-query to Perplexity.ai Low (queries and context sent to Perplexity) Best-quality results with zero setup, when privacy is not the priority

The remainder of this article demonstrates the same =ASK_LOCAL_WEB3 spreadsheet task with all three engines — Ollama Web Search (Path 2), Brave Search (Path 1), and SearXNG (Path 1) — so you can see the practical differences in the output.

*If you ask yourself why =ASK_LOCAL_WEB4 or =ASK_LOCAL_WEB5 have not been used instead of =ASK_LOCAL_WEB3, where logically they would be better choice, the answer is simple - that's because the spreadsheet has been designed before formula variants with 4 or 5 input ranges were introduced, and I was too lazy to redesign the formulas in the sample spreadsheet. cool


Demonstration: =ASK_LOCAL_WEB with Three Different Engines

To produce a fair comparison, we ran the same task with the same model (glm-5.2:cloud) on the same spreadsheet -- the only variable being the search engine enabled in Settings -> Web Search Settings.

The Test Project: U.S. School Districts

The spreadsheet Demo42a_School_Districts_ASK_LOCAL_WEB.xlsx contains a list of 50 U.S. school districts. The input columns (A-D) provide identifying information; the result columns (E-H) are filled by =ASK_LOCAL_WEB3 formulas:

Column Header Source
A School District User input
B State User input
C County User input
D City User input
E Home Page `=ask_local_web3(A2, B2:C2, D2, Prompts!$A$1)`
F Board of Education / Contact Page / Staff Directory `=ask_local_web3(A2, B2:D2, E2, Prompts!$B$1)`
G Meeting Document Download Page `=ask_local_web3(A2, B2:D2, E2, Prompts!$C$1)`
H Meeting Videos / YouTube / Livestream `=ask_local_web3(A2, B2:D2, E2, Prompts!$D$1)`

Note on F, G, H: Column E's resolved URL is passed as the third argument, so the model can scope its search to the district's own domain.

The Four Prompt Templates

The Prompts sheet contains four instruction templates, one per result column. All four are used across the three engine runs -- only the search engine changes, the prompts stay constant.

Prompt A1 (used in Column E -- Home Page)

You are a web research assistant.



INPUTS:

- Input1: School District name

- Input2: State and County

- Input3: City



TASK:

Find the OFFICIAL WEBSITE HOMEPAGE of this US public school district.



DETAILED RULES:

1. Search the web for the school district using its name plus state (and county/city if needed).

2. Identify the official district website, not a:

   - news article

   - Wikipedia page

   - social media page

   - individual school site

   - parent/community site

3. Return the ROOT HOMEPAGE of the district:

   - Example: https://www.lcps.org

   - NOT a subpage like /about, /schools, /board-of-education

4. If the district is a section inside a larger county or state education website:

   - Return the URL of the district's specific section page.

5. If you cannot confidently identify the official homepage:

   - Return exactly: NO_HOMEPAGE_FOUND



OUTPUT FORMAT (STRICT):

- EITHER: a single URL for the district's homepage (no extra text, no spaces, no quotes)

- OR: NO_HOMEPAGE_FOUND

Prompt B1 (used in Column F -- Board of Education / Contact / Staff)

You are a web research assistant.



INPUTS:

- Input1: School District name

- Input2: State, County and City

- Input3: Website Home Page



TASK:

Find the best available BOARD OR LEADERSHIP PAGE for this school district.



PRIORITY ORDER (USE THE FIRST THAT EXISTS):

1. Board of Education / School Board page.

2. Administration or Superintendent page.

3. Staff directory.

4. General district contact page (last resort).



RESEARCH STEPS:

1. Start from the district's official website if you know it, otherwise search the web.

2. Look for pages with titles like:

   - "Board of Education"

   - "School Board"

   - "Board Members"

   - "Board of Trustees"

   - "Administration"

   - "District Leadership"

   - "Staff Directory"

   - "Contact Us"

3. Choose the highest-priority page available from the list above.

4. The URL MUST be:

   - a page specific to the board, leadership, staff, or district contact

   - NOT the general homepage

   - NOT an individual board member's personal profile or personal site.



FAILURE CASE:

- If you cannot find any suitable board, leadership, staff, or contact page:

  - Return exactly: NO_BOARD_OR_CONTACT_PAGE_FOUND



OUTPUT FORMAT (STRICT):

- EITHER: a single URL for the selected page (no extra text, no spaces, no quotes)

- OR: NO_BOARD_OR_CONTACT_PAGE_FOUND

Prompt C1 (used in Column G -- Meeting Document Download Page)

You are a web research assistant.



INPUTS:

- Input1: School District name

- Input2: State, County and City

- Input3: Website Home Page



TASK:

Find a page where the school board's MEETING DOCUMENTS are posted for download.



DEFINITION:

The page should list downloadable documents such as:

- agendas

- minutes

- meeting notices

- meeting packets

- board documents



RESEARCH STEPS:

1. Start from the district's website or search the web for:

   - "<district name> board agendas"

   - "<district name> board minutes"

   - "<district name> BoardDocs"

   - "<district name> Simbli"

2. Look for:

   - A board meetings page with downloadable PDFs or other files.

   - OR a third-party platform such as:

     - BoardDocs: go.boarddocs.com/...

     - Simbli / eBoard Solutions: simbli.eboardsolutions.com/...

     - Diligent Community: community.diligent.com/...

     - CivicPlus / CivicEngage

     - eSCRIBE

     - Granicus / Legistar

3. If the district uses a third-party platform:

   - Return the PUBLIC board/meetings listing URL on that platform, including any S= or id parameters.

4. The page MUST clearly expose downloadable meeting documents, not just a calendar with dates.



RULES:

- Do NOT return:

  - login-only URLs

  - Google Drive, Dropbox, or cloud storage folders

  - individual PDF file URLs

  - pages that only list dates without documents

- If you are unsure whether documents are downloadable, treat it as NOT FOUND.



FAILURE CASE:

- If you cannot find a page with downloadable meeting documents:

  - Return exactly: NO_MEETING_DOCUMENTS_PAGE_FOUND



OUTPUT FORMAT (STRICT):

- EITHER: a single URL for the meeting documents page (no extra text, no spaces, no quotes)

- OR: NO_MEETING_DOCUMENTS_PAGE_FOUND

Prompt D1 (used in Column H -- Meeting Videos / YouTube / Livestream)

You are a web research assistant.



INPUTS:

- Input1: School District name

- Input2: State, County and City

- Input3: Website Home Page



TASK:

Find a URL where this school district's BOARD MEETINGS are recorded or livestreamed.



WHAT COUNTS:

- YouTube channel or playlist for board meetings.

- Vimeo channel.

- District web page that embeds a livestream or video archive (e.g. Granicus, Swagit, etc.).

- Facebook page ONLY if it is clearly used to stream board meetings.



RESEARCH STEPS:

1. Search YouTube for:

   - "<district name> board meeting"

   - "<district name> school board"

2. Verify the channel or playlist actually belongs to this specific district:

   - Check the name, logo, description, and video titles.

3. Also check the district's website for links labelled:

   - "Board Meetings"

   - "Watch Live"

   - "Video"

   - "Livestream"

4. Prefer a CHANNEL or PLAYLIST URL, not a single video URL.

5. If the district streams on Vimeo, Facebook, or another platform:

   - Return the main page/channel where meetings are posted.



RULES:

- Do NOT return:

   - a single one-off video URL

   - a channel with no board meeting content

   - unrelated channels with similar district names

- If you cannot find any recordings or livestream that clearly correspond to board meetings:

   - Treat it as NOT FOUND.



FAILURE CASE:

- If you cannot find a valid video or livestream source for board meetings:

  - Return exactly: NO_MEETING_VIDEOS_FOUND



OUTPUT FORMAT (STRICT):

- EITHER: a single URL for the channel/playlist/meeting-video page (no extra text, no spaces, no quotes)

- OR: NO_MEETING_VIDEOS_FOUND

The four prompts follow a consistent design pattern:

  • Role prefix ("You are a web research assistant.") anchors the model in the right behavior.
  • Inputs block echoes the formula arguments so the model knows which input is which.
  • Task statement names the specific deliverable in one sentence.
  • Rules block is where the prompt engineering effort concentrates -- it tells the model what not to return (login pages, single PDFs, social media misidentifications) and what to do in edge cases.
  • Output format (strict) enforces a single-line reply, which is critical for spreadsheet ingestion -- any extra text would break the cell.

This combination of strict output format and detailed negative rules is what allows the same prompts to work consistently across three different search engines: the engine returns raw web results, but the prompt ensures the model still produces a clean, single-URL response.

The Prompts sheet of the test spreadsheet, showing the four prompt templates in cells A1-D1: Home Page (A1), Board of Education / Contact / Staff (B1), Meeting Document Download Page (C1), and Meeting Videos / YouTube / Livestream (D1)

The Prompts sheet -- cells A1, B1, C1, D1 are referenced by the four =ASK_LOCAL_WEB3 formulas in the main sheet.

Configuration: Ask Local API Settings

Before each run, the same endpoint and model were configured:

Ask Local API Settings dialog showing Ollama endpoint at http://localhost:11434/api/chat and model glm-5.2:cloud with Max Input Length 1,000,000 and Max Retries 3

Ask Local API Settings dialog -- same configuration for all three runs.

 

Common Web Search Setup

We set Target results to 100, Buffer results per engine per page to 200, and Search Depth to 5.

Note: We deliberately set very high values, because this was stress test. But, in real use cases you would want to reduce settings to lower values for sake of performance, for example Search Depth to 1, Target Results to 30 and Buffer Results Per Engine per Page to 60, in order to get results in reasonable time. If the settings are set too high, the time needed to finish the job becomes prohibitive. In order to speed-up processing, you could also decrease timeouts and switch-off chromium option.



Chromium option switched on, with proper Chromium path.

 

Engine 1: Ollama Web Search

Settings: Only "Ollama Web Search" is enabled in Settings -> Web Search Settings -> Engines. All other engines are disabled.

Web Search Settings -- only the Ollama Web Search engine is enabled, with entered Ollama Cloud API key.

 

Results

The full spreadsheet was calculated in 1 hour 55 minutes 42 seconds (6,942 seconds). Most cells were filled with either a valid URL, a N/A marker, or a NO_*_FOUND marker. But there were also few#APIERR errors.

Since there were few cells with errors (#APIERR), we performed limited recalculation of cells with errors, so that we get better results. 
Note: (Un)Perplexed Spready provides various commands for performing recalculations.


Final results with Ollama Web Search -- after recalculation of cells with errors

Quality summary across 50 districts × 4 columns (200 cells total):

Output column Successful URLs `NO_*_FOUND` markers Hit rate
**E -- Home Page** 29 1 (NO_HOMEPAGE_FOUND) 98%
**F -- Board / Contact / Staff** 30 2 96%
**G -- Meeting Document Download Page** 12 12 (N/A + NO_MEETING_DOCUMENTS_PAGE_FOUND) 76%
**H -- Meeting Videos / YouTube / Livestream** 5 46 (30 N/A + 16 NO_MEETING_VIDEOS_FOUND) 8%
**Overall** **76** **61** **67%**

The single NO_HOMEPAGE_FOUND (Healy Unified School District 468, Kansas) is a real-world example: a very small rural district with no functional web presence, where Ollama Web Search returned a confident "not found" rather than fabricating a URL. The high rate of NO_MEETING_DOCUMENTS_PAGE_FOUND and NO_MEETING_VIDEOS_FOUND markers reflects the fact that many small U.S. school districts do not publish board agendas or record meetings online at all -- Ollama Web Search correctly avoided hallucinating pages that don't exist. The high rate of NO_MEETING_DOCUMENTS_PAGE_FOUND and NO_MEETING_VIDEOS_FOUND markers reflects the fact that many small U.S. school districts do not publish board agendas or record meetings online at all -- Ollama Web Search correctly avoided hallucinating pages that don't exist.

Discussion

Setup simplicity: None required beyond an active Ollama Cloud account with Pro/Max tier. No Docker, no API keys to manage, no second service to monitor.

Speed: Consistently the fastest option across our testing. 

Quality: Very good. The model returns well-formatted URLs with proper domain scoping.

Cost: Included with Ollama Pro/Max subscription -- no per-query metering beyond the subscription itself.

Limitation: Requires Ollama Cloud with Pro/Max subscription.

Engine 2: Brave Search (Cloud API)

Settings: Only "Brave Search" is enabled, with a valid Brave Search API key entered in the engine configuration. All other engines are disabled.

Web Search Settings -- only Brave Search is enabled.

API tier: Free tier (2,000 queries/month). For higher volumes, paid plans are available. Currently price is $0.005 per query.

Results: The full 50-district × 4-column recalculation completed in 28 hours 32 minutes 28 seconds. All 200 cells were filled with either a valid URL, a N/A marker, or a NO_*_FOUND marker. Zero #APIERR errors were produced — the most stable run of all three engines. Brave Search achieved the highest overall URL yield: 145 out of 200 cells (72%), including a perfect 50/50 on Home Page and a remarkable 13 out of 50 on Meeting Videos — more than triple the video discovery rate of Ollama Web Search. Brave found YouTube channels, Vimeo showcases, and Facebook Live pages that the other engines missed.

Final results with Brave Search -- 28h 32m for 50 districts × 4 columns. Zero #APIERR errors.

Quality summary across 50 districts × 4 columns (200 cells total):

Output column Successful URLs N/A + NO_*_FOUND markers Hit rate
E -- Home Page 50 0 100%
F -- Board / Contact / Staff 48 2 (N/A) 96%
G -- Meeting Document Download Page 34 16 (13 N/A + 3 NO_MEETING_DOCUMENTS_PAGE_FOUND) 68%
H -- Meeting Videos / YouTube / Livestream 13 37 (23 N/A + 14 NO_MEETING_VIDEOS_FOUND) 26% (best of all three engines)
Overall 145 55 72% (highest)

Brave Search's standout performance is in the Meeting Videos column: it found 13 YouTube channels, Vimeo showcases, and Facebook Live pages -- more than triple Ollama Web Search's 4 and slightly more than SearXNG's 11. Examples include YouTube channels for Maine School Administrative District 6, Regional School District 18, Western Placer Unified, and Campbell Union High; a Vimeo showcase for Mineola Union Free School District; and a Facebook Live page for Huerfano School District RE-1. Brave also achieved a perfect 50/50 on Home Page discovery -- the only engine to find every single district's official website.

Discussion

Setup complexity: Low. Create a Brave Search API account, copy the API key into Spready's settings, and you're done.

Privacy: Medium. Queries are sent to Brave's API. Brave has a strong privacy track record (they do not profile users), but the data does leave your machine.

Cost: Free for the first 2,000 queries/month. For 50 districts × 4 columns = 200 queries per run, the free tier covers ~10 full runs per month. Beyond that, paid plans start at a few dollars per thousand queries (currently $0.005 per query).

Quality: Excellent. Brave Search achieved the highest overall hit rate (72%) and the best video/livestream discovery (13 URLs vs. 4 for Ollama and 11 for SearXNG). It found YouTube channels, Vimeo showcases, and Facebook Live streams that other engines missed, and achieved a perfect 50/50 on Home Page discovery.

Limitation: The 2,000 query/month free tier is the main constraint. For 50 districts × 4 columns = 200 queries per run, the free tier covers ~10 full runs per month. For production data enrichment pipelines, a paid plan is typically required. Speed is also a consideration: at 28.5 hours for 50 districts, Brave is significantly slower than Ollama Web Search (1h 55m) but dramatically faster than SearXNG (94h 37m).

Engine 3: SearXNG (Self-Hosted Meta-Search)

Settings: Only "SearXNG" is enabled, pointing to http://localhost:8080/search. The "Ollama native web_search" and all other engines are disabled.

Web Search Settings -- only SearXNG is enabled.

 

SearXNG instance: Self-hosted in Docker on the same machine as Spready. Configuration includes 15+ upstream engines (Google, Bing, DuckDuckGo, Mojeek, Qwant, Startpage, etc.) with JSON format enabled in settings.yml (required for Spready to parse the response).

Results: The full 50-district × 4-column recalculation completed in 94 hours 37 minutes 53 seconds — by far the slowest of the three engines. All 200 cells were filled, but SearXNG produced the lowest overall URL yield: 118 out of 200 cells (59%). It also generated 3 #APIERR errors (socket read failures) and an extraordinary 9,152 Chromium timeouts (each 60 seconds long), which are the primary cause of the extreme runtime. SearXNG returned 111 results per query on average (vs. 10 for Ollama Web Search), but many were irrelevant — FOX News Radio, GitHub repos, tourism sites, and 8kun threads appeared alongside legitimate school district pages. The model had to filter through this noise, which increased both processing time and the likelihood of missing the correct result. On the positive side, SearXNG did find 11 video/livestream URLs (comparable to Brave's 13), including unique Facebook Live discoveries for Drew Central and Ventnor school districts.

Final results with SearXNG -- 94h 37m for 50 districts × 4 columns. The slowest engine by far.

Quality summary across 50 districts × 4 columns (200 cells total):

Output column Successful URLs N/A + NO_*_FOUND markers Hit rate
E -- Home Page 38 12 (10 N/A + 1 NO_HOMEPAGE_FOUND + 1 #APIERR) 76%
F -- Board / Contact / Staff 38 12 (11 N/A + 1 #APIERR) 76%
G -- Meeting Document Download Page 31 19 (15 N/A + 4 NO_MEETING_DOCUMENTS_PAGE_FOUND) 62%
H -- Meeting Videos / YouTube / Livestream 11 39 (18 N/A + 20 NO_MEETING_VIDEOS_FOUND + 1 #APIERR) 22%
Overall 118 82 59% (lowest)

SearXNG's 59% overall hit rate is the lowest of the three engines, driven primarily by its poor Home Page discovery (38/50, vs. 50/50 for Brave and 49/50 for Ollama). The 94-hour runtime was caused by 9,152 Chromium timeouts (each 60 seconds long) and 522 retries. SearXNG returned an average of 111 results per query -- far more than Ollama Web Search's 10 -- but many were irrelevant noise (FOX News Radio, GitHub repositories, tourism sites, 8kun threads). The model had to filter through this noise, which increased both processing time and the likelihood of missing the correct result. On the positive side, SearXNG did find 11 video/livestream URLs (comparable to Brave's 13), including unique Facebook Live discoveries for Drew Central School District and Ventnor City School District that Brave did not find.

Discussion

Setup complexity: Medium. Requires Docker, SearXNG image, settings.yml configuration (with -json format enabled), and a running instance reachable from Spready.

Privacy: High. All search queries and results stay on your machine; no third-party API sees your queries.

Cost: Free. SearXNG is open-source; the only cost is the electricity to run the Docker container.

Quality: Moderate. SearXNG returned 111 results per query on average — far more than Ollama Web Search's 10 — but many were irrelevant (news sites, GitHub, tourism pages, social media). The model had to filter through significant noise, which increased processing time and occasionally led to missed results. The overall 59% hit rate was the lowest of the three engines, and SearXNG failed to find a home page for 12 out of 50 districts (vs. 0 for Brave and 1 for Ollama).

Limitation: Self-hosted means self-maintained. SearXNG instances occasionally hit CAPTCHAs from upstream engines; rate limits may apply. In our test, 9,152 Chromium timeouts and 522 retries were recorded, making SearXNG by far the most operationally demanding engine. The 94-hour runtime for 50 districts makes it impractical for time-sensitive workflows, though it remains the only fully free and fully private option.

Comparative Analysis

Aspect Ollama Web Search Brave Search SearXNG
Setup time ~1 minute ~5 minutes ~2 hours
Recurring cost Ollama Pro/Max subscription Free tier / paid Free (electricity)
Privacy Medium (Ollama cloud) Medium (Brave cloud) High (self-hosted)
Speed (50 districts × 4 cols) 1h 55m (measured) 28h 32m (measured) 94h 37m (measured)
URL yield 139/200 (70%) (measured) 145/200 (72%) (measured) 118/200 (59%) (measured)
Video/livestream discovery 4/50 13/50 (best) 11/50
#APIERR errors 0 (after recalc) 0 3
Maintenance None None High (9,152 timeouts, 522 retries in test)
Scalability Per Ollama Cloud plan Per Brave plan Limited by self-hosted hardware

Recommendations

Based on the demonstration above and our broader experience, here are our recommendations for choosing a web search engine in (Un)Perplexed Spready v1.2.6.

Primary Recommendation: Ollama Web Search

If you already have an Ollama Cloud Pro or Max subscription, Ollama Web Search is the clear winner. It is:

  • The fastest to set up -- no separate service, no API key, no configuration beyond a checkbox
  • The fastest to run -- 1h 55m for 50 districts, roughly 14× faster than Brave Search and 47× faster than SearXNG
  • The lowest maintenance -- no Docker containers to update, no upstream engines to debug
  • Cost-effective for Ollama subscribers -- included in your existing subscription

The main trade-off is result quality: at 70% overall URL yield, Ollama Web Search trails Brave Search (72%) and is notably weaker in video/livestream discovery (4 URLs found vs. 13 for Brave). For tasks where finding YouTube channels or Facebook Live streams is important, Brave Search may be the better choice. The only reason not to use Ollama Web Search at all is if you are running Ollama locally (web search is a cloud-only feature) or if you have strict data-residency requirements.

Secondary Recommendation: Brave Search (for Quality and Completeness)

If you want the highest result quality and the best video/livestream discovery, Brave Search is the clear winner. It achieved the highest overall URL yield (72%), a perfect 50/50 on Home Page discovery, and found 13 video/livestream URLs — more than triple Ollama Web Search's 4. The 2,000 queries/month free tier covers about 10 full runs of a 50-district spreadsheet, and paid plans are competitively priced for larger workloads.

The main trade-offs are speed (28.5 hours for 50 districts — significantly slower than Ollama Web Search) and the fact that queries are sent to Brave's servers. If those are acceptable for your use case, Brave Search offers the best balance of quality and simplicity.

Tertiary Recommendation: SearXNG (for Privacy-Conscious Users)

If privacy is paramount and time is not a limiting factor, SearXNG is the most private option. It runs entirely on your hardware, supports dozens of upstream engines, and is fully open-source. No queries ever leave your machine.

The main trade-offs are significant: in our test, SearXNG took 94 hours to process 50 districts (vs. 2 hours for Ollama Web Search), produced the lowest URL yield (59%), and generated 9,152 Chromium timeouts. It also returned 111 results per query — far more than Ollama's 10 — but many were irrelevant noise. SearXNG is best suited for users who value privacy above all else and can afford to wait, or for smaller datasets where the extreme runtime is manageable.

The Trade-Off Triangle

When choosing a web search engine, three factors compete:

         Privacy

            /\

           /  \

          /    \

         /      \

        /________\

   Cost  Quality

  • Ollama Web Search optimizes for Speed (1h 55m, 47× faster than SearXNG) and Cost (included in Ollama subscription)
  • SearXNG optimizes for Privacy (high, fully self-hosted) at the expense of Speed (94 hours) and Quality (59%, lowest of the three)
  • Brave Search optimizes for Quality (72%, highest URL yield + best video discovery) at the expense of Speed (28.5 hours) and Privacy (queries go to Brave)

Your choice depends on which factor matters most for your specific use case.


Conclusion

Web search in (Un)Perplexed Spready has evolved from a complex three-service middleware stack to a one-click integration with Ollama Web Search.

In this article, we demonstrated the same enrichment task -- adding home pages, board of education pages, meeting document pages, and meeting video links for 50 U.S. school districts -- using three different search engines. The clear winner, for users with an Ollama Cloud Pro or Max subscription, is Ollama Web Search: fastest to set up, fastest to run, and lowest maintenance.

For users without an Ollama Cloud subscription, SearXNG and Brave Search remain excellent options, each with their own trade-offs between privacy, cost, and quality.

We encourage you to try all three engines on your own data and see which one fits your workflow best. The same spreadsheet, the same model, the same prompts -- just toggle a different checkbox in Settings -> Web Search Settings.


Further Reading

Matasoft Articles on Web Search in (Un)Perplexed Spready

External Documentation

Other Topics


Download the demonstration spreadsheet Demo42a_School_Districts_ASK_LOCAL_WEB.xlsx and try the formulas yourself. Sign in to the (Un)Perplexed Spready download area to get the file. You can download it here: https://spready.matasoft.hr/


© 2026 Matasoft. All rights reserved. (Un)Perplexed Spready is a product of Matasoft.