Skip to Content

Fast, Typo-Tolerant Search in Odoo with Typesense


Fast Search in Odoo with Typesense — OCA connector_typesense
OCA · search-engine · Odoo 18

Fast, Typo-Tolerant Search in Odoo
with Typesense

How the OCA connector_typesense module connects your Odoo data to a modern, sub-50ms search engine — and why it matters for e-commerce and ERP teams.

connector_typesense Typesense Odoo 16 · 18 AGPL-3 OCA / search-engine KobrosTech contributor

Odoo's built-in search is functional — but it's database search. Full-text queries hit PostgreSQL, there's no typo tolerance, no instant-as-you-type results, and no relevance ranking. For product catalogs, knowledge bases, or any customer-facing search bar, that's a real limitation. This is what connector_typesense solves.

What Is Typesense?

Typesense is an open-source search engine built in C++, designed specifically for the use cases where Elasticsearch is overkill and Algolia is too expensive. The key characteristics that make it relevant for Odoo projects:

Feature PostgreSQL FTS Elasticsearch Typesense
Response time 100–500ms+ 50–200ms < 50ms (RAM index)
Typo tolerance No Config required Built-in, on by default
Setup complexity N/A (in Odoo) High — JVM, cluster tuning Single binary or Docker
Vector / semantic search Via pgvector Yes Yes, with auto-embedding
Faceted filtering Manual SQL Yes Yes, built-in
Self-hostable, free Yes Yes (complex) Yes, single container

The core tradeoff with Typesense: it keeps its entire index in RAM, which is what makes it so fast — but it means your server needs enough memory to hold your searchable data. For most Odoo product catalogs (tens of thousands of products), this is not a problem. For datasets in the hundreds of millions, you'd look elsewhere.

Typesense also supports built-in clustering via Raft consensus for high availability — something you'd normally need an enterprise license for in competing engines. The open-source version includes it.

How connector_typesense Works

The module sits inside the OCA search-engine framework — a generic connector layer that handles the binding, synchronization, and export logic between Odoo records and external search indexes. connector_typesense is the Typesense-specific backend for this framework.

┌─── Odoo 18 ─────────────────────────────────────────────────────┐ │ │ │ Odoo Records connector_search_engine │ │ (product.template, ──────────────────────► Binding layer │ │ product.product, Index export config │ │ any model...) Sync triggers │ │ Pydantic serializer │ │ connector_typesense │ │ ──────────────────────► Typesense backend │ │ Collection mapping │ │ API client │ └─────────────────────────────────┬───────────────────────────────┘ │ HTTP / REST ▼ ┌─── Typesense Server ────────────────┐ │ Collections (indexes) │ │ RAM-resident search index │ │ Sub-50ms search · typo tolerance │ │ Faceting · vector search │ └─────────────────────────────────────┘ │ ▼ Your frontend / website / search bar

The important design decision here: Odoo does not serve search queries directly. Records are indexed into Typesense asynchronously. The frontend (your website, portal, or external app) then queries Typesense directly, getting sub-50ms results without touching the Odoo database at all for search operations.

Installation and Setup

1

Run a Typesense instance

The fastest path is Docker. One command gives you a running Typesense server with persistent storage:

Start Typesense with Docker bash
docker run -d \
  --name typesense \
  -p 8108:8108 \
  -v /path/to/data:/data \
  typesense/typesense:latest \
  --data-dir /data \
  --api-key=your-api-key \
  --enable-cors

# Verify it's running:
curl http://localhost:8108/health
# → {"ok":true}
2

Install the OCA modules

You need both the base framework and the Typesense backend. Add these to your Odoo addons:

repos.yaml (gitaggregate) yaml
./src/search-engine:
  remotes:
    origin: https://github.com/OCA/search-engine.git
  target: origin 18.0
  merges:
    - origin 18.0

# Modules needed:
# - connector_search_engine   (base framework)
# - connector_typesense       (Typesense backend)
3

Configure the backend in Odoo

Go to Search Engine → Configuration → Backends and create a new Typesense backend with your connection details.

Backend configuration fields form
Host:      localhost          # or your Typesense server IP
Port:      8108
Protocol:  http              # or https in production
API Key:   your-api-key      # set when starting Typesense
4

Define your indexes and bind records

Use the Search Engine configuration to define which Odoo model maps to which Typesense collection, and which fields to export. The Typesense Dashboard (an open-source UI tool) makes it easy to inspect and manage your collections visually.

🛠

The OCA team recommends using typesense-dashboard for managing your Typesense server — it gives you a clean UI for browsing collections, testing queries, and configuring index mappings without writing API calls manually.

What Gets Indexed — A Practical Example

The module is designed to export any Odoo model to a Typesense collection. The most common use case is product search, but the framework is generic. Here's a simplified view of what a product index definition looks like:

Typesense collection schema — product catalog python
# Defined via connector_search_engine binding + serializer
# Maps Odoo product.template fields → Typesense document schema

{
    "name": "odoo_products",
    "fields": [
        {"name": "name",         "type": "string"},
        {"name": "description",  "type": "string"},
        {"name": "categ_id",     "type": "string", "facet": True},
        {"name": "list_price",   "type": "float",  "facet": True},
        {"name": "active",       "type": "bool"},
        {"name": "website_url",  "type": "string"},
    ],
    "default_sorting_field": "list_price"
}

# Result: any search hits this index, not PostgreSQL
# Typo tolerance, faceted filters, and ranking — automatic

Once a record is bound, the synchronization layer watches for changes in Odoo and keeps the Typesense index up to date. Creates, writes, and deletes in Odoo propagate to the search index — so the data stays fresh without manual re-indexing.

Why This Matters for Odoo E-commerce

Odoo's website module uses PostgreSQL for product search. That works, but it has real limitations that become painful at scale:

  • Typos produce no results — "iphone charger" won't find "iPhone charger"
  • No relevance ranking — all text matches are treated equally
  • No instant-as-you-type — each keystroke hits the database
  • No faceted filtering without custom SQL — category, price range, attributes
  • Performance degrades as the catalog grows

With connector_typesense, all of these are solved at the architecture level — the search engine handles it, and Odoo stays focused on business logic and order management.

⚠️

One thing to plan for: Typesense keeps its index in RAM. For a typical Odoo product catalog (up to ~500k products with metadata), a server with 4–8 GB RAM is comfortable. Plan your infrastructure before going to production.


👨‍💻

KobrosTech contribution

Mohamed Alkobrosli (KobrosTech) is listed as a contributor to connector_typesense in the OCA credits. The module was built by Kencove and Derico and is actively maintained under OCA's search-engine repository, available for Odoo 16.0 and 18.0.

Add Real Search to Your Odoo

Whether you're building a product catalog, a customer portal, or any searchable interface on top of Odoo — connector_typesense is the right foundation.

Sign in to leave a comment
Stop Guessing Why Odoo Denies Access