-
Posts
128 -
Joined
-
Last visited
-
Days Won
8
Adik last won the day on February 15
Adik had the most liked content!
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
Adik's Achievements
-
Adik started following Replacing JoliSearch with Meilisearch in ThirtyBees – early results
-
Hi everyone! For the last few years I’ve been using JoliSearch module v4.3.28. It’s been a staple in my store, but as my catalog grew to over 10k products, I felt it was time for something faster and more precise, especially for technical search terms. I’m not a hardcore developer, but I’m passionate about making my store run better. 😊 Why replace JoliSearch? JoliSearch has several limitations today: It is no longer actively maintained. Search relevance is difficult to fine-tune. Loose matching often returns hundreds of results. The first visible results are not always the most relevant. Users may leave the store because they cannot quickly find what they are looking for. In my case, searching for a popular product type returned over 500-800 products, many only partially matching the intent. That creates noise instead of helping the customer. For technical stores (industrial hardware, connectors, cables, IPC systems, etc.), this becomes a serious UX and conversion issue. Why Meilisearch? Meilisearch is a modern, open-source search engine designed specifically for high-performance, real-time search experiences. https://github.com/meilisearch/meilisearch Key characteristics: Index stored in RAM --> extremely fast response times (often 1–5 ms). Built-in typo tolerance and smart ranking. Simple and clean REST API. Lightweight and easy to self-host (currently running on same VPS as my store). Much easier to tune than older search modules. Native support includes: Synonyms Custom ranking rules Faceted search Filtering Typo tolerance controls Vector search (embeddings support) Automatic typo handling Meilisearch automatically handles common input problems: Minor spelling mistakes Missing hyphens (e.g. “usbc” vs “usb-c”) Word order variations At the same time, it allows strict control for technical catalogs: Disable typo tolerance for SKU/reference fields Limit the number of allowed typos depending on word length Keep technical codes exact (e.g. 81271, CA-SASA-12CU) This is extremely important in stores with many product references and model numbers. Dynamic suggestions & smart autocomplete The module already includes a live search endpoint and basic fast autocomplete. Further improvements (some already implemented, others in progress) include: Real-time product suggestions with image, price, manufacturer, and reference Intelligent grouping (products, categories, manufacturers, feature values) Query preprocessing for better intent detection Smart result limiting to avoid overwhelming users Even in its current state, this approach can significantly reduce search exit rates compared to classic result pages. AI integration – OpenAI embeddings & hybrid search One of the most exciting aspects is semantic search. Meilisearch supports vector search, which allows: Storing product embeddings Performing similarity-based queries Combining keyword search + semantic similarity (hybrid search) Using the OpenAI Embeddings API (or local embedding models), we can: Generate embeddings from: product name, technical parameters, categories, descriptions Store them in Meilisearch Enable natural language queries This enables: “Cable for powering laptop via USB-C 100W” “Splitter for two devices” “Industrial ethernet connector” The goal is not to replace keyword search, but to enhance it. Current status of my module After short initial testing, the results are very promising. Already implemented: Custom index (products_pl, products_eng) Batch reindexing (500 products per batch) Live progress bar in BO Live search endpoint Synonyms editor (graphical table UI) Automatic JSON generation for Meilisearch settings Query preprocessing for better intent detection Matching strategy control (strict vs fallback) Monitoring estimated result counts (to avoid result explosion) The improvement in relevance compared to JoliSearch is clearly visible, especially in edge cases e.g. “Y-type cables”, where search behavior can now be precisely controlled. The target is a search interface that behaves more like a modern SaaS-powered discovery engine rather than a traditional e-commerce search box — fast, relevant, visually structured, and intuitive for users (as shown in attached screenshot) Has anyone experimented with Meilisearch in ThirtyBees yet?
- 1 reply
-
- 2
-
-
Hello Peter, Is there an official fix for P24 or recommended snippet for TB to treat that state as pending and finalize the order via webhooks (payment_intent.processing/succeeded or charge.succeeded)? Also, do you suggest restoring the cart from metadata.cart_id on validation if the session is lost? I can share logs from /log/stripe_<date>.log if helpful.
-
Hi, you can parse a comma string into multiple tags. As a result, you will get a format compatible with Google Merchant Center. 🙂 Here is my solution for <g:additional_image_link> <?php $xml = simplexml_load_file('https://my-store.com/endpoint/google-merchant-center-products-only', null, LIBXML_NOCDATA); $rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"><channel></channel></rss>'); $rss->channel->addChild('title', 'Google Merchant Feed'); $rss->channel->addChild('link', 'https://my-store.com'); $rss->channel->addChild('description', 'GMC-only-products'); foreach ($xml->entry as $entry) { $item = $rss->channel->addChild('item'); $gChildren = $entry->children('http://base.google.com/ns/1.0'); $mainImage = (string)$gChildren->image_link; foreach ($gChildren as $child) { $name = $child->getName(); if ($name === 'additional_image_link') { $urls = explode(',', (string)$child); $count = 0; foreach ($urls as $url) { $url = trim($url); // Skip same main image if (!empty($url) && $url !== $mainImage) { $item->addChild("g:additional_image_link", $url, 'http://base.google.com/ns/1.0'); $count++; } if ($count >= 10) break; } } else { $item->addChild("g:$name", (string)$child, 'http://base.google.com/ns/1.0'); } } } Header('Content-type: text/xml'); echo $rss->asXML(); Save as my-feed-converter.php and add new file to GMC. GMC will start processing additional product images after a few minutes. 🙂
-
Hello, I'm looking for module which allow to create an attribute that will include several products from the e-store catalog. For example: I offer a PC. Customer can purchase an operating system (Windows Pro, IoT) directly on the product page, instead of searching for it in a catalog.
-
ITX-Sklep.pl - fanless industrial computers, Delock partner in Poland https://itx-sklep.pl Since v1.0.8 loyal to TB ☺️
-
copy file cookieconsent.min.js locally and add to header.tpl <script src="/modules/eucookieconsent/views/js/cookieconsent.min.js" defer></script>
-
The quickest way is to check where is "fonts.gstatic.com" / "cdnjs.cloudflare.com" saved. Install Visual Studio Code and connect with your VPS using ssh. Now you can search thousands of files in few seconds using the options Find in Folder. You can also add: Smarty Template Support, The Pattern Language (TPL) and tpl Lang addons.
-
Matomo native module - use proxy script feature out of date?
Adik replied to 30knees's topic in Other native modules
I added code after enableLinkTracking : {if isset($PIWIK_RCOOKIE_TIMEOUT)} _paq.push(['setReferralCookieTimeout', '{$PIWIK_RCOOKIE_TIMEOUT|escape:'javascript'}']); {/if} _paq.push(['enableLinkTracking']); _paq.push(['disableAlwaysUseSendBeacon']); -
Matomo native module - use proxy script feature out of date?
Adik replied to 30knees's topic in Other native modules
Important msg for Matomo users While browsing Google Search Console today, I discovered that GoogleBot was only loading small section of my product pages. Error from GSC: "Page resources. Failed to load 1/57 of resources" GoogleBot was blocking by matomo.js file. The solution is simple, add following line to script: _paq.push(['disableAlwaysUseSendBeacon']); Example of full code with added line: <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); _paq.push(['disableAlwaysUseSendBeacon']); (function() { var u="https://store-domain.com/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '2']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> If you are using Matomo Web Analytics module add code to file: /modules/piwikanalyticsjs/views/templates/hook/jstracking.tpl (line 27) I discovered this when I saw that the number of reviews visible in a Google search had started to fall rapidly. -
Ok, here is profiling results from my toaster VPS 😄 A way to reduce CLS is to add min-height and min-width in CSS for divs that change size when page loads. I have also moved price filtering to the end of blocklayered module.
-
Uses Passive Event Listeners to Improve Scrolling Performance, should we care?
Adik replied to the.rampage.rado's question in Technical help
Try add code to header.tpl in your theme directory: <script defer type="text/javascript" src="https://unpkg.com/default-passive-events"></script> {if isset($js_defer) && !$js_defer && isset($js_files) && isset($js_def)} {$js_def} {foreach from=$js_files item=js_uri} <script defer type="text/javascript" src="{$js_uri|escape:'html':'UTF-8'}"></script> {/foreach} {/if} -
internal server IPv6 added for maintenance mode ?
Adik replied to DRMasterChief's question in Technical help
What distro do you use? Do you have ssh access? Try to disable IPV6 support, for example for Debian it will be: /etc/NetworkManager/system-connections: [ipv6] addr-gen-mode=stable-privacy method=disabled -
I like it! 50 connections / month in gocardless will be also enough. 😊
-
I wonder about one thing. To log in to the bank confirmation is required in app on my mobile device. It's possible to do this via API?
-
Such a module will be very useful, no more manual checking payments! 🙂 What is expected price?