| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
eCommerce (website_sale)
• Discuss (mail) • Website (website) • Invoicing (account) |
| Community Apps Dependencies | Show |
| Lines of code | 1266 |
| Technical Name |
ai_ecom_smart_search |
| License | OPL-1 |
| Website | https://erpoxa.com/ |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
eCommerce (website_sale)
• Discuss (mail) • Website (website) • Invoicing (account) |
| Community Apps Dependencies | Show |
| Lines of code | 1266 |
| Technical Name |
ai_ecom_smart_search |
| License | OPL-1 |
| Website | https://erpoxa.com/ |
Search by meaning, not just keywords
Semantic re-rank on /shop — 'warm winter coat' finds your Alpine parka.
| ▶Watch Demo Video |
Smart Semantic Search
When a customer types what they mean instead of what's written on the label, your shop still answers — and it answers in seconds, even across a 14 000-product catalog.
See it on real /shop pages
Captured frame-by-frame against the same 14 743-product catalog. Same query, two outcomes.
No editing tricks — the only thing that changes between halves is the Smart Search toggle.
Test this module instantly
You can explore all features using the demo account. No setup required.
0 → 21 results
Same intent-style query. Keyword: "No results". Smart Search: 21 relevant products.
~11s → ~2s
Empty-keyword search scans the catalog. Smart Search uses a vector index — 4–6× faster.
Per-website toggle
Multi-website ready: enable on store A, leave keyword-only on store B — without disabling embeddings.
Tested at 14,743 products
Real catalog, 30 categories. pgvector optional — without it, Python cosine still serves results in seconds.
What your visitors see today vs. with Smart Search
Four genuine intent queries — phrases no product is named after. We measured wall-clock time and result count on a real /shop page.
Why this works: no product contains the phrase "cozy reading corner". Smart Search embeds the query, asks Postgres which product vectors are closest, and surfaces Minimalist Cable-Managed Corner Desk, Compact 60-inch Gaming Desk, accent furniture etc. — the things a customer with that intent would actually buy.
Wall-clock comparison (4 fuzzy queries · 14 743 products)
| Query | Default keyword | Smart Search | Speedup |
|---|---|---|---|
| cozy reading corner setup | 0 results · 11.4 s | 21 results · 2.9 s | 3.9× |
| warm winter coat | 0 results · 11.2 s | 21 results · 2.1 s | 5.4× |
| gift for a coder who works from home | 0 results · 11.4 s | 21 results · 3.5 s | 3.3× |
| something to read in a hammock | 0 results · 10.9 s | 1 result · 1.6 s | 6.6× |
Measured with Python-cosine path (no pgvector). With pgvector enabled, the search step drops to single-digit milliseconds — making the overall page render limited by the website theme, not the search.
Two switches: global kill, per-site control
Smart Search ships with two independent toggles so multi-store admins can roll it out one website at a time, A/B-test, or instantly fall back to Odoo's default search if a model misbehaves.
- Global kill-switch (in Settings → AI eCommerce): turns Smart Search off across every website. Embeddings stay intact for when you re-enable it.
- Per-website toggle: same Settings form, scoped to the currently-edited website. Tick it on for your
main.example.com, leave it off for the staging website — no code change. - Failure-safe: when the OpenAI call fails (rate limit, downtime), the controller logs the exception and serves Odoo's keyword results unchanged. Customers never see a broken /shop.
# In the controller
if not param.get_param('ai_ecom_ss.enabled'):
return keyword_results # global OFF
if not website.ai_ecom_ss_website_enabled:
return keyword_results # this website opted-out
return semantic_rerank(...) # opted-in → Smart Search
Both flags must agree. Either one off → Odoo's stock keyword search.
No black box — every step is inspectable
Embed
Product name + SKU + sale description go to text-embedding-3-small. Result vector saved on its own row, hashed by content so unchanged products skip re-embedding.
Index
A cron drains the queue in parallel batches (configurable). Big reindexes chain-trigger themselves so a 14k catalog drains in minutes, not hours.
Query
Visitor's search is embedded too; cosine similarity ranks the catalog. If pgvector is on, Postgres does the math via the <=> operator — milliseconds.
Log
Every embedding + query call lands in AI eCommerce → Request Log: tokens, latency, source, model. Spot expensive sources, see who hammered the API.
Visitors find products without knowing your names
Embed once, search forever
A cron embeds new and modified products every 15 minutes. Each product's embedding lives on its own row.
- Hash-based skip — only re-embed when content actually changes
- Manual "Reindex all products" button
- Indexing batch size + retention configurable


/shop search becomes intent-aware
Odoo's keyword search is augmented: when keywords return nothing, semantic similarity fills the gap. When keywords return something, semantic re-ranking pushes the most relevant to the top.
- Re-rank keyword results by semantic similarity
- Fall back to semantic-only when keyword search is empty
- Works with every Odoo theme
Three steps to semantic search
Install the module
Depends on ai_ecom_base + website_sale.
Reindex your catalog
AI eCommerce → Reindex all products. Wait a few minutes.
(Optional) Enable pgvector
For catalogs over ~1k products. One click in Settings.
Plays well with the rest of Odoo
Stop losing sales to "no results"
Install Smart Semantic Search and your visitors find what they meant, not just what they typed.
Built & supported by Erpoxa
An Odoo consultancy focused on scalable AI-powered modules and bespoke integrations. We answer fast and ship clean code.
Website
All apps, docs & portfolio
erpoxa.comOdoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module