Shopware – we are partners!

Shopware was developed more than 20 years ago in Germany and is a proven technology that today drives over 100,000 efficiently operating online shops.

Shopware 6 implementations are characterized by clear development and maintenance costs. The license price is a one-time fee, regardless of the turnover and the number of products in the store. On the other hand, modern solutions and well-known popular technologies (e.g. PHP Symfony framework, Vue.js, etc.) make Shopware highly valued by developers working with it. This significantly shortens the implementation time and considerably reduces the financial outlay.

shopware implementation

The implementation of Shopware offers measurable benefits

The same applies to the ongoing maintenance and administration of the eCommerce system. Shopware has an intuitive interface that simplifies the daily management of products and sales processes. It saves time and effort.

On a par with the popular platform – Magento 2, Shopware is open-source software. It gives a global community of developers access to the platform’s source code, which ensures the constant and rapid development of the system. It also allows individual functions to be tailored to the needs of a specific implementation.

Every business is different – Shopware lets you implement these differences into your eCommerce. Online environment will reflect the nature and management style of your organization’s processes. Also, open code gives you the flexibility you need to stay ahead of trends and the demands of a changing market.

Shopware 6 also includes over 3,500 applications, templates, and interfaces available in Shopware Store. It offers standard interfaces for the most popular payment providers (including PayPal, Klarna, credit cards, etc.) and interfaces for popular systems such as ERP, PIM, newsletters, marketplaces, etc. All controlled through an intuitive manager that allows for simple management, installation and updating of extensions. The platform also has technical support available for the teams working with it.

The Shopware 6 functionalities meet all the needs of your customers and your business

The core functions of Shopware 6 include customer and order management mechanisms, including the possibility of individual price configurations (i.e. rule-based price lists based on specific customer characteristics). The system offers multichannel features and special B2B features are available in the Enterprise Edition. SEO options and optimization for mobile-first indexing are already integrated as standard. All this is held together by comprehensive analysis and statistical tools.

shopware fast orders
Shopware implementation | Features

Omnichannel

The platform allows you to conveniently manage sales across multiple channels. A single CMS gives you the ability to unify the customer experience regardless of where they are: whether it be your online shop (stationary or mobile), marketplace, POS, or any other space where the customer is looking for your products. Multi-channel support allows us to adjust content, languages and payment methods to each channel individually.

API-first and headless solutions

Scaling and flexible adaptation to the tools preferred by customers and users is the strength of eCommerce solutions, which are to deliver stable and long-term benefits. Implementation of this eCommerce platform results in a limitless number and type of front-ends used in our sales system. Building eCommerce based on Shopware 6 technology, we can address our customers’ needs, freely adjusting the design, language and communication depending on the target group and channel of reaching.

Customers are different, but we always maintain full and easy control over the experience in our online store environment.

The multi-channel service is also supported by the available PWA (Progressive Web App) solutions. The PWA works like an app, with following benefits: sending notifications, functioning without an Internet connection, creating an icon on desktop, constantly accompanying the customer, as well as increasing security and speeding up the service.

shopware b2b eCommerce functionalities

Implementation of the B2B eCommerce platform based on Shopware 6

Extensive B2B functions allow you to replicate the specifics of even the most complex business models in organizations focusing on B2B relationships. Creating an offer tailored to the specific B2B customer greatly accelerates the ordering process. Shopware 6 for B2B means:

Take advantage of a comprehensive service for the implementation of Shopware 6

The long-standing presence in the market and the open-source model give the Shopware platform excellent flexibility in adapting to business needs. The key to success is the experienced team responsible for the implementation. As a Shopware partner, we have the competence and many years of experience in implementing eCommerce systems.

As a Shopware Business Partner, our team is familiar with the specifics of the Shopware tool.

With over 10 years of experience in developing successful eCommerce solutions, we can guarantee the highest level of implementation – feel free to contact us!

Key features of B2B eCommerce platforms | What to look for in eCommerce software?

According to recent projections, eCommerce sales are to grow by over 14% only in the United States in 2022, reaching nearly $1.8 trillion. Retail sales are also projected to grow with an astonishing 16% rise in sales, crossing $1 trillion for the first time ever. If you’re running a B2B model company, now is the best time to make the switch from traditional commerce to B2B eCommerce.

To ensure a smooth and profitable transition, it’s extremely important to use an efficient B2B eCommerce platform to host your business. Technology is developing at an alarming rate – make sure you choose software that won’t become obsolete in a year, with proper functionality in place that guarantees scaling.

What exactly to look for in a B2B eCommerce system? There are so many variables it can get dizzying trying to keep up!

We’ve prepared this easy-to-read guide to the key features of B2B eCommerce platforms to help you get a better understanding of how such software works and what you should expect of it. Let’s delve in!

transport b2b e-commerce features
B2B eCommerce – concepts, functions and features

Key concepts of B2B eCommerce

How to work with business clients online? Before we begin our search for the most effective B2B eCommerce software, we need to first explore the subject of B2B eCommerce in itself. If you’re not yet familiar with online B2B commerce, here are some of the most important characteristics:

  1. Prevalence of large-scale orders
    One of the most important features of B2B eCommerce, and B2B business models in general, is the so-called AOV – Average Order Value. In contrast to B2C, B2B clients tend to order a much larger volume of your product. Instead of selling one or two products to each client, B2B businesses often sell hundreds, if not thousands, of products to their buyers. On the other hand, B2B eCommerce features much fewer buyers than B2C, on average.

  2. Building a relationship with your client
    Since you’ll be dealing with much fewer clients than a B2C eCommerce company would, you’re going to have to keep them returning somehow – building a good relationship between your company and your clients is a very significant aspect of B2B commerce. Keep in mind that more than one person may be involved in each purchase, and you want good relations with the brand – not only the representative.

  3. Different purchasing methods to B2C
    The purchasing process is much more complex in B2B eCommerce than in B2C. Evaluation and negotiation are crucial parts of almost every B2B transaction, where in B2C they are virtually nonexistent. Remember that your customers won’t be mindless buyers, and you need to really show them why your business is the most optimal solution to their problems. There’s also a good chance they’ll be making repeat purchases regularly, making it worth it to keep each and every customer.

  4. Cost-saving is often the utmost priority
    When working in the B2B sector, your clients are operating on a set budget – a budget that needs to be managed appropriately to limit excess spending. If you want to make it as a B2B eCommerce company, you need to offer your clients a better deal than your competitors. Keep in mind that this does not necessarily mean that your price needs to be directly lower, but instead that what you offer needs to match that price.
key features of b2b e-commerce platform

Now that we know a little about the main features of B2B eCommerce, let’s move onto the key characteristics of B2B eCommerce software that you need to be on the lookout for:

The main elements of B2B eCommerce systems: functions that stimulate business growth

When making a switch to eCommerce from traditional commerce, or founding a brand new eCommerce business, the choice of software is extremely important. Most companies decide to go with a ready-made software solution that fits their business needs, as building one from the ground up is a very time-consuming and resource-heavy task.

But what to look for in a B2B eCommerce software? What features will guarantee a smooth transition and allow you to maximize profits?

Here are some basic features that your B2B platform absolutely needs:

  1. Restricted access and customer verification
    Security is the basis of B2B eCommerce – your clients want to make sure that their data is kept safe and confidential. They also want to avoid unauthorized access, as should you when running an eCommerce business. Customer verification by ID or other credentials should be necessary to gain access to your system.

  2. Customized pricing plans
    While B2C platforms tend to feature a single price for each of their products or services, B2B systems offer flexible pricing to match the specific client. Depending on the quantity of products bought, as well as other factors, you can set up prices however you wish. Quantity discounts and set prices for specific product groups are the absolute essentials.

  3. Credit management
    Making orders on credit is a common custom in B2B commerce – the same goes for its online equivalent. Some of your clients may want to pay for their order at a later date, but still need to receive the products as early as possible. Credit management allows such customers to receive a line of credit, up to the limit of which they can order products. You have full freedom in setting these limits: the bigger the client, the bigger the limit.

  4. Pricing negotiation
    Depending on their order size and buying frequency, some clients might not feel like paying the full price every single time – and rightly so! The heart of the B2B model is negotiation, which is why a built-in negotiation functionality is key for B2B eCommerce systems.

  5. Logistics management
    Can your client buy a pallet of products that’s only partially full? How many pallets can fit in a truck? Are they stackable or not? These questions are the bread and butter of B2B companies, and a good eCommerce platform for such companies should implement efficient and intuitive logistics management.

  6. Customizable delivery methods
    Depending on the size and needs of your client’s company, they might order a smaller package that can be delivered by courier service – but what if they need an entire truckload of goods? Choosing the appropriate delivery method to each order is crucial for successful management, and it’s important for eCommerce systems to handle that functionality.

  7. Order history
    Business clients want to keep a close eye on every process going on in their companies – including the details of each order, both past and present. By giving your client access to an expansive order history, you’re building their trust and keeping their reservations at bay. It’s also an easy way of tracking inventory for your clients, letting them know when to repeat their order.

  8. Dashboard
    Good B2B eCommerce system won’t waste your time with deeply-hidden statistics and basic functionalities – instead, a proper dashboard will contain all of the most commonly used features, giving you quick access to the latest orders, popular products, saved orders, and so on. Even better – some platforms give you the option to customize your dashboard to make it suit your needs better!

There’s quite a number of these functionalities – and they are only the most basic ones, which should only be natural for every B2B eCommerce system to implement. However, if you’re looking for a business-class experience, choosing a premium platform might be more beneficial.

logistics features in b2b e-commerce system

Unique features that’ll take your B2B eCommerce to the next level!

Apart from the standard features, there’s a variety of extra features that companies implement when creating proprietary B2B eCommerce systems. Some of these features are:

  1. A detailed demo
    Many B2B companies who are new to the eCommerce model of doing business are not familiar with the technicalities and how to operate such a complicated system. For them, an introductory demo would be extremely useful, showing them in an approachable way how to operate the software in an effective way.

  2. Order fulfillment checklist
    Managing each order individually can get confusing, especially if you’re dealing with a large number of orders every day. Instead, an order fulfillment checklist can make the whole process easier, giving you digital tools that make the whole process quicker and more fool-proof.

  3. Advanced search engine
    If you want your potential clients to land orders, they need to be able to find the products they want – without the endless searching and trying to somehow find what they’re looking for. An advanced search engine should implement searching not only by product name, but also product code and even its fragments. Whether your client knows what they’re looking for or not, your search engine should help them find it.

  4. Delivery scheduling tools
    Business clients often need a very precise delivery date set up, down to the hour the products are going to arrive. For that, your order needs to be prepared in a timely manner and scheduled for delivery ahead of time. Proper scheduling tools make that a lot easier – and cheaper – to handle.

  5. Private assistant / Panic button!
    In B2B eCommerce, the individual approach is extremely important. Assigning a designated sales rep to each client gives them comfort and easy access to guidance in case of problems or questions. A premium eCommerce platform can implement sales rep contact as part of its functionality, making the whole process streamlined and easy for your clients.

  6. Recommended products / market insights
    With smart predictions based on your client’s search and purchase history, a professional B2B eCommerce system will provide recommended products for each of your clients individually. This gives you easy access to cross-selling, boosting your revenue and satisfying client needs at the same time.

  7. Importing an order from a file
    Considering that B2B sales are often associated with orders for a large number of goods, customers may appreciate the possibility of importing an order from files they work on.

These – and more – are the features of a well-designed B2B eCommerce platform. When searching for software to use, look for ones with such features in store – here you can find the ones designed by ORBA.

We have over 10 years of experience in the professional design and deployment of complex B2B eCommerce systems. Depending on your business needs, we’ll provide you with a personalized platform that’ll more than do the job –

contact us for more details!

10 ideas to boost your BLACK FRIDAY eCommerce marketing strategy!

Because of the ongoing pandemic, to a large extent, digital shopping is taking over offline sales at an extremely rapid rate. According to studies, eCommerce sales in the United States increased from ~16% to ~20% between 2019 and 2020, compared to an only 1,5% difference between 2018 and 2019.

To make the most out of the Black Friday season and maximize your eCommerce profits, you need a proper plan. Building the right strategy for Black Friday is the key to success, saving you the headache of brainstorming and implementing ideas at the last moment. It is also an exceptional moment to introduce a digital aspect to your brick and mortar store, which is only a small investment compared to the potential increase in sales!

Black Friday eCommerce strategy | Marketing tips

However, how exactly do you prepare a Black Friday eCommerce strategy? What are the best ideas to increase your revenue and help your company grow? To help you answer those questions, we have prepared this guide of the 10 best ideas to build your eCommerce strategy for the Black Friday season!

systemy B2B e-commerce  | Black Friday eCommerce strategy | Marketing tips
eCommerce marketing strategy | Tips

Step 1: Start with the basics – setting up your platform, advertising, and UX

Let’s start with the fundamentals – if you have no clue what to do to prepare your eCommerce business for the upcoming Black Friday shopping rage, these ideas will be perfect to begin with.

Whether your company specializes in B2B or B2C products/services matters significantly when launching an eCommerce platform. The two types of clients each have their own buying behaviors that need to be considered and often look for distinct features first.

B2B eCommerce platforms might prefer a more streamlined design, while B2C platforms can benefit from visible customer reviews and transparent product highlights.

Are you utilizing your social media channels optimally when reaching customers? Going deep with your target research might bring you valuable information on how to better target your Facebook and Instagram ads, so make sure you do it right – or get a team of experienced analysts to do it for you!

You can also think about diversifying your outreach channels – transferring some of your advertising budget into paid advertisements might pay out in the future, as statistics show it is one of the most effective ways of reaching new customers, especially close to Black Friday.

Are your customers suddenly leaving your website in the middle of the buying process and you can’t figure out why? It just might be an UX flaw that’s turning your clients away!

Conducting a deep UX analysis will give you valuable insight into how your eCommerce platform performs from the user’s point of view. Taking action appropriate to the results is the key to guaranteeing a smooth user experience and is one of the best eCommerce marketing ideas for you to implement.

Step 2: consider branching out your eCommerce marketing strategy efforts | Remarketing, SEO, and ERPs

Now we’re getting into details – if you haven’t looked at these when devising your eCommerce marketing strategy, it is the best time to do so if you want solid results for Black Friday!

Returning clients can be just as important as new ones – even more so for B2B businesses! With an ever-increasing saturation of varying client types, clinging on to your customer base is the key to increasing sales. Remarketing is a feature of Google Ads that will allow you to retain more clients after Black Friday ends, in a simple and easy way.

SEO has been proven times and times again to be an effective tool in increasing website outreach, and through this boosting revenue. Google’s algorithms are getting more and more sophisticated with every update, so making sure your SEO features fit in organically with the content is a fool-proof approach to positioning.

Making sure your eCommerce platform works without hicks and allows scalability are the keys to growth. An ERP (Enterprise Resource Planning) is an extensive software, which when properly integrated with your eCommerce platform, gives you an easy way to manage all vital processes of your company using a unified system. Proper ERP integration is crucial to making sure every piece fits together in a perfect harmony.

Step 3: specific tools to use – specialized copy, newsletters, and automation

Here, we want to give you some specific ideas to implement in your eCommerce marketing strategy for Black Friday, which can immediately improve your turnover for the upcoming holidays.

Taking advantage of your content is crucial to reaching out more customers before, during, and after Black Friday. Think about publishing posts, stories, or articles that are relevant to the Black Friday shopping spree – sharing shopping tips and best deals are great ways of reaching out to customers.

As research shows, it is much more effective to send out personalized newsletters to each segment of your audience, instead of just bombarding them all with the same emails. This way, you’ll be able to meet the specific needs of each customer segment and actually get through to them instead of just annoying them.

Loyalty rewards are a classic strategy for increasing retention rate and purchase frequency. Giving your customers automatic access to these rewards during checkout has been shown to increase order values – after all, clients prefer such simple solutions to browsing the Internet in search of coupon codes for hours.

e-commerce marketing strategy
eCommerce marketing strategy | Ideas

Black Friday eCommerce marketing strategy – final thoughts | Always keep experimenting!

The best way of staying ahead of your competition is constant experimentation – never stop developing new ideas and trying them out, as it will give you a wider perspective on which strategies are effective.

Now that you know how to prepare an effective Black Friday eCommerce marketing strategy, nothing is stopping you from maximizing your sales for the holiday season. However, if you need a pair of extra hands to bring your online store to the next level, contact us at ORBA – we help clients with everything eCommerce related, from UX design, eCommerce development and implementation, to service & maintenance!

ORBA as a sponsor of the Meet Magento 2021 conference!

Meet Magento is an international conference that takes place in over 40 countries. It brings together professionals and people interested in the Magento e-commerce platform. This year’s conference program was divided into two discussion panels: technical and business.

It created a space to exchange insights and experiences from the entire area of e-commerce: from technological solutions to changes in business processes. The topic of responding to COVID difficulties in the e-commerce market was also covered.

Meet Magento | Our participation

podpisz    Meet Magento PL 2021  Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021
Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021

During the ‘business’ day, our CEO, Roman Baluta took part in a discussion about “Marketplace – a marketing trend or a real opportunity? How to approach it and not burn yourself?”

On the other hand, our Program Manager, Cezary Brzozowski, was engaged in the panel discussion about “Pre-implementation analysis – it is a threat to investors and a defense to contractors. How is it in reality?”.

We are happy to share our Magento implementations experience with the community. We are also proud to participate in setting the direction in which the standards of conducting such projects evolve.

This event is not only a conference. Above all, Meet Magento is a chance to present new opportunities provided by enterprise-class e-commerce technologies. It is also a chance for software houses to meet and learn about the needs of the business environment. From our perspective, this is the key possibility offered by the Meet Magento conference.

Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021
Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021

The agenda of this year’s edition met these expectations – here you can see the topics that were covered during the event: AGENDA.

ORBA | Silver sponsor

All the above elements were important to us when we decided to become involved in this conference. As ORBA, we are happy to share our experience in Magento implementations. We are also proud that we can participate in setting the direction in which the standards of conducting such projects evolve.

Meet Magento 2021 passed in a great atmosphere, and we are already looking forward to meeting you next year!

Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021
Meet Magento Poland 2021 at Snowdog HQ 20-21 September 2021

eCommerce for MANUFACTURERS | Post-COVID challenges and how eCommerce can help


eCommerce for manufacturers | What changed with Covid-19? Well, for a start, steps one and two were made worse due to the presence of technology, social media and fresh uncertainty.

In the past, word of mouth was the prevailing way of sharing news. These days, we can take to the web and learn about things while they are actually happening. As a result, a lot of false news was put out there that took its toll on businesses of all shapes and sizes – especially those that suddenly found themselves unable to let physical customers into their stores.

Worrying Challenges Faced by Manufacturers

Early on, an alarm was sounded and it just so happened to be one that stopped many producers and manufacturers in their tracks. All of a sudden employees couldn’t congregate, which put a halt on production, and this on-again-off-again relationship with Covid has been happening right through to 2021.

To make matters worse, shipping systems began to shut down as restrictions were made on an international level and as a result, consumers couldn’t get what they wanted and products sat in warehouses gathering dust. Many manufacturers began to struggle when attempting to reach retail businesses that had to reduce staff, slow productivity, lower their budget, or even shut down entirely. For entities that had the capability to continue their manufacture, they faced a new issue – the inability to find someone to sell their products to.

Countless manufacturers have found it increasingly difficult to shift their goods and without knowing about the potential of eCommerce, plenty have been forced into closure.

Did You Know…?

eCommerce DTC (Direct to consumer) brings consumers straight to the manufacturer, cutting out the middle man, negating the need for expensive overheads and allowing a producer to thrive online instead of relying on retail stores to buy their goods?

For a solid 6 months in 2020, activities slowed and as you might imagine, this cost a multitude of professional industries billions in losses, with this number still being calculated.

Perhaps the most terrifying notion is that even 18 months later, many countries still don’t know if they will suddenly be locked down, forcing physical stores to close, open and close again.

What Did This Mean for Businesses?

To put it simply, businesses wanting to continue making a profit had to evolve, usually with a dedicated digital transformation strategy to survive. They had to find a way to reach their existing market in a ‘new normal’. This led to many closures between mid-2020 and early 2021 (over 200,000 in the US alone according to data).

But as apocalyptic as this might sound, the reality is that where there is a will, there is a way. As more and more companies had to close their doors for months at a time, a certain percentage of new and existing organizations turned to the one source of provision that even a dreadful virus couldn’t stop – digital transformation via the internet.

According to a survey detailed on unctad.org, 2020 saw one of the biggest rises in the formation of online retail businesses. And this doesn’t appear to be a temporary rise either; in fact, experts have predicted that Covid-19 will change the way that people purchase their goods forever.

For producers and manufacturers of goods, this unsavory situation could go on to become somewhat of a blessing in disguise – especially where eCommerce is concerned.

eCommerce for manufacturers | What Does This Mean in 2021?

Due to the extreme nature of Covid-19 and the rapid way in which it has affected the entire world, a new precedent has been set for online shopping – one that could provide a way forward for internet retailers.
As people step away from their usual method of shopping, i.e. visiting a brick-and-mortar store, they are finding a newer solution. Google searches for online shopping and eCommerce stores are at an all-time high and this trend looks set to continue well beyond 2021.

This spells that eCommerce for manufacturers makes an incredible range of potential for the following types of enterprises:

Of the three types of company above, they all share one thing in common: they can be ideal for working within the B2B setting.

With eCommerce solutions also providing tools to help with managing and processing business data, there’s never been a better time for producers and manufacturers to consider dropping the previous need for a sales representative, in favor of opening new distribution channels. Additionally, businesses that sell goods (as well as online retailers), can offer direct-to-consumer solutions (D2C) with minimal fuss when doing so online.

How Can B2B eCommerce Help?

B2B eCommerce works by taking each of these possibilities and tying them together on a B2B eCommerce platform that works seamlessly.

As briefly mentioned above, the potential to take advantage of streamlined solutions and tools for processing business data becomes a possibility as well. This includes options to monitor sales data, overhead costs, expenses and even productivity – all at the click of a button when using an eCommerce solution. With these digital tools at their disposal, businesses at the start of the product chain (manufacturers) can enjoy access to dedicated distribution channels that negate the need for a sales rep, and take their products directly to the customer; minimizing their costs in the process.

This method takes full advantage of a situation that has been destroying businesses due to lack of engagement, by allowing them to co-exist within a digital setting to meet all levels of supply and demand.

eCommerce for manufacturers | Benefiting from eCommerce

According to NetComm Suisse, almost every single product category available online has seen an increase in their demand; including cosmetics, fashion, education and digital entertainment.
Although popular before COVID-19, this fresh drive of consumers is now the biggest market to have ever existed.

Manufacturers:
For those creating products and goods, establishing a presence online can allow a way to reach countless businesses in need of items to sell. There’s genuinely no better way to do so than via an eCommerce platform; all but eliminating the middle-man and enhancing profitability in the process of direct-to-consumer sales (DTC).

Suppliers:
From personal care to clothing; suppliers can locate their ideal manufacturers, source products in bulk (typically at a reduced rate), and then distribute their goods via B2B sales.

Producers:
Ecommerce for manufacturers with options for eCommerce order management, a production company could offer an incredible variety of goods and materials via a website, blog, or even social media page, and then enjoy new distribution channels afforded by eCommerce platforms to take products straight to market (B2C / DTC).

If all of the above wasn’t appealing enough, there’s also the ability to save the cost of overheads by running an eCommerce site instead of a physical store.

eCommerce for manufacturers | Summary

E-commerce (especially DTC / direct to consumer) provides a way for manufacturers, producers and consumers to benefit from one another in a safe, comfortable environment with minimal risk and maximum profitability. Throw in the added benefits that come with eCommerce platforms, including the ability to process vital business data and track sales, eliminate sales representatives (plus their commissions), and more – and you have a very convincing way of conducting business in these uncertain times.

How does Elastic Search work with Magento?

1. Overview

Elasticsearch is used as a search engine in Magento. Since Magento 2.4, Elasticsearch is a required component and installation of Magento without Elasticsearch is not possible.

To integrate Magento with Elasticsearch, the following steps are needed:

The version of Elasticsearch should be compatible with the Elasticsearch library and Magento. Magento has a separate module for each Elasticsearch version. Not every version is supported.

By default, there is only one index in Elasticsearch for each Magento store – search index for products. All existing query types use the same index. There are no indexes for other entities such as categories, customers or CMS pages.

It is possible to create other indexes in Elasticsearch and new query types using these indexes, although it seems quite a large effort.

Magento ignores any indexes in Elasticsearch not defined in Magento, so it is possible to use the same instance of Elasticsearch for other purposes.

Elasticsearch is used mainly in storefront. Regular search in admin panel does not use Elasticsearch.

2. Reindex

Data in Elasticsearch is always secondary data, synchronized with data in MySQL database. The process of synchronization is called reindex. Magento provides different ways of making reindex:

  1. Full reindex – which can be triggered manually by a developer – in command line or in code
  2. Partial reindex – reindex of only those products that actually changed
    1. on save – reindex happens immediately when product is saved
    2. on schedule – saved product is only added to the queue of products waiting for reindex. A background process that runs every minute makes reindex of all products in queue asynchronously. This is a better option considering performance

The only Magento Indexer related to Elasticsearch is Catalog Search.

A product record in Elasticsearch looks like that:

{
   "store_id":"1",
   "sku":"24-MB01",
   "status":1,
   "status_value":"Enabled",
   "visibility":4,
   "name":"joust duffle bag",
   "url_key":"joust-duffle-bag",
   "description":"The sporty Joust Duffle Bag can't be beat - not in the gym, not on the luggage carousel, not anywhere. Big enough to haul a basketball or soccer ball and some sneakers with plenty of room to spare, it's ideal for athletes with places to go. Dual top handles. Adjustable shoulder strap. Full-length zipper. L 29\" x W 13\" x H 11\".",
   "category_ids":[
      2,
      3,
      4
   ],
   "position_category_2":"0",
   "name_category_2":"Default Category",
   "position_category_3":"0",
   "name_category_3":"Gear",
   "position_category_4":"0",
   "name_category_4":"Bags",
   "price_0_1":"34.000000",
   "price_1_1":"34.000000",
   "price_2_1":"34.000000",
   "price_3_1":"34.000000"
}

To index additional product data in Elasticsearch, the simplest solution is to create a product EAV attribute with proper parameters (e.g. Use n Search = Yes, or Visible in Advanced Search = Yes).

It is also possible to create a fake product attribute (static EAV attribute without actual column in database) and index an arbitrary value using a Magento plugin.

3. Search Request

Requests to Elasticsearch are built based on configuration in search_request.xml files.

The files define different query types. By default, Magento uses the following query types:

In Magento Commerce B2B extension, there is one additional query type:

Main search_request.xml file looks like that:

<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="urn:magento:framework:Search/etc/search_request.xsd">
    <request query="quick_search_container" index="catalogsearch_fulltext">
        <dimensions>
            <dimension name="scope" value="default"/>
        </dimensions>
        <queries>
            <query xsi:type="boolQuery" name="quick_search_container" boost="1">
                <queryReference clause="should" ref="search" />
                <queryReference clause="should" ref="partial_search" />
                <queryReference clause="must" ref="category"/>
                <queryReference clause="must" ref="price"/>
                <queryReference clause="must" ref="visibility"/>
            </query>
            <query xsi:type="matchQuery" value="$search_term$" name="search">
                <match field="*"/>
            </query>
            <query xsi:type="matchQuery" value="$search_term$" name="partial_search">
                <match field="*"/>
                <match field="name" matchCondition="match_phrase_prefix"/>
                <match field="sku" matchCondition="match_phrase_prefix"/>
            </query>
            <query xsi:type="filteredQuery" name="category">
                <filterReference clause="must" ref="category_filter"/>
            </query>
            <query xsi:type="filteredQuery" name="price">
                <filterReference clause="must" ref="price_filter"/>
            </query>
            <query xsi:type="filteredQuery" name="visibility">
                <filterReference clause="must" ref="visibility_filter"/>
            </query>
        </queries>
        <filters>
            <filter xsi:type="termFilter" name="category_filter" field="category_ids" value="$category_ids$"/>
            <filter xsi:type="rangeFilter" name="price_filter" field="price" from="$price.from$" to="$price.to$"/>
            <filter xsi:type="termFilter" name="visibility_filter" field="visibility" value="$visibility$"/>
        </filters>
        <aggregations>
            <bucket name="price_bucket" field="price" xsi:type="dynamicBucket" method="$price_dynamic_algorithm$">
                <metrics>
                    <metric type="count"/>
                </metrics>
            </bucket>
            <bucket name="category_bucket" field="category_ids" xsi:type="termBucket">
                <metrics>
                    <metric type="count"/>
                </metrics>
            </bucket>
        </aggregations>
        <from>0</from>
        <size>10000</size>
    </request>
    <request query="advanced_search_container" index="catalogsearch_fulltext">
        <dimensions>
            <dimension name="scope" value="default"/>
        </dimensions>
        <queries>
            <query xsi:type="boolQuery" name="advanced_search_container" boost="1">
                <queryReference clause="should" ref="sku_query"/>
                <queryReference clause="should" ref="price_query"/>
                <queryReference clause="should" ref="category_query"/>
                <queryReference clause="must" ref="visibility_query"/>
            </query>
            <query name="sku_query" xsi:type="filteredQuery">
                <filterReference clause="must" ref="sku_query_filter"/>
            </query>
            <query name="price_query" xsi:type="filteredQuery">
                <filterReference clause="must" ref="price_query_filter"/>
            </query>
            <query name="category_query" xsi:type="filteredQuery">
                <filterReference clause="must" ref="category_filter"/>
            </query>
            <query name="visibility_query" xsi:type="filteredQuery">
                <filterReference clause="must" ref="visibility_filter"/>
            </query>
        </queries>
        <filters>
            <filter xsi:type="wildcardFilter" name="sku_query_filter" field="sku" value="$sku$"/>
            <filter xsi:type="rangeFilter" name="price_query_filter" field="price" from="$price.from$" to="$price.to$"/>
            <filter xsi:type="termFilter" name="category_filter" field="category_ids" value="$category_ids$"/>
            <filter xsi:type="termFilter" name="visibility_filter" field="visibility" value="$visibility$"/>
        </filters>
        <from>0</from>
        <size>10000</size>
    </request>
    <request query="catalog_view_container" index="catalogsearch_fulltext">
        <dimensions>
            <dimension name="scope" value="default"/>
        </dimensions>
        <queries>
            <query xsi:type="boolQuery" name="catalog_view_container" boost="1">
                <queryReference clause="must" ref="category"/>
                <queryReference clause="must" ref="price"/>
                <queryReference clause="must" ref="visibility"/>
            </query>
            <query xsi:type="filteredQuery" name="category">
                <filterReference clause="must" ref="category_filter"/>
            </query>
            <query xsi:type="filteredQuery" name="price">
                <filterReference clause="must" ref="price_filter"/>
            </query>
            <query xsi:type="filteredQuery" name="visibility">
                <filterReference clause="must" ref="visibility_filter"/>
            </query>
        </queries>
        <filters>
            <filter xsi:type="termFilter" name="category_filter" field="category_ids" value="$category_ids$"/>
            <filter xsi:type="rangeFilter" name="price_filter" field="price" from="$price.from$" to="$price.to$"/>
            <filter xsi:type="termFilter" name="visibility_filter" field="visibility" value="$visibility$"/>
        </filters>
        <aggregations>
            <bucket name="price_bucket" field="price" xsi:type="dynamicBucket" method="$price_dynamic_algorithm$">
                <metrics>
                    <metric type="count"/>
                </metrics>
            </bucket>
            <bucket name="category_bucket" field="category_ids" xsi:type="termBucket">
                <metrics>
                    <metric type="count"/>
                </metrics>
            </bucket>
        </aggregations>
        <from>0</from>
        <size>10000</size>
    </request>
</requests>

The xml mentions some product fields like visibility. However, since Magento allows creating custom product attributes, even in the admin panel, query generated by this xml is further modified to include all searchable product attributes.

This is done by a plugin to xml reader:

Magento\CatalogSearch\Model\Search\ReaderPlugin::afterRead()
$result = array_merge_recursive(
  $xmlData,
  $this->requestGenerator->generate()
);

In RequestGenerator::generate(), Magento adds some dynamic changes to the search request, including clauses related to product attributes. It is possible to add additional changes to the request using a similar mechanism.

This plugin is executed once and cached. To see changes implemented in search_request.xml or added by plugins, it is necessary to clean cache (so this way, it is not possible to use different requests depending on customer, current date etc., although there may be other ways of implementing this).

Based on the xml and a list of searchable attributes, Magento sends a request to Elasticsearch, which may look as follows:

{
   "from":0,
   "size":12,
   "query":{
      "bool":{
         "must":[
            {
               "terms":{
                  "visibility":[
                     "3",
                     "4"
                  ],
                  "boost":1.0
               }
            }
         ],
         "should":[
            {
               "match":{
                  "_search":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "name":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":6.0
                  }
               }
            },
            {
               "match":{
                  "sku":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":7.0
                  }
               }
            },
            {
               "match":{
                  "description":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "short_description":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "manufacturer_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "status_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "url_key":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "tax_class_id_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "_search":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match_phrase_prefix":{
                  "name":{
                     "query":"my_search_term",
                     "slop":0,
                     "max_expansions":50,
                     "boost":2.0
                  }
               }
            },
            {
               "match_phrase_prefix":{
                  "sku":{
                     "query":"my_search_term",
                     "slop":0,
                     "max_expansions":50,
                     "boost":2.0
                  }
               }
            }
         ],
         "adjust_pure_negative":true,
         "minimum_should_match":"1",
         "boost":1.0
      }
   },
   "stored_fields":[
      "_id",
      "_score"
   ],
   "sort":[
      {
         "_score":{
            "order":"desc"
         }
      }
   ],
   "track_total_hits":2147483647,
   "aggregations":{
      "price_bucket":{
         "extended_stats":{
            "field":"price_0_1",
            "sigma":2.0
         }
      },
      "category_bucket":{
         "terms":{
            "field":"category_ids",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      }
   }
}

The format of search_request.xml allows the use of the following Elasticsearch queries:

The number of search results is configured in search_request.xml, e.g. <size>10</size>. Default: 10 000. 10 000 is also a default limit in Elasticsearch (index.max_result_window). If it is necessary to return more than 10 000 results, changes in code and Elasticsearch configuration may be needed.

4. Category view page

Viewing the category page is basically a kind of search and the logic is very similar to the logic of quick search.

The basic mechanism is as follows:

Additionally, Magento uses Elasticsearch to get information about the number of matching products next to each option in layered navigation.

Example: customer enters category page Bags and selects some filters in layered navigation, e.g. Price $40.00-49.99

Category and filters are added to request url, e.g. http://mystore.pl/gear/bags.html?price=40-50

Magento parses the url parameters and makes request to Elasticsearch to get 2 pieces of information:

The request may look like that:

{
   "from":0,
   "size":12,
   "query":{
      "bool":{
         "must":[
            {
               "term":{
                  "category_ids":{
                     "value":"4",
                     "boost":1.0
                  }
               }
            },
            {
               "range":{
                  "price_0_1":{
                     "from":"40",
                     "to":"49.999",
                     "include_lower":true,
                     "include_upper":true,
                     "boost":1.0
                  }
               }
            },
            {
               "terms":{
                  "visibility":[
                     "2",
                     "4"
                  ],
                  "boost":1.0
               }
            }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   },
   "stored_fields":[
      "_id",
      "_score"
   ],
   "sort":[
      {
         "position_category_4":{
            "order":"asc"
         }
      }
   ],
   "track_total_hits":2147483647,
   "aggregations":{
      "price_bucket":{
         "extended_stats":{
            "field":"price_0_1",
            "sigma":2.0
         }
      },
      "category_bucket":{
         "terms":{
            "field":"category_ids",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "manufacturer_bucket":{
         "terms":{
            "field":"manufacturer",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "color_bucket":{
         "terms":{
            "field":"color",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "activity_bucket":{
         "terms":{
            "field":"activity",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "style_bags_bucket":{
         "terms":{
            "field":"style_bags",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "material_bucket":{
         "terms":{
            "field":"material",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "strap_bags_bucket":{
         "terms":{
            "field":"strap_bags",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "features_bags_bucket":{
         "terms":{
            "field":"features_bags",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "gender_bucket":{
         "terms":{
            "field":"gender",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "category_gear_bucket":{
         "terms":{
            "field":"category_gear",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "size_bucket":{
         "terms":{
            "field":"size",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "eco_collection_bucket":{
         "terms":{
            "field":"eco_collection",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "performance_fabric_bucket":{
         "terms":{
            "field":"performance_fabric",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "erin_recommends_bucket":{
         "terms":{
            "field":"erin_recommends",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "new_bucket":{
         "terms":{
            "field":"new",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "sale_bucket":{
         "terms":{
            "field":"sale",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "format_bucket":{
         "terms":{
            "field":"format",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "purpose_bucket":{
         "terms":{
            "field":"purpose",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "style_bottom_bucket":{
         "terms":{
            "field":"style_bottom",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "style_general_bucket":{
         "terms":{
            "field":"style_general",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "sleeve_bucket":{
         "terms":{
            "field":"sleeve",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "collar_bucket":{
         "terms":{
            "field":"collar",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "pattern_bucket":{
         "terms":{
            "field":"pattern",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      },
      "climate_bucket":{
         "terms":{
            "field":"climate",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      }
   }
}

After receiving a list of products from Elasticsearch, Magento fetches the products from MySQL database. The SQL includes filter by ids from Elasticsearch + some additional filters. It may look like that:

SELECT `e`.*, 
       `price_index`.`price`, 
       `price_index`.`tax_class_id`, 
       `price_index`.`final_price`, 
       IF(price_index.tier_price IS NOT NULL, Least(price_index.min_price, 
                                              price_index.tier_price), 
       price_index.min_price)                   AS `minimal_price`, 
       `price_index`.`min_price`, 
       `price_index`.`max_price`, 
       `price_index`.`tier_price`, 
       Ifnull(review_summary.reviews_count, 0)  AS `reviews_count`, 
       Ifnull(review_summary.rating_summary, 0) AS `rating_summary`, 
       `stock_status_index`.`stock_status`      AS `is_salable` 
FROM   `catalog_product_entity` AS `e` 
       INNER JOIN `catalog_product_index_price` AS `price_index` 
               ON price_index.entity_id = e.entity_id 
                  AND price_index.customer_group_id = 0 
                  AND price_index.website_id = '1' 
       LEFT JOIN `review_entity_summary` AS `review_summary` 
              ON e.entity_id = review_summary.entity_pk_value 
                 AND review_summary.store_id = 1 
                 AND review_summary.entity_type = (SELECT 
                     `review_entity`.`entity_id` 
                                                   FROM   `review_entity` 
                                                   WHERE  ( entity_code = 
                                                            'product' )) 
       INNER JOIN `cataloginventory_stock_status` AS `stock_status_index` 
               ON e.entity_id = stock_status_index.product_id 
WHERE  ( ( stock_status_index.stock_status = 1 ) 
         AND ( e.entity_id IN ( 4, 5, 13, 14 ) ) ) 
       AND ( e.created_in <= 1 ) 
       AND ( e.updated_in > 1 ) 
ORDER  BY Field(e.entity_id, 4, 5, 13, 14);

In this SQL, the following part is based on the results from Elasticsearch:

e.entity_id IN ( 4, 5, 13, 14 ).

This is actually filter by category and price.

The logic of filtering based on choices in layered navigation is applied to Elasticsearch request only. The logic of filtering based on visibility (product visibility, category permissions etc.) is applied twice: first as part of Elasticsearch request, then again as part of the SQL. Therefore, it might happen that product that should be visible is not visible due to invalid data in Elasticsearch, but it should not happen that product that should be invisible is visible due to invalid data in Elasticsearch.

Custom code that applies additional visibility filters should also apply the filters twice. If the filter is applied to MySQL only, it is possible that the displayed number of products found will be higher than the actual number of products on the page.

After loading products, Magento builds the view of layered navigation. Each filter is a select with options. For each option, Magento presents the number of matching products. This number comes from Elasticsearch (aggregations).

In previous versions of Magento, there was a choice to use MySQL instead of Elasticsearch for fulltext search. At that time, MySQL EAV indexer was used to support layered navigation. According to Magento documentation, if the merchant uses Elasticsearch for fulltext search and there is no custom extension depending on EAV indexer, EAV indexer is not needed and can be disabled in the configuration:  Stores > Settings > Configuration > Catalog > Catalog > Catalog Search > Enable EAV Indexer.

Layered navigation can be hidden by a change in the layout XML file. However, the underlying logic of layered navigation cannot be disabled without considerable effort.

Product attributes are available in layered navigation based on their parameters

Only some data types and input types can be used in layered navigation. E.g. text attributes cannot be used in layered navigation.

If there is some mismatch between Elasticsearch and MySQL, the common indicators are:

Category page is cached by full page cache, so the search actually takes place only once, the first time any customer enters the page. Subsequent customers from the same group receive page from cache, so no request to Elasticsearch or MySQL is made. Flushing full page cache is necessary to refresh search results.

Each category has a parameter “Is Anchor”: Yes or No.

If there is a category structure like that:

Juices

  Orange juices

If Juices has the parameter “Is Anchor” = Yes, Juices will also show Orange Juices. If Juices has the parameter “Is Anchor” = No, Juices will only display products directly assigned to category Juices.

5. Quick Search

The basic mechanism is as follows:

Data kept in Elasticsearch is never really displayed on the frontend. It is only used for searching, but once the product is found, it is loaded from the MySQL database and all data comes from MySQL.

Example: if product name is Cat in MySQL and Dog in Elasticsearch:

If product is not indexed in Elasticsearch, it cannot be found.

Attributes used for search include some basic attributes + EAV attributes with proper properties, e.g. Use in Search – Yes

Request to Elasticsearch may look like that:

{
   "from":0,
   "size":12,
   "query":{
      "bool":{
         "must":[
            {
               "terms":{
                  "visibility":[
                     "3",
                     "4"
                  ],
                  "boost":1.0
               }
            }
         ],
         "should":[
            {
               "match":{
                  "_search":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "name":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":6.0
                  }
               }
            },
            {
               "match":{
                  "sku":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":7.0
                  }
               }
            },
            {
               "match":{
                  "description":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "short_description":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "manufacturer_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "status_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "url_key":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "tax_class_id_value":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match":{
                  "_search":{
                     "query":"my_search_term",
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":2.0
                  }
               }
            },
            {
               "match_phrase_prefix":{
                  "name":{
                     "query":"my_search_term",
                     "slop":0,
                     "max_expansions":50,
                     "boost":2.0
                  }
               }
            },
            {
               "match_phrase_prefix":{
                  "sku":{
                     "query":"my_search_term",
                     "slop":0,
                     "max_expansions":50,
                     "boost":2.0
                  }
               }
            }
         ],
         "adjust_pure_negative":true,
         "minimum_should_match":"1",
         "boost":1.0
      }
   },
   "stored_fields":[
      "_id",
      "_score"
   ],
   "sort":[
      {
         "_score":{
            "order":"desc"
         }
      }
   ],
   "track_total_hits":2147483647,
   "aggregations":{
      "price_bucket":{
         "extended_stats":{
            "field":"price_0_1",
            "sigma":2.0
         }
      },
      "category_bucket":{
         "terms":{
            "field":"category_ids",
            "size":500,
            "min_doc_count":1,
            "shard_min_doc_count":0,
            "show_term_doc_count_error":false,
            "order":[
               {
                  "_count":"desc"
               },
               {
                  "_key":"asc"
               }
            ]
         }
      }
   }
}

By default, Magento uses OR condition, so if you type “sku1 sku2”, you may find two products. If you type “orange juice”, you may find orange t-shirt and raspberry juice.

A search request sent to Elasticsearch includes many clauses, e.g. the name should be “Cat”, the description should be “Cat”, a short description should be “Cat”. It is enough for one clause to be true to find a  product. This depends on Elasticsearch parameter  minimum_should_match, which has a value of 1 hard-coded in Magento.

If you make a typo in a search term, Magento does not show the product in search results, but there may be a search suggestion (“Did you mean …?”) with a given product. If you type just the middle part of a word – the same effect as for typos. Search suggestions are a separate feature of Magento and they are provided by a separate request to Elasticsearch.

In Magento Commerce, there is a configuration for which customer groups can use search bar (Category Permissions > Disallow Catalog Search By).

The search results page has layered navigation that allows to further filter the results. There is a separate list of attributes that can be used in layered navigation in the category page vs. search result page.

6. Advanced Search

Advanced search is similar to quick search, but the customer can configure search details.

Attributes are displayed in advanced search form based on parameter: Visible in Advanced Search.

7. GraphQL

GraphQL is one of Magento APIs. It allows external systems to fetch data from Magento. GraphQL allows to get a list of products. There is an endpoint that allows to get a list of products based on fulltext search, which uses pretty much the same logic as search on storefront.

8. Search suggestions

Search Suggestions is an additional feature of Magento Commerce, it displays a block “Did you mean?” on the search results page.

Suggestions are loaded from Elasticsearch by a separate query that may look as follows:

{
   "suggest":{
      "text":"my_search_term",
      "phrase_style_general_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"style_general_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"style_general_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_style_bags_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"style_bags_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"style_bags_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_strap_bags_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"strap_bags_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"strap_bags_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_eco_collection_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"eco_collection_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"eco_collection_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_color_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"color_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"color_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_features_bags_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"features_bags_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"features_bags_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_allow_open_amount_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"allow_open_amount_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"allow_open_amount_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_country_of_manufacture_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"country_of_manufacture_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"country_of_manufacture_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_manufacturer_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"manufacturer_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"manufacturer_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_format_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"format_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"format_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_giftcard_type_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"giftcard_type_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"giftcard_type_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_climate_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"climate_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"climate_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_collar_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"collar_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"collar_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_description":{
         "phrase":{
            "analyzer":"standard",
            "field":"description",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"description",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_sale_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"sale_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"sale_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_price_view_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"price_view_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"price_view_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_custom_layout_update_file_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"custom_layout_update_file_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"custom_layout_update_file_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_is_returnable_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"is_returnable_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"is_returnable_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_page_layout_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"page_layout_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"page_layout_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_gift_wrapping_available_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"gift_wrapping_available_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"gift_wrapping_available_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_shipment_type_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"shipment_type_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"shipment_type_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_msrp_display_actual_price_type_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"msrp_display_actual_price_type_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"msrp_display_actual_price_type_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_purpose_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"purpose_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"purpose_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_size_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"size_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"size_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_status_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"status_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"status_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_custom_design_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"custom_design_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"custom_design_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_options_container_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"options_container_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"options_container_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_style_bottom_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"style_bottom_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"style_bottom_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_tax_class_id_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"tax_class_id_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"tax_class_id_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_short_description":{
         "phrase":{
            "analyzer":"standard",
            "field":"short_description",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"short_description",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_activity_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"activity_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"activity_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_custom_layout_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"custom_layout_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"custom_layout_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_quantity_and_stock_status_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"quantity_and_stock_status_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"quantity_and_stock_status_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_name":{
         "phrase":{
            "analyzer":"standard",
            "field":"name",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"name",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_category_gear_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"category_gear_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"category_gear_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_gender_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"gender_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"gender_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_sleeve_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"sleeve_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"sleeve_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_performance_fabric_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"performance_fabric_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"performance_fabric_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_material_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"material_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"material_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_pattern_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"pattern_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"pattern_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_erin_recommends_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"erin_recommends_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"erin_recommends_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_url_key":{
         "phrase":{
            "analyzer":"standard",
            "field":"url_key",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"url_key",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_visibility_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"visibility_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"visibility_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_sku":{
         "phrase":{
            "analyzer":"standard",
            "field":"sku",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"sku",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_gift_message_available_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"gift_message_available_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"gift_message_available_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      },
      "phrase_new_value":{
         "phrase":{
            "analyzer":"standard",
            "field":"new_value",
            "size":2,
            "real_word_error_likelihood":0.95,
            "confidence":1.0,
            "separator":" ",
            "max_errors":1.0,
            "force_unigrams":true,
            "token_limit":10,
            "direct_generator":[
               {
                  "field":"new_value",
                  "min_word_length":3,
                  "min_doc_freq":1.0
               }
            ]
         }
      }
   }
}

There is a hardcoded limit of max_errors = 1, so the feature will not provide relevant results when customer makes more than one typo.

Elasticsearch returns a list of suggestions with a score for each attribute separately (sku, name, description, …).

Suggestions are displayed even if there are correct results.

9. Additional search features

It is possible to see popular search terms in admin panel: Marketing > SEO & Search > Search Terms

This feature uses MySQL database only.

It is also possible to define a redirect for a search term, e.g. when a customer types “Juices”, he/she may be redirected to the category page of Juices (or any other page). However, there needs to be an exact match. This feature does not use Elasticsearch.

It is also possible to specify synonyms for search:

There is a feature of Search Recommendations (“Related search terms”), which is similar but different from search suggestions.

10. Vue Storefront

Vue Storefront is a frontend PWA application which can be connected to Magento. Vue Storefront uses Elasticsearch as NoSQL database. Entities from Magento are indexed in Elasticsearch, so that Vue Storefront can access them directly without requests to Magento.

Indexing of data from Magento is done by custom application mage2vuestorefront (https://github.com/vuestorefront/mage2vuestorefront) written in Javascript that fetches data from Magento using Magento Rest API. It supports many entities such as categories, product reviews, CMS pages.


Elasticsearch has a lot of strengths and is the most powerful search engine, available for free. It analyzes a high volume of data in almost real-time, providing users with needed results immediately. It provides a lot of features that are worth to be discovered and applied to your eCommerce store.
If you need any help with your store and would like to discuss how Elasticsearch can be used in your business, contact us and we will be pleased to help you.

B2B E-commerce is much more than order acquisition.

They provide self-service capabilities for customers, allow merchants to execute sales strategy and provide data to understand market needs.

B2B platform self-service modules

Self-service capabilities result in less time used on addressing repetitive requests for information such as: “What is my credit limit?” or “What is the expected delivery time for my last order?”

Limiting these types of interactions generates time savings which can be instead used to run activities related to relationship building and direct sales.

Self-service modules examples:

In most of our implementations, the B2B platform is also used by Sales Representatives to act on behalf of their customers. The limitation of a number of tools boosts efficiency and allows for a closer interaction with a customer.

B2B e-commerce driving sales

A proper B2B platform can as boost sales thanks to mechanisms like:

B2B e-commerce as a data-gathering tool

Not to be under-estimated B2B platform is also a great source of data on customer behavior and needs (for example analysis of search queries can reveal gaps in the offering).  

Summary

A proper B2B platform is much more than an order acquisition tool.  It allows any business to acquire and grow customers from the areas that are not served by any on-ground salesperson.

Place a bet and toss a coin in the air!

E-commerce and surroundings – brief glimpse into trends for 2020.

A new year always brings new opportunities – while we cannot predict the future, we for sure must look at trends and make assumptions consider them for predictions around relevant topics in today’s business world.

Earth First! Ecological awareness – dare to care.

Indifferent to your personal beliefs and thoughts around climate change, we cannot deny that in today’s world this is an important topic which will be screamed out loud in 2020 and beyond: we are seeing and living through a shift towards greener living, companies and people alike are attempting to reduce their carbon footprint, new environmental laws are being introduced worldwide and the younger generations are now considering “how green a company is” when calibrating a product’s quality.

 

But what does this have to do with e-commerce, which is not involved directly in selling eco-commodities? Everything.

Below you will find 5 simple ways to make your e-commerce eco-friendly (and more attractive to likely buyers who will judge you on your impact to our planet!):

Toss a coin to your audience and make them fans

Cashing in on pop culture is not new. However, there are multiple new globally sweeping trends which everyone can use to engage their public, their customers or their peers even more. Today’s big topic may be The Witcher Netflix series – get our reference for the coin? Thought so! Now we have broken the ice and have a conversation starter. Don’t be afraid to cash in on today’s trending topic, icon, meme or challenge to increase brand awareness – and you can do all of it without needing deep pockets. In fact, you can spend next to nothing to achieve this. No license from the author, no sponsorship for tv series? Where is the catch?! No catch, just a different scale and approach – buy some paper books and make them a prize in your survey / quiz / contest, then post it on your social media account and count your shares and likes!

 

If books are better for dust and not for you, you can always summon your followers or gain new ones by calling for action in real time. Enough with these empty phrases. Just announce a competition in which “best Witcher or Witcher’s inspired cosplay published with photo in this tread will have a chance to win…” Sit down and see the responses. Trend it on social media for a small cost and you are doubly winning.

 

Almost every kind of online shop can adopt these tactics – thanks to “halo effect” you will be part of the buzz around The Witcher’s fandom. Let someone else make the marketing campaigns (and spend a ton of money in the process) to promote it, you just use name of the bestselling book series to attract and engage your target group and a lot of potential fans, completely unrelated to your business but eager to get the prize.

 

If you can’t predict trends, make them! Do you have interesting ideas and recognitions as well? Share them with us in the comments, like original post and follow us on LinkedIn or Facebook to win a complete set of books (you can chose the language!), I bet you will not guess which ones… ?


[x]

This page uses cookies

I consent to the processing of my personal data contained in cookies (both session and permanent) by ORBA co. based in Warsaw, in order to adapt the content of the website to my preferences, optimize the use of websites, create anonymous statistics that allow monitoring of how the website is being used.

Accept