# Introduction
Source: https://doc.lucidworks.com/docs/lw-platform/index
Discover how to deploy, customize, and scale Lucidworks products for AI-powered search and insights across B2B, B2C, knowledge management, customer support, and more.
> **[Contact Lucidworks](https://lucidworks.com/demo/?utm_source=docs\&utm_medium=referral\&utm_campaign=docs_cta)**
>
> Reach out with your current search challenges and what you hope to achieve with a search and discovery solution.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Discover
Get started quickly with product-specific guides and tools for building intelligent search, analytics, and AI applications.
> **[Lucidworks AI](/docs/lw-platform/lw-ai/overview)**
>
> Advanced AI-powered data discovery and search
> **[Neural Hybrid Search](/docs/lw-platform/lw-ai/quickstart-lucidworks-ai-nhs-rag)**
>
> Combine lexical precision with semantic understanding for more relevant results
> **[Core Settings](/docs/lw-platform/lw-core/overview)**
>
> Build fast, intuitive, and configurable search experiences
> **[Agent Studio](/docs/lw-platform/lw-agent-studio/overview)**
>
> Prototype and deploy enterprise-grade AI agents
> **[Commerce Studio](/docs/lw-platform/lw-cs/overview)**
>
> Optimize search results and improve product discovery
> **[Analytics Studio](/docs/lw-platform/lw-analytics/overview)**
>
> Transform data into actionable intelligence
> **[Signals Beacon](/docs/lw-platform/lw-analytics/signals/overview)**
>
> Low-code signal capture for advanced analytics
# Latest changes
Source: https://doc.lucidworks.com/docs/lw-platform/latest-changes
Lucidworks products are constantly evolving to deliver new features, improvements, and fixes. This page highlights the latest changes to help you stay current with product updates and enhancements.
[localhost link]: http://localhost:3000/docs/lw-platform/latest-changes
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/latest-changes
**2026-08-28**
# Search Results Layout Settings
The Commerce Studio Settings feature now provides the option to display search results in a list, or in the current default grid pattern.
The **Layout** section lets you select to display search results in a vertical list or a grid pattern.

For example, if you select the **List** option, the search results display in a vertical list on the Editor screen.

For more information, see [Commerce Studio Settings Layout](/docs/lw-platform/lw-cs/cstudio-settings#layout).
**2026-07-31**
# Configure the Vector Similarity Threshold and Vector Result Count of Neural Hybrid Search
The Lucidworks Platform Core Settings Relevance option has been enhanced with two new fields:
* **Vector Similarity Threshold** lets you set the minimum of how closely a document must match your query's meaning to be included in results. Enter a decimal value between `0` and `1`. A higher minimum value returns only results that strongly match the query's meaning. A lower minimum value returns more results because results do not have to match the query's meaning as closely.
* **Vector Result Count** specifies how many candidate results the vector (semantic) search retrieves before the results are merged and re-ranked with the lexical results. Enter an integer between `0` and `2000`. A higher value assesses more semantic candidate results, which improves relevant results. A lower value assesses fewer semantic candidate results, which may decrease relevant results.

For more information, see [Relevance](/docs/lw-platform/lw-core/sites-relevance) and [NHS Quickstart](/docs/lw-platform/lw-core/quickstart).
**2026-07-31**
# Exclude rules from Commerce Studio Editor results preview
The Execute section of the Commerce Studio Editor screen now gives you the option to include or exclude a rule from the query being previewed. This lets you test to see the search results if the rule is removed from a query without actually deleting the rule.

Click the **Preview** toggle `on` to execute that rule in the query, or click **Preview** `off` to exclude it from the query. The query results display based on the rules included in the query.
> [!NOTE]
>
> Your live site is *never* affected by setting the **Preview** toggle to `off`.
**2026-07-10**
# Customize the UI Studio composition canvas
The Customize Section option of UI Studio lets you set a background color and size for a composition that matches your organization's branding or for a specific search experience.
When you access UI Studio, click **Builder**, and select the composition to customize, the Composition Editor screen displays.

Composition Editor screen
Click the main canvas and then click the gear icon to open the **Customize Section** panel. Set a background color for the composition. You can also or adjust the section dimensions. These settings can be refined at any time.

Customize canvas properties
**2026-07-06**
# Add a UI Studio composition
The Create New UI feature of UI Studio lets you [add a new composition](/docs/lw-platform/lw-ui-studio/compositions#add-a-composition) to build a new search experience page for your users. This UI option is a user-friendly method to add a search page customized to your organization and doesn't require engineering resources.
When you access UI Studio and click **Builder**, the **Create New UI** option lets you name the new composition.

The Compositions screen, where you create, manage, and publish your UI Studio compositions.
Add the name and description and click **Create**.

Add a new composition.
The new composition is listed on the Compositions screen that lets you [add and customize components](/docs/lw-platform/lw-ui-studio/compositions#build-a-composition) such as a search bar, facets, and a results section.
**2026-06-30**
# Unified Platform Login
If you're using Lucidworks Search, you can now access Fusion instances and Grafana dashboards directly from Lucidworks Platform using single sign-on (SSO) authentication.
Unified Platform Login eliminates the need to log in separately to each system and provides a seamless, secure authentication experience powered by Okta.
When you click the **Managed** button from Lucidworks Platform's Indexes tab, you're authenticated automatically and redirected to your Fusion instance without entering additional credentials.
The same SSO experience extends to Grafana dashboards accessed with the **View Metrics** option.


All authentication infrastructure is managed by Lucidworks—no manual security realm, OIDC, or group mapping configuration required.
> [!NOTE]
>
> Unified Platform Login works with Lucidworks Search.
> It does not apply to self-hosted Fusion.
If you need elevated access to perform administrative tasks in an instance of Lucidworks Search, request role elevation from Lucidworks Support or your Customer Success Manager.
After the role is granted, log in again with Lucidworks Platform to activate your new permissions.
See [Fusion instances](/docs/lw-platform/lw-platform/indexes#fusion-instances) for complete details.
**2026-06-05**
# Draft edits for all rule types in Commerce Studio
Commerce Studio now supports draft edits for every rule type, so merchandisers can update a published rule without taking it offline. When you open a published rule for editing, the published version stays active on your site and your changes are captured as a draft. You can then **Publish** the changes immediately, **Save as Draft** to preview the impact in the Editor, or **Cancel** to discard the edits.

Draft edit for a pin rule in Commerce Studio Editor
The live rule keeps serving traffic while edits are staged, so you can refine merchandising logic before it reaches users.
On the Rules screen, a published rule with a draft appears as two rows so it is always clear which version is live and which has unpublished changes. Bulk actions, filters, and row-level actions all reflect draft state.

Draft edit for a pin rule in Commerce Studio Rules screen
For more information, see [Manage rules](/docs/lw-platform/lw-cs/cstudio-rules#manage-rules).
**2026-06-05**
# Part Number detection
The Part number detection feature is a specialized query processing feature that automatically detects part number patterns in search queries, and then optimizes search behavior to balance lexical precision with semantic understanding.
In part number searches, lexical matching is the more dominant function and highly accurate, lexically focused results are returned. Semantic matching is minimized for part number searches, but is not impacted for general queries.
Part number detection employs a Fusion LWAI Prediction stage you create. You must [configure the stage to use the Part Number Classification custom-trained model](/docs/lw-platform/lw-ai/lw-ai-custom-embedding-model-training/create-and-deploy-custom-models#create-a-new-model).
To further optimize part number searches, you can complete the following actions:
* Configure any other Fusion stage with conditional statements that return the boolean from part number detection (if applicable to your business).
* Tune the Neural Hybrid Query stage to give more weight to lexical search.
## Use cases
* Business-to-consumer organizations that offer products identified with model or part numbers can use part number detection to accurately return results to help users select the correct item, which increases customer satisfaction and reduces product returns.
* Business-to-business organizations that rely heavily on part numbers, SKUs, or product codes, use part number detection to identify the products they distribute. The correct selection of products is essential to their customers, and enable targeted purchases, encourage repeat orders, and build the long-term customer relationships that help B2B organizations thrive.
* Knowledge management searches use part number detection to return results from your company's knowledge bases, technical documents, inventory catalogs, and other documents. Easy and fast access to this information increases productivity and access to accurate, up-to-date information.
## Examples
When the stages are configured, the part number detection feature can be used in Fusion or in Lucidworks AI.
The following example reflects when a part number is detected (`true`):

Part number detected
The following example reflects when a part number is not detected (`false`):

Part number not detected
For more information, see the following topics:
* [Fusion Part Number Detection in Neural Hybrid Search](/docs/5/fusion/hybrid-search/part-number-detection-in-nhs)
* [Lucidworks Search Part Number Detection in Neural Hybrid Search](/docs/lucidworks-search/11-vector-search/part-number-detection-in-nhs)
* [Lucidworks AI Prediction API Part Number Detection use case](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-prediction-api/part-number-detection-use-case)
* [Lucidworks AI Prediction API Part Number Detection API specification](/api-reference/get-predictions/part-number-detection-use-case)
**2026-06-03**
# Introducing UI Studio
Lucidworks UI Studio is a no-code visual experience builder for creating and launching enterprise-grade, AI-powered search applications on the Lucidworks Platform. Teams can design branded, multi-page search experiences using drag-and-drop components, live previews, and configurable search integrations without relying on engineering resources.

Build a search UI in minutes
Unlike traditional search UI frameworks and developer SDKs that require frontend development expertise, UI Studio empowers search administrators, digital teams, and business users to visually create and manage search experiences independently. Organizations can rapidly launch search interfaces that are accurate, scalable, branded, and production-ready.
> **[Search Bar](/docs/lw-platform/lw-ui-studio/components/search-bar)**
>
> Accept user queries and trigger search across your datastore.
> **[Results](/docs/lw-platform/lw-ui-studio/components/results)**
>
> Display search results in List, Grid, or Table views with sorting and pagination.
> **[Facets](/docs/lw-platform/lw-ui-studio/components/facets)**
>
> Let users narrow results by filtering on field values.
> **[Button](/docs/lw-platform/lw-ui-studio/components/button)**
>
> Add navigation, export, or action buttons to your pages.
> **[Image](/docs/lw-platform/lw-ui-studio/components/image)**
>
> Display images with optional links, borders, and fallback support.
> **[Text](/docs/lw-platform/lw-ui-studio/components/text)**
>
> Add static or dynamic text content with rich styling options.
UI Studio supports both SaaS and self-hosted Fusion deployments, and integrates natively with Lucidworks Search, AI-powered relevance, typeahead, version control, and secure publishing.
## Key capabilities
* Drag-and-drop creation of branded, multi-page search applications
* Built-in integration with Lucidworks Search, AI-powered relevance, and typeahead
* Live preview with real production data during configuration
* Visual theming and branding controls for consistent enterprise design
* Secure publishing to Lucidworks-managed hosting in minutes
* Version control and rollback for safe iteration
* Enterprise authentication support including SSO-secured experiences
## Use cases
> **B2B commerce**
>
> B2B buyers work with large, complex product catalogs and require precise access to technical specifications, parts, and contract terms. UI Studio enables B2B organizations to rapidly deploy branded search experiences without dedicating frontend engineering resources. Search administrators can configure facets, sorting, and relevance tuning to match complex procurement workflows and publish updates independently. This reduces implementation friction, shortens time-to-value, and allows engineering teams to focus on higher-priority initiatives.
> **B2C commerce**
>
> B2C customers expect fast, intuitive, and visually consistent search experiences. UI Studio allows ecommerce and digital teams to create branded product discovery experiences with configurable search bars, facets, typeahead, and results pages. Teams can preview changes against live data, iterate quickly without code, and publish confidently with built-in version control. This improves product findability, reduces cart abandonment, and accelerates time-to-launch for new storefronts and campaigns.
> **Knowledge management**
>
> Enterprise knowledge management programs often span multiple portals: employee search, technical documentation, supplier resources, and customer support. UI Studio enables organizations to launch and maintain each of these experiences independently, without parallel frontend development projects. Search administrators can manage layouts, components, and pages through a visual interface while automatically capturing behavioral signals to improve relevance over time.
## Dive in
> **[UI Studio](/docs/lw-platform/lw-ui-studio/overview)**
>
> Explore the UI Studio documentation to learn how to build, customize, and publish enterprise-grade search experiences without writing code.
> **[Request a UI Studio demo](https://lucidworks.com/demo/?utm_source=docs\&utm_medium=referral\&utm_campaign=docs_cta)**
>
> See UI Studio in action and learn how your team can launch enterprise search experiences faster without frontend development.
**2026-06-01**
# Bulk operations API for Commerce Studio
The Rules and Rewrites API for Commerce Studio now supports bulk operations, so you can publish, unpublish, edit, delete, or migrate multiple rules in a single request instead of calling the API once per rule.

Bulk operations run asynchronously.
You submit a request that targets rules by ID, external ID, or a filter, then poll the operation status until it completes.
These capabilities support enterprise use cases where per-rule API calls do not scale, such as:
* Publishing or unpublishing large sets of rules for a seasonal campaign
* Applying the same edit across every rule that shares a tag
* Deleting obsolete rules in a single batch
* Migrating a rule set to another Commerce Studio instance
Bulk operations require an authentication token with the `commercestudio.bulkoperations` scope.
See [Bulk operations](/docs/lw-platform/lw-cs/cs-rules-rewrites-api#bulk-operations) for usage instructions and example requests.
For complete endpoint specifications, see the [Bulk Operations API reference](/api-reference/bulk-operations/list-bulk-operations).
**2026-05-29**
# Product Impressions Metrics
Product impressions measure the number of times a product displays in search results in response to user queries. The product is counted each time it displays, even if users do not interact further with the product.
You can use impressions metrics to help your organization perform these important functions:
* Track impression changes after merchandising updates or catalog modifications to monitor trends over time
* Analyze impressions for different search categories or product types and segment by query type
* Identify high-impression products that may need pricing or promotion adjustments
* Include impression analysis in regular merchandising reviews to maintain optimal product exposure
You can configure impressions metrics in [Analytics Studio metrics](/docs/lw-platform/lw-analytics/analytics-screen#param-top-performing-products) for top performing products.

You can also configure [Commerce Studio inline analytics](/docs/lw-platform/lw-cs/cstudio-settings#inline-analytics) to display impressions on product cards.

For more information about how to use impressions metrics to optimize search experiences and product visibility, see [Impressions metrics](/docs/lw-platform/lw-cs/cstudio-editor#impressions-metrics).
**2026-05-29**
# AND logic for attribute rules in Commerce Studio
Commerce Studio now supports **AND logic** across attribute field value conditions in [Boost by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#boost), [Bury by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#bury), and [Block by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#block) rules, enabling precise targeting of specific product combinations.
Previously, attribute rules could only use OR logic between different attributes. For example, `Color = Black OR Type = Pants` would affect all black items and all pants, even if the items didn't meet both conditions.
Now you can create rules that require multiple attributes to match simultaneously in one rule:
* `(Color: Black, Red) AND (Type: Shirt)` — Boost only shirts that are black or red
* `(Brand: Nike) AND (Gender: Women) AND (Category: Running)` — Boost women's Nike running shoes
* `(Clearance: True) AND (Available: 0)` — Bury out-of-stock clearance items
This enhancement enables merchandising scenarios such as:
* Boosting seasonal product combinations like winter coats or summer dresses across multiple brands or colors
* Burying clearance items that are out of stock to reduce customer frustration
* Promoting new arrivals within specific high-margin categories
* Burying products that do not meet a product speficiation in the query
Existing attribute rules continue to use OR logic between attributes, ensuring backward compatibility for older rules.
For more information, see [Commerce Studio Rules](/docs/lw-platform/lw-cs/cstudio-rules).
> [!NOTE]
>
> This feature requires Fusion or Lucidworks Search 5.17.1 or later.
**2026-05-29**
# Numeric field operators for Commerce Studio rules
Commerce Studio now supports numeric comparison operators for field value conditions in [Boost by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#boost), [Bury by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#bury), and [Block by Attribute](/docs/lw-platform/lw-cs/cstudio-rules#block) rules.
The Commerce Studio UI now provides operators for creating attribute-based rules with numerical field comparisons.
Previously, configuring numeric conditions required writing Solr queries directly.
This enhancement enables merchandising scenarios such as:
* Boosting products with inventory levels that exceed a threshold
* Burying items with low customer ratings
* Blocking products priced outside acceptable ranges
* Promoting items within specific price brackets during sales
See [Field value operators](/docs/lw-platform/lw-cs/cstudio-rules#field-value-operators) for complete details about configuring numeric comparison conditions.
> [!NOTE]
>
> This feature requires Fusion or Lucidworks Search 5.17.1 or later.
**2026-05-22**
# Platform Signals integration
The Boost with Signals query pipeline stage in Fusion and Lucidworks Search now supports Platform Signals as a data source, enabling you to use the Signals Beacon or Platform Signals API to feed behavioral data directly into search relevance boosting.
Previously, only native signals were supported, requiring more cumbersome parallel signal infrastructure to influence search ranking.

This integration eliminates that duplication.
Customers already capturing user behavior through Platform Signals can now use that same data to drive query boosting, turning behavioral analytics into active search optimization without additional infrastructure.
**Fusion**: See [Platform Signals](/docs/5/fusion/getting-data-in/platform-signals/overview) for configuration details.
**Lucidworks Search**: See [Platform Signals](/docs/lucidworks-search/04-move-data-in/platform-signals/overview).
**2026-05-20**
# Form Builder for rules
Commerce Studio now includes a Form Builder for creating rules directly on the Rules screen, without opening the Editor. When you know exactly what rule you want to create and do not need to see search results in context, the Form Builder is faster than the Visual Builder workflow.

Form Builder in Commerce Studio
Use the Form Builder when you want to define conditions and actions without a live preview.
See [Form Builder](/docs/lw-platform/lw-cs/cstudio-rules#manual-builder) in the Rules documentation for configuration details.
**2026-05-06**
# Conversational Q\&A and FAQ agents
Two new Agent Studio agents are now available. Both the Conversational Q\&A agent and the Conversational Q\&A FAQ agent are AI-powered and live on your organization's product detail pages. Customers can ask natural-language questions about a product, and the agent responds with accurate, real-time answers grounded in that product's own documentation, such as datasheets, manuals, specifications, and other supporting PDF technical content.

These agents save your customers time-consuming and difficult research to obtain the information they need to help make a purchasing decision. They also enhance customer satisfaction, increase the potential for conversions, and improve the relationship between your customers and your organization.
In addition, the Conversational Q\&A FAQ agent provides frequently asked questions based on questions users may ask about the product or information. This gives the user more information about their query, which helps minimize customer support calls and product returns.
[Conversational Q\&A FAQ agent example](https://app.supademo.com/embed/cmords7yg44fdw9dophsneqci?embed_v=2\&utm_source=embed)
You can quickly and easily create multiple agents that enhance your ability to provide information 24/7 to customers and internal purposes. For example, you may have one agent for customers about product information, and another for employees to get information about organization policies.
**2026-04-30**
# Core Settings for multiple query profiles
[Core Settings](/docs/lw-platform/lw-core/overview) now supports managing multiple query profiles within a single site, enabling you to configure and maintain distinct search experiences for different use cases.
When your site has multiple query profiles, a query profile selector appears at the top of the Core Settings interface.
You can switch between profiles to configure each search experience independently without affecting other profiles.

This capability supports enterprise deployments that require any of the following:
* Separate search configurations for different websites or applications
* Different ranking strategies for various content types
* Dedicated search behaviors for internal versus public users
* Distinct search experiences for multiple audiences or regions
> [!NOTE]
>
> The query profile selector only appears when your site has multiple query profiles configured.
> Sites with a single query profile continue to work exactly as before with no interface changes.
See [Query profiles](/docs/lw-platform/lw-core/overview#query-profiles) for complete details about managing multiple search configurations.
**2026-04-30**
# Rules and Rewrites API
Commerce Studio now provides a public-facing Rules and Rewrites API that enables programmatic management of merchandising rules and query rewrites.
This API supports enterprise automation workflows, enabling you to create, update, and synchronize rules across multiple environments through CI/CD pipelines, internal tools, and custom integrations.

The API introduces external ID support, allowing you to assign your own identifiers to rules and rewrites for consistent cross-environment synchronization.
For example, you can create a rule with an external ID like `summer-promo-2026` in development, then deploy the same rule to QA and production using that identifier to ensure changes propagate correctly across all environments.
These capabilities address enterprise use cases where manual UI-based rule management does not scale:
* **Automated deployments**: Integrate rule management into CI/CD workflows for consistent, repeatable deployments.
* **Cross-environment synchronization**: Maintain identical rule sets across development, QA, and production.
* **Internal system integration**: Connect Commerce Studio to merchandising platforms, promotion systems, or custom tooling.
* **Large-scale rule management**: Efficiently manage rule sets that are impractical to maintain manually.
Rate limiting protects platform stability, and the API follows RESTful conventions with support for create, read, update, and delete operations.
See [Rules and Rewrites API](/docs/lw-platform/lw-cs/cs-rules-rewrites-api) for authentication details, key concepts, and usage instructions.
For complete endpoint specifications, see the [Rules and Rewrites API reference](/api-reference/rule-management/list-rules).
**2026-04-30**
# Average Click Position
Commerce Studio and Analytics Studio now display the average ranking position of products in the search results when the customer clicks those products.
A lower average click position is better, because that means customers are finding the product near the top of the results, which provides the following benefits:
* Increased customer satisfaction with the search experience
* Enhanced conversion rates
* Minimized cart abandonment and loss of sales to competitors
If the product position needs to display higher, your ecommerce team can modify or create rules to increase that product's visibility.
This metric helps ecommerce teams validate merchandising rules, optimize product visibility, and measure the impact of search configuration changes on customer engagement and conversion rates.
## Average click position graph in Commerce Studio
The Ranking Insights panel in Commerce Studio displays average click position of the query specified in the Conditions Manager section of the Editor screen.
The metric is calculated by dividing the sum of all clicked positions by the total number of clicks for the current query and time period selected in the Editor screen.

## Average click position graph in Analytics Studio
The Analytics Studio Signals Analytics screen displays an average click position graph that measures the average ranking position for all products for the designated time period.
The metric is calculated by dividing the sum of all clicked positions by the total number of clicks for the time period displayed.

See [Types of metrics](/docs/lw-platform/lw-analytics/analytics-screen#types-of-metrics) for more information.
**2026-04-15**
# Starts With and Ends With query matching
Commerce Studio now supports **Starts With** and **Ends With** query matching methods, giving you more precise control over when rules trigger.
These new matching options complement the existing **Is**, **Contains**, and **Contains Phrase** methods by enabling prefix- and suffix-based targeting strategies.
These enhancements enable the following capabilities:
* Target branded searches when queries begin with specific brand names.
* Apply location-specific logic when queries end with "near me".
* Trigger help content when queries end with "manual," "pdf," or "replacement".
* Reduce rule sprawl by creating precise, structured query patterns instead of multiple broader rules.
Both matching methods support multi-word phrases with word order respect, ensuring predictable behavior.
For example, a rule set to "\[starts with] winter jackets" triggers for "winter jackets sale" but not "jackets winter sale."

This update improves merchandising precision without increasing technical complexity, maintaining the same familiar workflow you use today.
See [Rules](/docs/lw-platform/lw-cs/cstudio-rules#conditions) for complete details about configuring query matching methods, including examples for e-commerce and knowledge management use cases.
> [!NOTE]
>
> This feature requires Fusion or Lucidworks Search 5.17.0 or later.
**2026-04-14**
# Generative AI using Lucidworks-managed keys
Lucidworks now offers the option to execute generative AI models using Lucidworks-managed API keys, which eliminates the need for your organization to manage third-party credentials across multiple large language model (LLM) providers such as OpenAI, Anthropic, Google, and Azure.
This business option delivers significant operational and strategic advantages in a simplified deployment that eliminates complex third-party integrations and allows your teams to focus on business goals rather than credential management.
Your organization benefits from reduced costs with predictable, fixed pricing instead of unpredictable per-token charges across multiple vendors. This lowers administrative overhead for managing vendor relationships and billing accounts.
This Lucidworks-managed service handles the complete lifecycle of Gen-AI model execution through the Lucidworks AI Gateway for Gen-AI use cases in the Prediction API and Async
Prediction API.
Your organization will configure dedicated Fusion pipelines using LWAI Prediction index and query stages with `Use Case` and `Model` values provided by Lucidworks, while Lucidworks manages the underlying infrastructure, API key lifecycle, and model routing.

Contact Lucidworks to find out about feature availability per your Lucidworks Platform contract.
**2026-03-30**
# Advanced grouping
Commerce Studio now supports advanced grouping, a conditional, rule-based approach to product variant grouping that gives you dynamic control over how products are grouped in search results.
Unlike standard variants that apply uniformly across all products and queries, advanced grouping uses rules to trigger different grouping parameters based on conditions such as queries, categories, or other criteria.
For example, you can group products by color for fashion queries while grouping by product ID for electronics queries.
This dynamic capability enables you to create context-aware grouping strategies that adapt to different search scenarios, improving product discovery and the customer experience.
See [Advanced grouping](/docs/lw-platform/lw-cs/cstudio-rules#advanced-grouping) in the Rules documentation for complete configuration details.
**2026-03-17**
# Category management for Commerce Studio
Because category-level optimization plays a critical role in guiding product discovery and driving conversion, Commerce Studio now includes a dedicated Category Management workspace that lets merchandisers easily curate and optimize category pages without complex Fusion configuration.
You can select categories using both readable names and IDs, apply category-level rules and conditions, preview changes before publishing, and measure performance with integrated analytics.
This streamlined experience empowers your merchandising team to manage browse experiences with the same speed, control, and insight available for search—reducing reliance on engineering and accelerating time to impact.
You can configure the category field on the [Settings](/docs/lw-platform/lw-cs/cstudio-settings) screen, then [use category conditions](/docs/lw-platform/lw-cs/cstudio-editor#use-category-conditions) in the Editor to access the available categories and optimize the results for each one:

Contact Lucidworks to find out about feature availability per your Lucidworks Platform contract.
**2026-02-18**
# Typeahead
The new Typeahead feature is now available in Lucidworks Platform Core Settings to help customers find results faster with real-time query suggestions as they type.
The feature supports Included and Excluded suggestion lists to control which typeahead suggestions appear as customers type. Users can manually add terms to both lists while the Platform automatically populates the table with the most popular terms from a linked [Signals Store](/docs/lw-platform/lw-analytics/signals/signals-store).
As your customer enters text into the search box on your site, the Typeahead feature uses the Included suggestions list to predict possible customer queries and displays suggestions in real time. When the customer clicks on the suggestion, results for the selected term display.
This function helps customers find relevant results faster by predicting what they are trying to search.
See [Typeahead](/docs/lw-platform/lw-core/sites-typeahead) for information to enter and manage suggestions. To retrieve a full or partial list of suggestions for your organization, see [Typeahead Service API](/docs/lw-platform/lw-core/typeahead-api).
**2026-02-18**
# AI Ranking Insights
AI Ranking Insights is a new Commerce Studio feature that displays a clear, business-friendly explanation about why a product or content is ranked in a given position.
When you click a search result, and then click **AI Ranking Insights**, this feature uses a large language model (LLM) to interpret primary ranking drivers, such as text relevance, rules, boosts, rewrites, and AI-driven signals like Neural Hybrid Search (NHS), in Fusion's debug response. Specifically, AI Ranking Insights identifies key relevancy influencers including merchandising rules, matching fields, and matching logic, and then returns the reasoning in a readable format so merchandisers and search managers can quickly identify the key factors influencing a search result's relevancy.
For example, if you click on a bathroom faucet handle pinned as first in a search for "bathroom faucet", the response is:
"Bathroom Faucet Handle ranks #1 out of 12550 total results because of a pin rule that explicitly places this specific product at the top of the results for the query bathroom faucets. This merchandising rule overrides the organic search ranking to ensure the product appears in the first position."
Using this information, the merchandiser or search manager can modify the factors of this and other search results, if needed, to rank other results higher than the bathroom faucet handle.
See [AI Ranking Insights](/docs/lw-platform/lw-cs/cs-ai-ranking-insights) for complete details and instructions to use this feature.
**2026-01-20**
# Image Data Enrichment
The new Image Data Enrichment feature in Lucidworks AI automatically enhances product catalogs with richer attributes by analyzing each item's images and text fields to infer relevant details.
By enriching your catalog's categories, keywords, and synonyms, you make it easier for customers to find what they're looking for—driving higher conversions and reducing search abandonment.
This feature is especially powerful when your product catalog is too large for manually adding details to every item.
See [Image Data Enrichment](/docs/lw-platform/lw-ai/data-enrichment) for complete details and instructions for enabling the feature.
You can use this feature with or without Fusion.
**2025-12-12**
# Streaming responses for the LWAI Prediction API
The LWAI Prediction API now supports streaming responses, enabling applications to receive model output as it is generated. This improves responsiveness for interactive workloads such as chat experiences and real-time content generation. Clients can enable streaming by adding the `Accept: text/event-stream` header to synchronous prediction requests, which returns model output as a sequence of Server-Sent Events (SSE).
Streaming is available only when calling the LWAI Prediction API directly as Fusion does not yet support streaming responses.
See the [Prediction API](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-prediction-api/overview#enable-streaming) for examples of curl calls and streaming output.
**2025-10-16**
# Accelerated indexing with Lucidworks AI batch vectorization
Lucidworks AI continues to advance the performance of vector-based indexing. The latest release introduces new batch vectorization capability that significantly improves embedding throughput. Fusion 5.9.15 now supports this capability through the [LWAI Batch Vectorize Index Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-batch-vectorize-index-stage), enabling faster and more scalable document processing. This integration shows how Fusion and Lucidworks AI evolve together to deliver higher performance for AI-driven indexing.
> **[Fusion](/docs/5/fusion/operations/fusion-5-upgrades)**
>
> Upgrade to Fusion 5.9.15 to take advantage of the new **LWAI Batch Vectorize Index Stage** and achieve faster, more scalable indexing performance. Follow the Fusion upgrade guide to complete your upgrade.
> **[Lucidworks Search](https://support.lucidworks.com/hc/en-us/articles/360052984674-Submit-a-Managed-Fusion-promotion-request-for-a-Production-environment)**
>
> Lucidworks Search customers can request an upgrade to Fusion 5.9.15 to enable the new **LWAI Batch Vectorize Index Stage** and benefit from significantly improved indexing performance. Contact your Lucidworks representative to initiate the upgrade process.
The **LWAI Batch Vectorize Index Stage** groups documents and sends them together to the Lucidworks AI embedding endpoint. By batching requests, it minimizes API overhead, increases throughput, and improves overall pipeline efficiency.
## Performance improvements
Benchmark testing shows that using the**LWAI Batch Vectorize Index Stage** achieved indexing speeds up to 10 times faster than the single-document approach. Indexing rates reached as high as 95 documents per second, compared to fewer than 8 documents per second previously. Even with larger embeddings, throughput consistently exceeded 80 documents per second.
## How it works
The **LWAI Batch Vectorize Index Stage** buffers documents until either the maximum batch size or the maximum wait time is reached. The batch is then sent to the Lucidworks AI embedding service in a single API call, reducing overhead and enabling more consistent scaling.

Flowchart for single document processing
The new stage allows multiple documents per API call, reducing latency and improving performance through Lucidworks AI’s optimized embedding infrastructure.

Flowchart for batch document processing
## Integrated product development
This release demonstrates how Lucidworks AI innovations directly influence Fusion’s evolution. The **LWAI Batch Vectorize Index Stage** enables Fusion users to take advantage of Lucidworks AI’s optimized batching and embedding capabilities without changing existing configurations.
This release highlights how Fusion and Lucidworks AI are being developed in parallel to deliver practical improvements. By adopting the new Batch Vectorize stage, Lucidworks AI users benefit from faster indexing and greater scalability without needing to change their embedding configuration.
For details on setup and configuration, see the [LWAI Batch Vectorize Index Stage documentation](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-batch-vectorize-index-stage).
**2025-08-08**
**Introducing Agent Studio**
Lucidworks is pleased to announce the launch of Agent Studio, a new capability on Lucidworks Platform that enables organizations to create and deploy AI-powered virtual agents for their websites. These prebuilt, customizable agents address a wide range of use cases, including product question-and-answer experiences and generative AI summarization.

### Designed for B2B and B2C
Agent Studio supports both B2B and B2C commerce strategies. For B2B organizations, virtual agents can guide customers through complex product specifications, compatibility requirements, and contract terms, helping shorten sales cycles. For B2C retailers, agents can answer product-specific questions about features, ingredients, or usage guidelines, giving customers the confidence to complete purchases.

### Business impact
Virtual agents are available 24/7 to handle high inquiry volumes, reducing wait times and live interaction demands. This enables staff to focus on resolving complex cases, accelerating transaction completion, and improving customer satisfaction. By integrating directly into product pages, agents deliver accurate, contextual information without requiring customers to search multiple documents.
### Key features
* Library of prebuilt agent types, including Product Q\&A agents optimized for industry and use case.
* Integration with Google Cloud Platform (GCP) datasources for secure, cloud-based data ingestion.
* Simple deployment with a script and HTML snippet.
* Multiple options for product ID extraction to ensure accurate, product-specific answers.
* Customizable layout through CSS to match website branding.
### Get started
Agent Studio is available now in Lucidworks Platform. Select an agent type from the library, connect your datasource, choose an AI model for your industry, and implement the agent with a few lines of code. You can preview and refine the agent before it goes live, ensuring accurate, optimized responses.
> **[Agent Studio](/docs/lw-platform/lw-agent-studio/overview)**
>
> Explore the Agent Studio documentation to discover how to create, customize, and deploy AI-powered virtual agents for your business.
**2025-06-11**
Core Settings is a new capability that simplifies how organizations design and manage search experiences. It provides a single place to configure critical elements of search, including relevance, boost, and typeahead, without requiring code or infrastructure changes.

This release introduces an intuitive workflow that makes advanced features accessible in minutes. For example, teams can adjust Neural Hybrid Search by setting the balance between lexical and semantic approaches through a simple slider. What previously required technical expertise can now be managed through a straightforward interface, giving more teams direct control over search quality.

The benefits of Core Settings extend beyond configuration. The preferences defined here establish a consistent foundation that carries through to Commerce Studio and other applications. This creates a shared understanding of the optimal search setup across environments, ensuring users and customers encounter relevant, high quality results.
> **Benefits for B2B commerce**
>
> B2B buyers often work with large, complex catalogs and need precise access to products or parts. Core Settings enables fine control over relevance, making it easier to surface the right items quickly. Boosting rules and typeahead help reduce friction in product discovery and speed up workflows, which supports efficiency for procurement teams and sales operations.
> **Benefits for B2C commerce**
>
> B2C customers expect fast, personalized experiences that feel intuitive. Core Settings allows merchandising and digital teams to tune search in ways that highlight trending products, balance semantic understanding with exact keyword matches, and provide responsive typeahead suggestions. These adjustments improve product findability, reduce abandonment, and support higher conversion rates across retail and consumer channels.
Core Settings enables organizations to move faster, align teams around a unified search strategy, and deliver improved experiences to both business buyers and consumers.
> **[Core Settings](/docs/lw-platform/lw-core/overview)**
>
> Use Core Settings to quickly define how search works across your applications. Adjust relevance, apply boosting rules, enable typeahead, and fine tune Neural Hybrid Search with no coding necessary.
**2025-05-14**
**Lucidworks AI now supports chunking**
Lucidworks AI now uses document chunking to deliver more precise search results and AI-generated responses from large files. Chunking breaks documents into smaller, meaningful sections so the system can identify and return the most relevant part, rather than the entire document. This capability is available in Fusion 5.9.12 and later.
This delivers:
* **More accurate answers**: Generative AI uses the most relevant sections, improving accuracy and reducing irrelevant output.
* **Better context**: Responses are grounded in the specific parts of a document that match the prompt.
* **Fresher content**: Updates and removals apply at the section level, ensuring AI uses current information.
* **Improved ranking**: Search and AI results can prioritize the best-matching chunks instead of entire documents.
[Enable chunking in Fusion](https://app.supademo.com/embed/cmbjyucmh00j9xu0j0vmhkoum?embed_v=2\&utm_source=embed)
Five chunking strategies are available:
* **dynamic-newline**: Breaks text at newline characters, adjusting chunk size automatically.
* **dynamic-sentence**: Groups sentences together with flexible chunk length based on context.
* **regex-splitter**: Uses a custom regular expression to define chunk boundaries.
* **semantic**: Organizes content into sections based on meaning and related ideas.
* **sentence**: Creates chunks from single sentences or a set number of sentences, based on configuration.
In B2B and B2C commerce, these strategies help AI find exact product details, specifications, or terms hidden deep in large catalogs, manuals, and contracts, improving customer experiences and sales efficiency.
> **[Chunking in Fusion 5.9](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lucidworks-ai-chunker-index-stage)**
>
> Discover how to use Lucidworks AI to chunk documents for improved retrieval, relevance, and ranking in Fusion 5.9.
# Conversational Q&A agent
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/conversational-qna
Set up an Agent Studio chat agent that answers natural-language questions about a product, grounded in its documentation.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
The **Conversational Q\&A** agent is an AI-powered chat agent that lives on your product detail pages.
Customers ask natural-language questions about a product, and the agent responds with accurate, real-time answers grounded in that product's own documentation, such as datasheets, manuals, specifications, and other supporting PDF technical content.
The agent answers follow-up questions in the same session.
## Use cases
**B2B**
If you are a B2B organization that provides computer components for enterprise organizations, your customers may ask questions about the specifications and compatibility documents for your products prior to purchase.
The Conversational Q\&A agent can interpret user questions, analyze the documentation, and quickly provide accurate, factually-based answers.
Any follow-up questions are answered based on the information on your site.
This saves your customers time-consuming and difficult research to obtain the information they need to help make a purchasing decision.
This agent enhances customer satisfaction, increases the potential for conversions, and improves the long-term relationship between your customers and your organization.
**B2C**
The Conversational Q\&A agent is most effective for B2C organizations that offer products with complex documentation such as technical specifications and requirements.
For example, a customer asks about the installation and warranty for an uninterruptible power supply for their office computer.
The agent interprets the user's questions and returns relevant, concise information derived from the documents on your site.
As the customer enters additional questions, the agent responds with answers to those inquiries.
This enhances the potential for sales, and minimizes customer support calls or product returns.
**Knowledge management**
The Conversational Q\&A agent excels at knowledge management use cases, helping employees and stakeholders quickly surface institutional knowledge from internal documentation, policies, and procedures.
For example, an HR team member asks about the company's parental leave policy and accrual rules.
Instead of searching through multiple documents, the agent interprets the question and returns a clear, accurate summary drawn from official HR documentation.
As the employee asks follow-up questions such as eligibility criteria or how to submit a request, the agent continues the conversation with contextually relevant answers.
This reduces time spent searching for information and keeps teams aligned on internal processes.
## Set up the agent
This section details how to create, configure, and test the Conversational Q\&A agent.
> **Prepare your data**
>
> Agent Studio reads your data from a Google Cloud Storage (GCS) bucket outside of Lucidworks Platform.
> You enter the bucket details when you create the agent.
> If your organization doesn't have a GCS bucket to use as a datasource, see [Create a GCS bucket](https://cloud.google.com/storage/docs/creating-buckets).
>
> Your data must be in JSONL *and* PDF format.
>
> In a JSONL file, each line is a complete JSON expression representing a single document, as in the example below:
>
> ```json wrap theme={"dark"}
> {"name": "Puffy Winter Jacket", "product_id": "7a45q835", "description": "This classic down-filled jacket provides maximum insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> {"name": "Extra Puffy Winter Jacket", "product_id": "9b82c222", "description": "This classic down-filled jacket provides even more insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> ```
>
> * All fields are required.
> * Each `product_id` must be unique.
> * JSONL lines are not separated by commas.
> * Enter multiple PDF files as an array of strings.
> * If a document doesn't have an associated PDF file, a blank PDF file is accepted.
> **Create the agent**
>
> 1. From the **Agent Studio** screen, select **Agents** and click **+ Create New**.
>
> 
>
> 2. Enter a descriptive **Name** for the agent, select **Conversational Q\&A**, and then click **Next**.
>
> 
>
> 3. From the **Industry Domain** list, select the industry that best matches your business.
>
> 4. In the **Tasks** field, select the AI model to execute for the agent.
> The recommended model for your industry is selected by default, but you can select a different model.
> Click **Next**.
>
> 5. On the **Select a data connector** screen, click **GCS Bucket** and then click **Next**.
>
> 6. On the **Configure GCS bucket to import data** screen, fill out all required fields.
>
> 
>
> * In the **Name** field, enter the name of your datasource as you want it to display in Lucidworks Platform.
> * In the **Processing Region** field, select the region for Lucidworks to process your data. This is not necessarily the region you created your GCS bucket in. The default value is `us-southcarolina`.
> * In the **Bucket Name** field, enter the name of your GCS bucket as it displays in GCS.
> * In the **Service Account JSON Key** field, enter your Google Cloud Platform (GCP) key in JSON format to allow access to your GCS bucket.
>
> 7. Click **Verify Connection** to verify the connection to the GCS bucket.
>
> > [!NOTE]
> >
> > You can add multiple GCS buckets to expand the information the model uses for responses.
> > To add another bucket, click **Add New** on the **Configure GCS bucket** screen.
> > To remove a bucket, select it and click **Remove**.
>
> 8. When the agent is created, choose what to do next:
>
> * **Preview Agent** opens the agent preview, where you enter a product ID and test the agent's responses in Agent Studio before you add it to your site.
> See [Preview and test the agent](#preview-and-test-the-agent).
> * **Get Agent Code** displays the code snippets to add the agent to your website.
> See [Embed the agent](#embed-the-agent).
>
> You can also click **Exit** and do either later from the agent details.
> Verify the agent displays on the **Agents** screen.
>
> 
>
> > [!WARNING]
> >
> > Major changes to an agent, such as updating the model or changing datasources, generate a new `template-id`.
> > The old `template-id` still works, but it may not reflect your changes.
> > Update your frontend code with the new `template-id` from the agent's **Details** tab to use the latest configuration.
> **Preview and test the agent**
>
> Preview an agent in Agent Studio to test its responses before you add it to your website.
> The preview displays the same component your customers see, using live data from your datasource for the product ID you enter.
> You don't need to embed the agent or configure the **Agent Code** section to use the preview.
>
> 1. Navigate to Agent Studio, click the **Agents** tab, and then select the agent you want to preview or test.
>
> 
>
> The agent details display the following sections:
>
> * **Agent Information**, such as the name, type, and model for the agent.
> * **Agent Preview**, to test whether the responses accurately reflect the information on your website.
> * **Agent Code**, to embed the agent in your web page.
>
> 2. In the **Agent Preview** section, enter the ID of a product from your datasource.
> The agent loads using the data for that product.
> If the product ID isn't found, check the ID and try again.
>
> What the preview displays depends on the agent type:
>
> * **Product Q\&A** displays the questions and answers generated for the product. Select a question to view its answer.
> * **Conversational Q\&A** opens a chat. Enter questions about the product, including follow-up questions.
> * **Conversational Q\&A FAQ** opens a chat for your questions and displays generated questions a customer is likely to ask.
>
> 3. Test the agent's responses and verify they accurately reflect the information about that product.
>
> > [!NOTE]
> >
> > If the preview reports that no data is available, your datasource is still processing or contains no documents.
> > Wait for the initial processing to finish, and then try again.
> **Embed the agent**
>
> After you create an agent, the agent details screen provides the code to embed the agent on your website.
> Embedding an agent involves two decisions:
>
> * Where you [place the script](#add-the-script) that loads the agent.
>
> * How the agent [obtains the product ID](#specify-the-product-id) so it provides accurate information.
>
> > [!NOTE]
> >
> > The script, component markup, and CSS are unique to each agent.
> > Always copy the code from the **Agent Details** section of the agent you're embedding.
>
> ### Add the script
>
> 1. Navigate to Agent Studio, click **Agents**, and then click the agent you want to implement.
>
> 
>
> 2. In the **Agent Details** section, scroll to the **Agent Code** section, and in the **Add the Script Tag** area, click **Copy**.
>
> 
>
> 3. Paste the script into the `
` or `` of your website's HTML.
>
> No matter where you place the script, the `` snippet must be in the `` of a page for the agent to display there.
>
> **In the \ (recommended)**
>
> For best performance, place the script in the ``.
> The script loads before the page body, along with any other scripts in your ``.
> The agent displays only on pages where you also place the `` snippet in the ``.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> **In the \**
>
> If you place the script in the `` of specific pages, it loads only on those pages, after the scripts in your ``.
> The order of the script and snippet relative to other items on the page can affect the order in which other page elements load, so this placement isn't recommended.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
>
> ```
>
> > [!NOTE]
> >
> > If your site uses a Content Security Policy (CSP), add `https://storage.googleapis.com` to your `script-src` directive (the agent script is served from Google Cloud Storage) and add the App Studio API URL to your `connect-src` directive.
>
> > [!NOTE]
> >
> > To use the Signals beacon on the same page as your agent, you need additional script configuration.
> > See [Configure the beacon with Agent Studio or UI Studio](/docs/lw-platform/lw-analytics/signals/signals-beacon#configure-the-beacon-with-agent-studio-or-ui-studio).
>
> ### Specify the product ID
>
> The agent answers questions about a specific product.
> It identifies the product by its unique ID, which it gets from the `` snippet in the `` of your page.
>
> Choose one of the following methods, and use it with the script placement you chose in [Add the script](#add-the-script).
>
> #### URL query parameter
>
> Use this method when the product ID is consistently in the page URL as a query parameter, or when you want to avoid manually injecting it into the HTML snippet.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> 3. In the **Specify the Product ID** section, enter the **URL Query Parameters** value for the product ID.
> For example, if your URL is `https://www.example.com/sale?q=solvents&product=1234` and your product ID is `1234`, enter `product`.
> 4. Verify the agent displays on the appropriate pages of your website.
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### CSS selector
>
> Use this method when the product ID isn't in a URL query parameter, you don't want to inject it into the HTML snippet, and the product ID is already on the page in an element you can isolate with CSS selectors.
>
> > [!NOTE]
> >
> > You must be able to extract the exact product ID through CSS selectors.
> > For example, if the product ID is `1234`, you must be able to extract `1234` without any additional text, such as `product-id: 1234`.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
>
> 3. In the **Specify the Product ID** section, enter the **CSS Selector** that contains the product ID.
> The following example uses `.product .product-name @data-value` to extract a product ID of `1234`:
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
> Product Name
>
>
>
>
>
>
> ```
>
> 4. Verify the agent displays on the appropriate pages of your website.
>
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### Markup attribute
>
> Use this method when the product ID exists on the product detail page but isn't available in the HTML or as a query parameter.
> You inject the product ID dynamically into the markup.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Markup Attribute** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> The following example uses `https://www.example.com/sale/1234` and `product-id` in the snippet.
> If your product ID attribute name is different from the one in the copied snippet, change the attribute name manually.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> 3. Verify the agent displays on the appropriate pages of your website.
>
> 4. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> ### Customize the layout with CSS
>
> The agent details screen also contains a CSS code block.
> Use it to customize the appearance of the agent to match your website's existing layout.
>
> The following example shows some custom styling options.
> Styling options vary by agent type.
>
> > [!NOTE]
> >
> > All agent customizations must be contained within the `.lw-template` properties.
>
> ```css theme={"dark"}
> /* Custom styling for the agent template */
> .lw-template {
> /* Container dimensions */
> min-height: 300px;
> max-height: 800px;
> min-width: 300px;
> max-width: 600px;
>
> /* Optional styling examples: */
> --qna-font-family: Arial, sans-serif;
> --qna-container-border-radius: 10px;
> --qna-header-font-size: 32px;
> --qna-header-icon-color: #a19eff;
> --qna-answer-bubble-bg-color: #add8e6;
> }
> ```
## Manage the agent
> **[Manage agents](/docs/lw-platform/lw-agent-studio/manage-agents)**
>
> Preview, edit, and delete agents.
# Conversational Q&A FAQ agent
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/conversational-qna-faq
Set up an Agent Studio agent that answers natural-language questions about a product and generates related frequently asked questions.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
The **Conversational Q\&A FAQ** agent combines the [Conversational Q\&A agent](/docs/lw-platform/lw-agent-studio/conversational-qna) with generated frequently asked questions:
* **Answers to initial and follow-up queries.** The agent assesses user queries and analyzes product information, specifications, and other documents on your site to generate standardized, accurate, content-based answers. If the user enters additional questions, the agent continues the conversation.
* **Frequently asked questions.** The agent generates a series of questions the current user is most likely to ask. This gives the user more information about their query, which can help minimize customer support calls and product returns.
[Conversational Q\&A FAQ agent example](https://app.supademo.com/embed/cmords7yg44fdw9dophsneqci?embed_v=2\&utm_source=embed)
## Use cases
**B2B**
If you are a B2B organization that provides computer components for enterprise organizations, your customers may ask questions about the specifications and compatibility documents for your products prior to purchase.
The Conversational Q\&A FAQ agent can interpret user questions, analyze the documentation, and quickly provide accurate, factually-based answers.
The agent responds to any follow-up queries to continue the conversation, providing standardized answers based on your site's documentation.
In addition, the agent predicts and surfaces several relevant questions based on the product content itself, which may provide information the current user might not have thought to ask.
This gives the user more information to understand the product, and helps minimize customer support calls and product returns.
**B2C**
If you are a B2C organization that sells exercise equipment, a customer could ask about a specific treadmill.
The agent reviews product information and provides answers to the user query.
If the customer enters additional questions about price, payment options, and delivery options, the agent responds with fact-based answers from the information on your site.
The agent may also provide a list of frequently asked questions about financing options, assembly instructions, and recommended assemblers.
This conversation and section of frequently asked questions can help the customer make the choice that is best for them, which increases customer satisfaction and minimizes support interactions and product returns.
**Knowledge management**
If your organization wants to provide human resource documents such as sick leave policies or code of conduct requirements, the agent can answer employee questions in natural language and surface the most relevant content from those documents.
It also generates frequently asked questions based on the available documentation, helping employees self-serve before reaching out to HR.
This reduces the burden on HR teams and ensures employees consistently receive accurate, policy-aligned answers.
## Set up the agent
This section details how to create, configure, and test the Conversational Q\&A FAQ agent.
> **Prepare your data**
>
> Agent Studio reads your data from a Google Cloud Storage (GCS) bucket outside of Lucidworks Platform.
> You enter the bucket details when you create the agent.
> If your organization doesn't have a GCS bucket to use as a datasource, see [Create a GCS bucket](https://cloud.google.com/storage/docs/creating-buckets).
>
> Your data must be in JSONL *and* PDF format.
>
> In a JSONL file, each line is a complete JSON expression representing a single document, as in the example below:
>
> ```json wrap theme={"dark"}
> {"name": "Puffy Winter Jacket", "product_id": "7a45q835", "description": "This classic down-filled jacket provides maximum insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> {"name": "Extra Puffy Winter Jacket", "product_id": "9b82c222", "description": "This classic down-filled jacket provides even more insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> ```
>
> * All fields are required.
> * Each `product_id` must be unique.
> * JSONL lines are not separated by commas.
> * Enter multiple PDF files as an array of strings.
> * If a document doesn't have an associated PDF file, a blank PDF file is accepted.
> **Create the agent**
>
> This agent uses two AI models: one for the generated FAQ (**Q\&A Generation**) and one for the conversation (**Conversation Generation**).
>
> 1. From the **Agent Studio** screen, select **Agents** and click **+ Create New**.
>
> 
>
> 2. Enter a descriptive **Name** for the agent, select **Conversational Q\&A FAQ**, and then click **Next**.
>
> 
>
> 3. From the **Industry Domain** list, select the industry that best matches your business.
>
> 
>
> 4. In the **Tasks** field, select the AI model to execute for **Q\&A Generation**.
> The recommended model for your industry is selected by default, but you can select a different model.
>
> 
>
> 5. In the **Tasks** field, select the AI model to execute for **Conversation Generation**.
> The recommended model for your industry is selected by default, but you can select a different model.
> Click **Next**.
>
> 6. On the **Select a data connector** screen, click **GCS Bucket** and then click **Next**.
>
> 7. On the **Configure GCS bucket to import data** screen, fill out all required fields.
>
> 
>
> * In the **Name** field, enter the name of your datasource as you want it to display in Lucidworks Platform.
> * In the **Processing Region** field, select the region for Lucidworks to process your data. This is not necessarily the region you created your GCS bucket in. The default value is `us-southcarolina`.
> * In the **Bucket Name** field, enter the name of your GCS bucket as it displays in GCS.
> * In the **Service Account JSON Key** field, enter your Google Cloud Platform (GCP) key in JSON format to allow access to your GCS bucket.
>
> 8. Click **Verify Connection** to verify the connection to the GCS bucket.
>
> > [!NOTE]
> >
> > You can add multiple GCS buckets to expand the information the model uses for responses.
> > To add another bucket, click **Add New** on the **Configure GCS bucket** screen.
> > To remove a bucket, select it and click **Remove**.
>
> 9. When the agent is created, choose what to do next:
>
> * **Preview Agent** opens the agent preview, where you enter a product ID and test the agent's responses in Agent Studio before you add it to your site.
> See [Preview and test the agent](#preview-and-test-the-agent).
> * **Get Agent Code** displays the code snippets to add the agent to your website.
> See [Embed the agent](#embed-the-agent).
>
> You can also click **Exit** and do either later from the agent details.
> Verify the agent displays on the **Agents** screen.
>
> 
>
> > [!WARNING]
> >
> > Major changes to an agent, such as updating the model or changing datasources, generate a new `template-id`.
> > The old `template-id` still works, but it may not reflect your changes.
> > Update your frontend code with the new `template-id` from the agent's **Details** tab to use the latest configuration.
> **Preview and test the agent**
>
> Preview an agent in Agent Studio to test its responses before you add it to your website.
> The preview displays the same component your customers see, using live data from your datasource for the product ID you enter.
> You don't need to embed the agent or configure the **Agent Code** section to use the preview.
>
> 1. Navigate to Agent Studio, click the **Agents** tab, and then select the agent you want to preview or test.
>
> 
>
> The agent details display the following sections:
>
> * **Agent Information**, such as the name, type, and model for the agent.
> * **Agent Preview**, to test whether the responses accurately reflect the information on your website.
> * **Agent Code**, to embed the agent in your web page.
>
> 2. In the **Agent Preview** section, enter the ID of a product from your datasource.
> The agent loads using the data for that product.
> If the product ID isn't found, check the ID and try again.
>
> What the preview displays depends on the agent type:
>
> * **Product Q\&A** displays the questions and answers generated for the product. Select a question to view its answer.
> * **Conversational Q\&A** opens a chat. Enter questions about the product, including follow-up questions.
> * **Conversational Q\&A FAQ** opens a chat for your questions and displays generated questions a customer is likely to ask.
>
> 3. Test the agent's responses and verify they accurately reflect the information about that product.
>
> > [!NOTE]
> >
> > If the preview reports that no data is available, your datasource is still processing or contains no documents.
> > Wait for the initial processing to finish, and then try again.
> **Embed the agent**
>
> After you create an agent, the agent details screen provides the code to embed the agent on your website.
> Embedding an agent involves two decisions:
>
> * Where you [place the script](#add-the-script) that loads the agent.
>
> * How the agent [obtains the product ID](#specify-the-product-id) so it provides accurate information.
>
> > [!NOTE]
> >
> > The script, component markup, and CSS are unique to each agent.
> > Always copy the code from the **Agent Details** section of the agent you're embedding.
>
> ### Add the script
>
> 1. Navigate to Agent Studio, click **Agents**, and then click the agent you want to implement.
>
> 
>
> 2. In the **Agent Details** section, scroll to the **Agent Code** section, and in the **Add the Script Tag** area, click **Copy**.
>
> 
>
> 3. Paste the script into the `` or `` of your website's HTML.
>
> No matter where you place the script, the `` snippet must be in the `` of a page for the agent to display there.
>
> **In the \ (recommended)**
>
> For best performance, place the script in the ``.
> The script loads before the page body, along with any other scripts in your ``.
> The agent displays only on pages where you also place the `` snippet in the ``.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> **In the \**
>
> If you place the script in the `` of specific pages, it loads only on those pages, after the scripts in your ``.
> The order of the script and snippet relative to other items on the page can affect the order in which other page elements load, so this placement isn't recommended.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
>
> ```
>
> > [!NOTE]
> >
> > If your site uses a Content Security Policy (CSP), add `https://storage.googleapis.com` to your `script-src` directive (the agent script is served from Google Cloud Storage) and add the App Studio API URL to your `connect-src` directive.
>
> > [!NOTE]
> >
> > To use the Signals beacon on the same page as your agent, you need additional script configuration.
> > See [Configure the beacon with Agent Studio or UI Studio](/docs/lw-platform/lw-analytics/signals/signals-beacon#configure-the-beacon-with-agent-studio-or-ui-studio).
>
> ### Specify the product ID
>
> The agent answers questions about a specific product.
> It identifies the product by its unique ID, which it gets from the `` snippet in the `` of your page.
>
> Choose one of the following methods, and use it with the script placement you chose in [Add the script](#add-the-script).
>
> #### URL query parameter
>
> Use this method when the product ID is consistently in the page URL as a query parameter, or when you want to avoid manually injecting it into the HTML snippet.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> 3. In the **Specify the Product ID** section, enter the **URL Query Parameters** value for the product ID.
> For example, if your URL is `https://www.example.com/sale?q=solvents&product=1234` and your product ID is `1234`, enter `product`.
> 4. Verify the agent displays on the appropriate pages of your website.
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### CSS selector
>
> Use this method when the product ID isn't in a URL query parameter, you don't want to inject it into the HTML snippet, and the product ID is already on the page in an element you can isolate with CSS selectors.
>
> > [!NOTE]
> >
> > You must be able to extract the exact product ID through CSS selectors.
> > For example, if the product ID is `1234`, you must be able to extract `1234` without any additional text, such as `product-id: 1234`.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
>
> 3. In the **Specify the Product ID** section, enter the **CSS Selector** that contains the product ID.
> The following example uses `.product .product-name @data-value` to extract a product ID of `1234`:
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
> Product Name
>
>
>
>
>
>
> ```
>
> 4. Verify the agent displays on the appropriate pages of your website.
>
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### Markup attribute
>
> Use this method when the product ID exists on the product detail page but isn't available in the HTML or as a query parameter.
> You inject the product ID dynamically into the markup.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Markup Attribute** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> The following example uses `https://www.example.com/sale/1234` and `product-id` in the snippet.
> If your product ID attribute name is different from the one in the copied snippet, change the attribute name manually.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> 3. Verify the agent displays on the appropriate pages of your website.
>
> 4. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> ### Customize the layout with CSS
>
> The agent details screen also contains a CSS code block.
> Use it to customize the appearance of the agent to match your website's existing layout.
>
> The following example shows some custom styling options.
> Styling options vary by agent type.
>
> > [!NOTE]
> >
> > All agent customizations must be contained within the `.lw-template` properties.
>
> ```css theme={"dark"}
> /* Custom styling for the agent template */
> .lw-template {
> /* Container dimensions */
> min-height: 300px;
> max-height: 800px;
> min-width: 300px;
> max-width: 600px;
>
> /* Optional styling examples: */
> --qna-font-family: Arial, sans-serif;
> --qna-container-border-radius: 10px;
> --qna-header-font-size: 32px;
> --qna-header-icon-color: #a19eff;
> --qna-answer-bubble-bg-color: #add8e6;
> }
> ```
## Manage the agent
> **[Manage agents](/docs/lw-platform/lw-agent-studio/manage-agents)**
>
> Preview, edit, and delete agents.
# Manage agents
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/manage-agents
Preview, edit, and delete Agent Studio agents.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
After you create an agent, you can preview, edit, or delete it from the **Agents** screen in Agent Studio.
## Preview and test an agent
Preview an agent in Agent Studio to test its responses before you add it to your website.
The preview displays the same component your customers see, using live data from your datasource for the product ID you enter.
You don't need to embed the agent or configure the **Agent Code** section to use the preview.
1. Navigate to Agent Studio, click the **Agents** tab, and then select the agent you want to preview or test.

The agent details display the following sections:
* **Agent Information**, such as the name, type, and model for the agent.
* **Agent Preview**, to test whether the responses accurately reflect the information on your website.
* **Agent Code**, to embed the agent in your web page.
2. In the **Agent Preview** section, enter the ID of a product from your datasource.
The agent loads using the data for that product.
If the product ID isn't found, check the ID and try again.
What the preview displays depends on the agent type:
* **Product Q\&A** displays the questions and answers generated for the product. Select a question to view its answer.
* **Conversational Q\&A** opens a chat. Enter questions about the product, including follow-up questions.
* **Conversational Q\&A FAQ** opens a chat for your questions and displays generated questions a customer is likely to ask.
3. Test the agent's responses and verify they accurately reflect the information about that product.
> [!NOTE]
>
> If the preview reports that no data is available, your datasource is still processing or contains no documents.
> Wait for the initial processing to finish, and then try again.
## Edit an agent
1. Navigate to Agent Studio, click **Agents**, hold the pointer over the agent you want to change, and click the pencil icon.
2. Enter the changes on each screen, clicking **Next** to advance to the next screen, and then click **Exit** on the final screen to save the changes.
3. [Preview and test the agent](#preview-and-test-an-agent) to verify the changes.
If necessary, refine the agent until the returned responses are accurate and optimized.
> [!WARNING]
>
> Major changes to an agent, such as updating the model or changing datasources, generate a new `template-id`.
> The old `template-id` still works, but it may not reflect your changes.
> Update your frontend code with the new `template-id` from the agent's **Details** tab to use the latest configuration.
If your changes generate a new `template-id`, update the `` snippet on your site.
For embedding details, select your agent type in [Configure and deploy an agent](/docs/lw-platform/lw-agent-studio/overview#configure-and-deploy-an-agent).
## Delete an agent
1. Navigate to Agent Studio, click **Agents**, hold the pointer over the agent you want to delete, and then click the trash can icon.
2. Confirm the deletion, and then verify the agent no longer displays on the **Agents** screen.
> [!WARNING]
>
> Deleting an agent is permanent.
> To use a deleted agent again, you must create it as a new agent.
# Agent Studio
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/overview
Create prebuilt, customizable AI agents that answer customer questions on your website.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
Agent Studio lets you create AI-powered virtual agents for your website.
Agents are prebuilt, highly customizable solutions for use cases such as product question and answer widgets and conversational chat agents that respond to multiple questions in a single session.
They improve customer experiences for B2B, B2C, and knowledge management organizations.
Virtual agents provide the following benefits:
* They're available 24/7 to customers all over the world and respond with accurate, standardized information tailored to each query.
* They handle high volumes of inquiries, which reduces wait times and live customer interactions, so your personnel can focus on more complex issues.
## How Agent Studio works
**Agents come from a prebuilt library.** Choose the agent type that fits your use case, and then configure it for your business.
**Your data stays in your GCS bucket.** Agent Studio reads JSONL and PDF content from Google Cloud Storage (GCS) buckets that you connect to the agent.
**Models are matched to your industry.** Select your industry domain, and Agent Studio recommends the generative AI model to use. You can select a different model.
Agent Studio doesn't support custom large language model (LLM) training.
**Agents embed with a script and one HTML element.** Add the agent's script and `` snippet to your site, and the agent displays on those pages.
## Get started
> **[Quickstart](/docs/lw-platform/lw-agent-studio/quickstart)**
>
> Create and embed your first agent.
> **[Agent Studio for Commerce and Knowledge Management](https://academy.lucidworks.com/scorm/01a13b7a-8775-70e7-991d-5eb12e6e0164)**
>
> Learn how to choose the right agent for commerce and knowledge management use cases, connect it to your data in a GCS bucket, and embed it on your site.
## Configure and deploy an agent
This demo shows how to create and deploy an agent in Agent Studio.
[https://app.supademo.com/embed/cmosvfabg011w1j0jmgtg1uza?embed\_v=2\&utm\_source=embed](https://app.supademo.com/embed/cmosvfabg011w1j0jmgtg1uza?embed_v=2\&utm_source=embed)
Select an agent type to display detailed instructions to configure and deploy that agent on your site.
> **[Product Q\&A](/docs/lw-platform/lw-agent-studio/product-qna)**
>
> Generate frequently asked questions and answers about a product from its documentation.
> **[Conversational Q\&A](/docs/lw-platform/lw-agent-studio/conversational-qna)**
>
> Answer natural-language questions and follow-ups about a product, grounded in its documentation.
> **[Conversational Q\&A FAQ](/docs/lw-platform/lw-agent-studio/conversational-qna-faq)**
>
> Combine conversational answers with generated frequently asked questions.
## Manage an existing agent
> **[Manage agents](/docs/lw-platform/lw-agent-studio/manage-agents)**
>
> Preview, edit, and delete agents.
# Product Q&A agent
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/product-qna
Set up an Agent Studio agent that generates frequently asked questions and answers about a product from its documentation.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
The **Product Q\&A** agent generates frequently asked questions and answers about a product or document, based on your industry and the information on your website.
Customers select a question to view its answer without reading multiple documents.
## Use cases
**B2B**
If you are a B2B organization that provides industrial technology components and a computer server manufacturer queries about fiber optic connectors, the agent displays questions that a customer may have about a specific fiber optic connector on its product detail page, based on the information ingested about that product in the datasource from documents such as instruction manuals and specification files.
These questions could relate to bandwidth capabilities, equipment compatibility, and warranty terms.
The customer can then select the question to view the answer without reading multiple documents to find the answer.
**B2C**
If you are a B2C organization that provides skin care products, the agent displays questions that a customer may have about a specific skin care product on its product detail page, based on the information ingested about that product in the datasource from documents such as ingredient lists and benefits of using that product.
These questions could relate to whether that product is vegan or suitable for daily use.
The customer can then select the question and view the answer, increasing customer confidence and the likelihood of a purchase.
## Set up the agent
This section details how to create, configure, and test the Product Q\&A agent.
> **Prepare your data**
>
> Agent Studio reads your data from a Google Cloud Storage (GCS) bucket outside of Lucidworks Platform.
> You enter the bucket details when you create the agent.
> If your organization doesn't have a GCS bucket to use as a datasource, see [Create a GCS bucket](https://cloud.google.com/storage/docs/creating-buckets).
>
> Your data must be in JSONL *and* PDF format.
>
> In a JSONL file, each line is a complete JSON expression representing a single document, as in the example below:
>
> ```json wrap theme={"dark"}
> {"name": "Puffy Winter Jacket", "product_id": "7a45q835", "description": "This classic down-filled jacket provides maximum insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> {"name": "Extra Puffy Winter Jacket", "product_id": "9b82c222", "description": "This classic down-filled jacket provides even more insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
> ```
>
> * All fields are required.
> * Each `product_id` must be unique.
> * JSONL lines are not separated by commas.
> * Enter multiple PDF files as an array of strings.
> * If a document doesn't have an associated PDF file, a blank PDF file is accepted.
> **Create the agent**
>
> 1. From the **Agent Studio** screen, select **Agents** and click **+ Create New**.
>
> 
>
> 2. Enter a descriptive **Name** for the agent, select **Product Q\&A**, and then click **Next**.
>
> 
>
> 3. From the **Industry Domain** list, select the industry that best matches your business.
>
> 4. In the **Tasks** field, select the AI model to execute for the agent.
> The recommended model for your industry is selected by default, but you can select a different model.
> Click **Next**.
>
> 5. On the **Select a data connector** screen, click **GCS Bucket** and then click **Next**.
>
> 6. On the **Configure GCS bucket to import data** screen, fill out all required fields.
>
> 
>
> * In the **Name** field, enter the name of your datasource as you want it to display in Lucidworks Platform.
> * In the **Processing Region** field, select the region for Lucidworks to process your data. This is not necessarily the region you created your GCS bucket in. The default value is `us-southcarolina`.
> * In the **Bucket Name** field, enter the name of your GCS bucket as it displays in GCS.
> * In the **Service Account JSON Key** field, enter your Google Cloud Platform (GCP) key in JSON format to allow access to your GCS bucket.
>
> 7. Click **Verify Connection** to verify the connection to the GCS bucket.
>
> > [!NOTE]
> >
> > You can add multiple GCS buckets to expand the information the model uses for responses.
> > To add another bucket, click **Add New** on the **Configure GCS bucket** screen.
> > To remove a bucket, select it and click **Remove**.
>
> 8. When the agent is created, choose what to do next:
>
> * **Preview Agent** opens the agent preview, where you enter a product ID and test the agent's responses in Agent Studio before you add it to your site.
> See [Preview and test the agent](#preview-and-test-the-agent).
> * **Get Agent Code** displays the code snippets to add the agent to your website.
> See [Embed the agent](#embed-the-agent).
>
> You can also click **Exit** and do either later from the agent details.
> Verify the agent displays on the **Agents** screen.
>
> 
>
> > [!WARNING]
> >
> > Major changes to an agent, such as updating the model or changing datasources, generate a new `template-id`.
> > The old `template-id` still works, but it may not reflect your changes.
> > Update your frontend code with the new `template-id` from the agent's **Details** tab to use the latest configuration.
> **Preview and test the agent**
>
> Preview an agent in Agent Studio to test its responses before you add it to your website.
> The preview displays the same component your customers see, using live data from your datasource for the product ID you enter.
> You don't need to embed the agent or configure the **Agent Code** section to use the preview.
>
> 1. Navigate to Agent Studio, click the **Agents** tab, and then select the agent you want to preview or test.
>
> 
>
> The agent details display the following sections:
>
> * **Agent Information**, such as the name, type, and model for the agent.
> * **Agent Preview**, to test whether the responses accurately reflect the information on your website.
> * **Agent Code**, to embed the agent in your web page.
>
> 2. In the **Agent Preview** section, enter the ID of a product from your datasource.
> The agent loads using the data for that product.
> If the product ID isn't found, check the ID and try again.
>
> What the preview displays depends on the agent type:
>
> * **Product Q\&A** displays the questions and answers generated for the product. Select a question to view its answer.
> * **Conversational Q\&A** opens a chat. Enter questions about the product, including follow-up questions.
> * **Conversational Q\&A FAQ** opens a chat for your questions and displays generated questions a customer is likely to ask.
>
> 3. Test the agent's responses and verify they accurately reflect the information about that product.
>
> > [!NOTE]
> >
> > If the preview reports that no data is available, your datasource is still processing or contains no documents.
> > Wait for the initial processing to finish, and then try again.
> **Embed the agent**
>
> After you create an agent, the agent details screen provides the code to embed the agent on your website.
> Embedding an agent involves two decisions:
>
> * Where you [place the script](#add-the-script) that loads the agent.
>
> * How the agent [obtains the product ID](#specify-the-product-id) so it provides accurate information.
>
> > [!NOTE]
> >
> > The script, component markup, and CSS are unique to each agent.
> > Always copy the code from the **Agent Details** section of the agent you're embedding.
>
> ### Add the script
>
> 1. Navigate to Agent Studio, click **Agents**, and then click the agent you want to implement.
>
> 
>
> 2. In the **Agent Details** section, scroll to the **Agent Code** section, and in the **Add the Script Tag** area, click **Copy**.
>
> 
>
> 3. Paste the script into the `` or `` of your website's HTML.
>
> No matter where you place the script, the `` snippet must be in the `` of a page for the agent to display there.
>
> **In the \ (recommended)**
>
> For best performance, place the script in the ``.
> The script loads before the page body, along with any other scripts in your ``.
> The agent displays only on pages where you also place the `` snippet in the ``.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> **In the \**
>
> If you place the script in the `` of specific pages, it loads only on those pages, after the scripts in your ``.
> The order of the script and snippet relative to other items on the page can affect the order in which other page elements load, so this placement isn't recommended.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
>
> ```
>
> > [!NOTE]
> >
> > If your site uses a Content Security Policy (CSP), add `https://storage.googleapis.com` to your `script-src` directive (the agent script is served from Google Cloud Storage) and add the App Studio API URL to your `connect-src` directive.
>
> > [!NOTE]
> >
> > To use the Signals beacon on the same page as your agent, you need additional script configuration.
> > See [Configure the beacon with Agent Studio or UI Studio](/docs/lw-platform/lw-analytics/signals/signals-beacon#configure-the-beacon-with-agent-studio-or-ui-studio).
>
> ### Specify the product ID
>
> The agent answers questions about a specific product.
> It identifies the product by its unique ID, which it gets from the `` snippet in the `` of your page.
>
> Choose one of the following methods, and use it with the script placement you chose in [Add the script](#add-the-script).
>
> #### URL query parameter
>
> Use this method when the product ID is consistently in the page URL as a query parameter, or when you want to avoid manually injecting it into the HTML snippet.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> 3. In the **Specify the Product ID** section, enter the **URL Query Parameters** value for the product ID.
> For example, if your URL is `https://www.example.com/sale?q=solvents&product=1234` and your product ID is `1234`, enter `product`.
> 4. Verify the agent displays on the appropriate pages of your website.
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### CSS selector
>
> Use this method when the product ID isn't in a URL query parameter, you don't want to inject it into the HTML snippet, and the product ID is already on the page in an element you can isolate with CSS selectors.
>
> > [!NOTE]
> >
> > You must be able to extract the exact product ID through CSS selectors.
> > For example, if the product ID is `1234`, you must be able to extract `1234` without any additional text, such as `product-id: 1234`.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Automatic Extraction** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
>
> 3. In the **Specify the Product ID** section, enter the **CSS Selector** that contains the product ID.
> The following example uses `.product .product-name @data-value` to extract a product ID of `1234`:
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
> Product Name
>
>
>
>
>
>
> ```
>
> 4. Verify the agent displays on the appropriate pages of your website.
>
> 5. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> #### Markup attribute
>
> Use this method when the product ID exists on the product detail page but isn't available in the HTML or as a query parameter.
> You inject the product ID dynamically into the markup.
>
> 1. Scroll to the **Add Component Markup** section, and then in the **Markup Attribute** area, click **Copy**.
>
> 2. Paste the `` snippet in the `` of every page where you want the agent to display.
> The following example uses `https://www.example.com/sale/1234` and `product-id` in the snippet.
> If your product ID attribute name is different from the one in the copied snippet, change the attribute name manually.
>
> ```html theme={"dark"}
>
>
>
>
>
>
>
>
> ```
>
> 3. Verify the agent displays on the appropriate pages of your website.
>
> 4. Test the agent by entering various queries to determine if it returns appropriate responses.
>
> ### Customize the layout with CSS
>
> The agent details screen also contains a CSS code block.
> Use it to customize the appearance of the agent to match your website's existing layout.
>
> The following example shows some custom styling options.
> Styling options vary by agent type.
>
> > [!NOTE]
> >
> > All agent customizations must be contained within the `.lw-template` properties.
>
> ```css theme={"dark"}
> /* Custom styling for the agent template */
> .lw-template {
> /* Container dimensions */
> min-height: 300px;
> max-height: 800px;
> min-width: 300px;
> max-width: 600px;
>
> /* Optional styling examples: */
> --qna-font-family: Arial, sans-serif;
> --qna-container-border-radius: 10px;
> --qna-header-font-size: 32px;
> --qna-header-icon-color: #a19eff;
> --qna-answer-bubble-bg-color: #add8e6;
> }
> ```
## Manage the agent
> **[Manage agents](/docs/lw-platform/lw-agent-studio/manage-agents)**
>
> Preview, edit, and delete agents.
# Quickstart
Source: https://doc.lucidworks.com/docs/lw-platform/lw-agent-studio/quickstart
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
This quickstart explains how to create an embeddable AI agent.
Agent Studio provides a simple interface for quickly creating an intelligent agent that can answer customer questions right inside your website.
For a video walkthrough of the setup steps for a new agent, click **Get Started** below:
[https://app.supademo.com/embed/cmosvfabg011w1j0jmgtg1uza?embed\_v=2\&utm\_source=embed](https://app.supademo.com/embed/cmosvfabg011w1j0jmgtg1uza?embed_v=2\&utm_source=embed)
Here's how it works:
**1. Define your use case**
What business goals will this agent help you meet?
In what context will customers encounter this agent?
What types of questions do your customers ask?
Knowing the answers to these questions helps you choose the right type of agent and the right content to train it for maximum effectiveness.
**2. Format your training data**
Agent Studio reads data directly from a GCS bucket, not from Fusion.
Your data must be in JSONL *and* PDF format.
In a JSONL file, each line is a complete JSON expression representing a single document, as in the example below:
```json wrap theme={"dark"}
{"name": "Puffy Winter Jacket", "product_id": "7a45q835", "description": "This classic down-filled jacket provides maximum insulation combined with lightweight comfort.", "documents": ["https://storage.googleapis.com/my-storage/puffy-winter-jacket.pdf"]}
```
For the complete data requirements, select your agent type in [Configure and deploy an agent](/docs/lw-platform/lw-agent-studio/overview#configure-and-deploy-an-agent).
**3. Select an agent from the Agent Studio library**
Your library includes one or more pre-built agent templates, depending on your Lucidworks subscription.
Navigate to the Agent Studio Library screen and click the agent that's best suited for your use case.
To compare agent types, see [Configure and deploy an agent](/docs/lw-platform/lw-agent-studio/overview#configure-and-deploy-an-agent).
You can [contact Lucidworks](mailto:support@lucidworks.com) if you need additional agent templates for the evolving needs of your business.
**4. Configure your agent**
Agent Studio guides you through some simple setup steps to connect your agent to your data.
You can also configure options that help train your agent to provide the most helpful answers for your customers, such as the industry domain and the AI model to use.
When you finish configuring your agent, Lucidworks AI needs some time to perform the initial training that fully enables it.
While training is in progress, you can update your website code as explained in the final step below.
You can also preview and test your agent right inside Agent Studio.
Click the **Agents** tab, and then select the agent you want to preview or test. The Agent Details display. The **Agent Preview** section lets you test the agent to determine if the responses accurately reflect the information on your website.

**5. Embed the agent code on your site**
Now you're ready to embed the agent where your customers will see it.
Click **Get Agent Code** to get ready-to-use code snippets that you can copy and paste into your site code:
* Copy the `
```
**2. Customize the configuration**
Every site works a little differently. The Signals Beacon is flexible, so you can set it up in the way that fits your site best.
To get started, configure the Signals Beacon to collect these user insights:
> **Queries**
>
> When users search for products, they land on a search results page. They might use facets to narrow down what they see.
>
> Capture the user's search query and selected facets. Map the query and facet parameters from the URL to the `query` field in the Signals Beacon configuration.
>
> ```html URL theme={"dark"}
> https://example.com/search?q=USER_QUERY&fq=color:("red","pink")
> ```
>
> ```json Query Config highlight={22-30} theme={"dark"}
> {
> "attributes": {
> "idQueryParam": "pid",
> "numberTypeFields": [
> "price",
> "quantity",
> "revenue"
> ],
> "productPath": ".resultsItem"
> },
> "cartAdd": {
> "trigger": ".lw-cart-add-trigger"
> },
> "click": {},
> "fields": {
> "productId": ":scope .resultId @text",
> "title": ":scope .itemTitle @text"
> },
> "purchase": {
> "trigger": ".lw-purchase-trigger"
> },
> "query": {
> "facets": {
> "keyValueDelimiter": ":",
> "queryParams": "fq",
> "valueExtractorRegex": "/\\\"(.*)\\\"/",
> "valuesDelimiter": ","
> },
> "queryParam": "q"
> }
> }
> ```
> **Clicks**
>
> When users find a product they like, they click on it.
>
> Capture that interaction. Map the product ID from the HTML to the `click` and `fields` fields in the Signals Beacon configuration.
>
> > [!NOTE]
> >
> > The `click` field inherits values from the `fields` field. It’s recommended to use the `fields` field directly.
>
> ```html HTML highlight={3-4} theme={"dark"}
>
> ```
>
> ```json Click Config highlight={14-18} theme={"dark"}
> {
> "attributes": {
> "idQueryParam": "pid",
> "numberTypeFields": [
> "price",
> "quantity",
> "revenue"
> ],
> "productPath": ".resultsItem"
> },
> "cartAdd": {
> "trigger": ".lw-cart-add-trigger"
> },
> "click": {},
> "fields": {
> "productId": ":scope .resultId @text",
> "title": ":scope .itemTitle @text"
> },
> "purchase": {
> "trigger": ".lw-purchase-trigger"
> },
> "query": {
> "facets": {
> "keyValueDelimiter": ":",
> "queryParams": "fq",
> "valueExtractorRegex": "/\\\"(.*)\\\"/",
> "valuesDelimiter": ","
> },
> "queryParam": "q"
> }
> }
> ```
> **Cart adds**
>
> When users add a product to their shopping cart, that action shows strong interest and intent to buy.
>
> Capture this interaction by mapping the click from your HTML to the `cartAdd` field in the Signals Beacon configuration. Tracking this helps you understand what products matter most and where users may drop off before purchasing.
>
> ```html HTML highlight={7} theme={"dark"}
>
>
>
12345
>
Wireless Noise-Canceling Headphones
>
199.99
>
>
>
> ```
>
> ```json Cart Add Config highlight={11-13} theme={"dark"}
> {
> "attributes": {
> "idQueryParam": "pid",
> "numberTypeFields": [
> "price",
> "quantity",
> "revenue"
> ],
> "productPath": ".resultsItem"
> },
> "cartAdd": {
> "trigger": ".lw-cart-add-trigger"
> },
> "click": {},
> "fields": {
> "productId": ":scope .resultId @text",
> "title": ":scope .itemTitle @text"
> },
> "purchase": {
> "trigger": ".lw-purchase-trigger"
> },
> "query": {
> "facets": {
> "keyValueDelimiter": ":",
> "queryParams": "fq",
> "valueExtractorRegex": "/\\\"(.*)\\\"/",
> "valuesDelimiter": ","
> },
> "queryParam": "q"
> }
> }
> ```
> **Purchases**
>
> One of the most important actions that drives your business is a user purchase. When users complete the checkout process, it confirms their decision to buy.
>
> Make sure to capture this event. Map the relevant HTML to the purchase field in the Signals Beacon configuration.
>
> ```html HTML highlight={9} theme={"dark"}
>
>
>
12345
>
Wireless Noise-Canceling Headphones
>
1
>
199.99
>
199.99
>
>
>
> ```
>
> ```json Purchase Config highlight={19-21} theme={"dark"}
> {
> "attributes": {
> "idQueryParam": "pid",
> "numberTypeFields": [
> "price",
> "quantity",
> "revenue"
> ],
> "productPath": ".resultsItem"
> },
> "cartAdd": {
> "trigger": ".lw-cart-add-trigger"
> },
> "click": {},
> "fields": {
> "productId": ":scope .resultId @text",
> "title": ":scope .itemTitle @text"
> },
> "purchase": {
> "trigger": ".lw-purchase-trigger"
> },
> "query": {
> "facets": {
> "keyValueDelimiter": ":",
> "queryParams": "fq",
> "valueExtractorRegex": "/\\\"(.*)\\\"/",
> "valuesDelimiter": ","
> },
> "queryParam": "q"
> }
> }
> ```
**3. Turn it on**
When you're ready to start collecting user insights in Lucidworks Analytics using the Signals Beacon, activate it in the **Integrations** screen. Add your site to the list of **Allowed origins**.

Sites added to the allowed origins with the Signals Beacon installed start collecting user insights instantly.
Once added, the Signals Beacon starts sending user insights to Lucidworks Analytics. Your **Signals analytics** dashboard will begin to show key metrics.
# Signals
Source: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/overview
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/analytics/0le96f
[localhost link]: http://localhost:3000/docs/lw-platform/lw-analytics/signals/overview
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/overview
The signals features in Analytics Studio include the [signals beacon](/docs/lw-platform/lw-analytics/signals/signals-beacon), a lightweight script tag that gathers query (including selected facets), click, cart-add, and purchase complete signals from customer interactions on your website and the [Signals Store](/docs/lw-platform/lw-analytics/signals/signals-store) for the designated workspace where signals are stored.
Instead of using the signals beacon, you can manually configure and maintain code in your backend codebase by using the [Signals API](/docs/lw-platform/lw-analytics/signals/signals-api) to send signals to Analytics Studio. This method is useful if you need to send signals from your backend, rather than a website or frontend application, or if your website does not support JavaScript.
> [!TIP]
>
> Lucidworks adheres to strict data privacy and security policies, including General Data Protection Regulation (GDPR) compliance, when collecting and storing signals. Security features include user IP address anonymization, exclusion of personally-identifiable information, and secure storage. The policies also provide guidelines and best practices to help clients implement compliant configurations. To review the detailed policies, see [Lucidworks Signals Beacon Privacy and Security policies](/docs/policies/lw-signals-beacon) and [GDPR Compliance policy](/docs/policies/lw-signals-beacon-gdpr-compliance).
The following signals are collected:
* **Query signals.** When a user performs a search, a signal is recorded.
* **Click signals.** When a user clicks on a product, a signal is recorded. One example of a click signal is when a user clicks a search result, which is a strong indicator the result is relevant.
* **Cart-add signals.** When a user clicks to add an item to the cart, a signal is recorded.
* **Purchase complete signals.** When a user completes a purchase and is taken to the order confirmation page, a signal is recorded.
* **Facet usage.** When a user applies a facet, a new query signal is recorded that includes the selected facets.
If present in the signal, the information collected by the signals beacon and housed in the Signals Store for each signal is:
* Product ID
* Title
* Image URI
* Price
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Overview of signals process
This section provides an overview of how to implement the use of signals in Analytics Studio. More information is detailed in additional topics.
1. Analyze the queries, clicks, cart-adds, and purchases on your site to determine areas that could be strengthened to enhance your company’s goals.
2. Create the [Signals Store](/docs/lw-platform/lw-analytics/signals/signals-store) for the designated workspace. For example, you may have a testing workspace and a production workspace. The Signals Store for the testing workspace may contain data that would not be available in your production site.
3. Add the [signals beacon](/docs/lw-platform/lw-analytics/signals/signals-beacon) to the `` section of your site. This includes not only header information, but specific field identifiers for the signals based on your site analysis.
When the signals beacon is added, signals are:
* Gathered by the signals beacon
* Stored in the Signals Store
* Sent to [Analytics Studio metrics](/docs/lw-platform/lw-analytics/analytics-screen) that provide valuable customer behavior insights and can be used to improve your business
# Signal Usage Metrics
Source: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/signal-usage
The Signal Usage screen displays global signal usage metrics for a specified date range.
Here you can see the total volume of signals from all of your signals buckets, distinguished by signal type.
You can use this screen to confirm that signals are flowing into the system so that you can use them in Analytics Studio, Commerce Studio, or anywhere signals are displayed. This graph lets you identify issues with signal intake and take prompt action to adapt settings and configuration to prevent issues that might be caused by missing signals or incomplete data.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
Click your organization type for information about the benefits of using the Signal Usage screen:
**Business-to-Consumer**
These metrics reflect user behavior patterns that help you improve product offerings and campaigns that enhance the customer search experience and increase conversions. For example, a significant increase during a promotional campaign helps confirm the success of the event, and lets you adjust the campaign to increase conversions.
**Business-to-Business**
The Signal Usage screen helps your organization monitor data flow and identify ingestion and other issues quickly, which enhances the ability to maintain operational efficiency. For example, if a significant decrease in signals occurs, you can troubleshoot automated workflows and other areas to determine the cause.
**Knowledge Management**
Signal usage metrics provide information about relevance, ranking, and discoverability of site content. For example, a decrease in signals can indicate users may not be finding the information they need. A review of relevance settings and potential content gaps could help resolve any issues.
To access the Signal Usage screen, open the megamenu and click **Signals**, then click the **Signal Usage** tab.

Click **Get Started** below for a quick demo that shows you how to navigate to the Signal Usage screen and explore your signal data.
[Signal Usage Metrics in Lucidworks Platform](https://app.supademo.com/embed/cmhtppd9h2m6s11r6nccnepn1?embed_v=2\&utm_source=embed)
# Signals Beacon
Source: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/signals-beacon
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/analytics/k649vy
[localhost link]: http://localhost:3000/docs/lw-platform/lw-analytics/signals/signals-beacon
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/signals-beacon
The signals beacon is an embeddable tracker that captures signals corresponding to user actions, like searches and purchases.
Add the beacon script to your site's `` once. After that, you can manage what it captures entirely from Lucidworks Platform. No further code changes or deployments to your site are required.
At a high level, the tracking flow begins when a user visits the site and performs one or more searches. These searches generate query identifiers that associate user actions with specific queries. As the user interacts with search results and shows interest in a product, additional signals such as clicks and cart events are captured. If the user completes a purchase, the flow concludes with a purchase signal. Each purchased product is linked to the query that led to its cart-add. This process enables end-to-end tracking of user behavior from search to purchase.
In this scenario, the signals beacon uses several primary tracking mechanisms:
* **Visitor ID**: A randomly generated identifier stored in local browser storage. It is unique to both the visitor and the device. It persists across sessions.
* **Session ID**: A randomly generated identifier that the beacon uses to track and assign signals to sessions. It is stored in local browser storage under the `lwBeaconSessionId` key. It expires after 30 minutes of inactivity. This duration is configurable using `sessionTimeoutThreshold`. Each signal resets the inactivity timer, and the session ID persists across tabs and page reloads. When the user returns after the session expires, a new session ID is generated, but the visitor ID remains the same.
* **Query ID**: A randomly generated identifier created when a search query is submitted. It is stored in session storage and is included with signal events related to that query, such as clicks and cart-adds.
* **Cart ID**: A unique identifier created when a product is added to the cart. It's shared by every cart-add signal and the purchase signal for that cart. Together with product IDs, it links each purchased product to the query that led to its cart-add. After a purchase, a new cart ID is generated to track subsequent transactions independently.
The signal event flow below outlines a simplified sequence of common events. Additional signal types and behaviors are not included in this summary:
1. When a user visits the site, a visitor ID and session ID are generated.
2. When a query is submitted, a query ID is generated and a query signal is sent. This signal includes the visitor ID and session ID.
3. For each new query, a new query ID is generated and another query signal is sent.
4. When the user clicks on a product, a click signal is sent. This signal includes the associated query ID.
5. When the user adds a product to their cart, a cart-add signal is sent with the current query ID and cart ID. If there's no cart ID yet, one is generated.
6. When the user completes a purchase and lands on the order confirmation page, a purchase signal is sent. This signal includes the order ID and the current cart ID. The purchase signal doesn't include a query ID. Each purchased product is traced to its query through the cart ID and product ID. After the signal is sent, the cart ID is replaced with a new one to track future transactions independently.
See the following image for a visual representation of this flow:

> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## How it works
The beacon sends signals to the:
* [Signals store](/docs/lw-platform/lw-analytics/signals/signals-store) for storage and aggregation
* [Analytics Studio service](/docs/lw-platform/lw-analytics/overview), which provides insights about actions taken by users on your site
The following signals are collected:
* **Query signals.** When a user performs a search, a signal is recorded.
* **Click signals.** When a user clicks on a product, a signal is recorded. One example of a click signal is when a user clicks a search result, which is a strong indicator the result is relevant.
* **Cart-add signals.** When a user clicks to add an item to the cart, a signal is recorded.
* **Purchase complete signals.** When a user completes a purchase and is taken to the order confirmation page, a signal is recorded.
* **Facet usage.** When a user applies a facet, a new query signal is recorded that includes the selected facets.
For information about how the signals beacon is related to other signals and analytics functions, see the [Overview of signals process](/docs/lw-platform/lw-analytics/signals/overview).
## Prerequisites
You must be a workspace owner to configure the signals beacon.
Before you begin, complete the following tasks:
* Analyze your site to confirm compatibility with the signals beacon.
The signals beacon is compatible with most websites, but you may need to adjust the configuration to ensure it works as needed.
* Your site should use URL query parameters (`?q=foo`), not other methods of sending the query parameters. If it is not an option to use query parameters on your site, you can use the [Signals API](/docs/lw-platform/lw-analytics/signals/signals-api) to send signals.
- These fields should be surfaced in the page source, either as attributes or text nodes:
* Product ID
* Product title
* Product image URL
* Product price
* Product URL
* Identify any other fields that you want the signals beacon to capture.
You’ll need their CSS paths to configure the beacon.
Again, these can be either attributes or text nodes, as in these examples:
```html theme={"dark"}
12345
```
\[!TIP] A field’s path might be different on different pages of your site.
The signals beacon supports multiple paths per field to accommodate this.
* Create the [Signals Store](/docs/lw-platform/lw-analytics/signals/signals-store) where the signals will be stored.
## Enable the beacon
To install the beacon, navigate to the megamenu and click **Signals**.
1. Click the Signals Store where you want to configure the signals beacon and then click **Integrations**.
2. If the beacon has never been configured for this app, you’ll see "No embed token found" on the Signals Using Beacon screen.
In that case, click the **Generate** button.
It can take a few moments to generate the token.
3. In the **Allowed Origins** field, enter the domains where you want to use the signals beacon. The format is `://[:]`. For example, `https://domain.YOUR_COMPANY_NAME.com`.
4. Set the **Signals Beacon** toggle to **On**.
5. Click **Copy** to copy the script and insert that script into the `` tag of your website’s HTML file.
\[!TIP] This also enables the `window.logBeaconInfo()` function which you can use with your browser’s developer tools to inspect the fields captured by the beacon so that you can validate and refine your configuration.
See [Development and troubleshooting](#development-and-troubleshooting) below.
6. Edit the JSON configuration to process the signals you need for analytics.
For more details, see:
* [Example JSON configuration](#example-json-configuration)
* [Example signals script](#example-signals-script)
* [Field path configuration](#field-path-configuration)
* [Beacon Configuration Interface](/docs/lw-platform/lw-analytics/signals/beacon-configuration-interface) for detailed configuration property information
7. Click **Apply**. The configuration is applied to your website and it begins to send signals instantly based on that configuration.
> [!NOTE]
>
> You can edit the configuration at any time. When you edit the JSON configuration and click **Apply**, the changes are applied in real time and signals are sent and processed using that configuration until it is modified.
After the script is implemented and the signals are sent, you can access consolidated metrics.
The [Analytics Studio metrics](/docs/lw-platform/lw-analytics/analytics-screen) provide valuable customer behavior insights, which can be used to improve your business.
### Example JSON configuration
Use the following structure as an example to configure the beacon.
```json lines expandable wrap highlight={13,16,21,27,30-31} JSON configuration theme={"dark"}
{
"attributes": {
"productPath": ".lw-product-item",
"sessionTimeoutThreshold": 600000,
"cartId": "lwRetailCartId",
"idQueryParam": "pid",
"numberTypeFields": ["price", "quantity", "revenue"]
},
"fields": {
"productId": ":scope @id",
"imageuri": ":scope img @src",
"price": ":scope .search-entity-price span @text",
"title": ":scope .search-entity-title @text, :scope .search-generic-title @text",
"uri": ".config-url @href"
},
"query": {
"queryParam": "q",
"delayForTrackQueryUpdate": 1000
},
"click": {},
"cartAdd": {
"trigger": ".lw-cart-add-trigger"
},
"purchase": {
"enabled": false
},
"purchase_complete": {
"urlPattern": "/order-confirmation",
"orderIdUrlParam": "orderId",
"productPath": ".lw-order-item"
}
}
```
* **Line 13**. You can use multiple comma-separated paths in cases where a field has different paths on different pages of your site. See the [Field path configuration](#field-path-configuration) section for details and examples.
* **Line 16.** Everything below this line is your signal configuration, where you list the signals you want to track and the fields you want to extract from them.
* **Line 21.** By default, these attributes inherit from the top-level attributes `[productPath|fields]`.
* **Line 27.** Turns off the `purchase` signal, which is sent when the user clicks a checkout element. Because an order can fail after that click, use `purchase_complete` instead.
* **Lines 30–31.** Sends a purchase signal when the user lands on a page whose URL contains `/order-confirmation`. The order ID is read from the `orderId` URL query parameter.
* **Revenue.** This example doesn't set `revenue`, so the beacon calculates it from each product's price and quantity. If you set `purchase_complete.revenue`, use the item subtotal, not the order total. Revenue shouldn't include tax, shipping, or other fees.
For information about:
* Attributes and fields used to extract product details from page elements, see the [Field path configuration](#field-path-configuration) section.
* The BeaconConfig interface, which includes detailed information about configuration properties, types, and default values, see [Beacon configuration interface](/docs/lw-platform/lw-analytics/signals/beacon-configuration-interface).
### Example signals script
The following example contains possible fields and default values.
```json lines wrap expandable highlight={2-5,7-8,14-15,17,34,44,47-50} Signals script theme={"dark"}
{
"attributes": {
"productPath": ".lw-product-item",
"cartId": "lwRetailCartId",
"numberTypeFields": ["price", "quantity", "revenue"]
},
"fields": {
"productId": ":scope @id",
"title": ".title @text",
"imageuri": ".config-image @src",
"uri": ".url-wrapper a @href"
},
"query": {
"queryParam": "query",
"delayForTrackQueryUpdate": 1000,
"productPath": ".lw-product-item",
"fields": {
"productId": ":scope @id",
"title": ".title @text",
"imageuri": ".config-image @src",
"uri": ".url-wrapper a @href"
}
},
"click": {
"productPath": ".lw-product-item",
"fields": {
"productId": ":scope @id",
"title": ".title @text",
"imageuri": ".config-image @src",
"uri": ".url-wrapper a @href"
}
},
"cartAdd": {
"trigger": ".lw-cart-add-trigger",
"productPath": ".lw-product-item",
"fields": {
"productId": ":scope @id",
"title": ".title @text",
"imageuri": ".config-image @src",
"uri": ".url-wrapper a @href"
}
},
"purchase": {
"enabled": false
},
"purchase_complete": {
"urlPattern": "/order-confirmation",
"orderIdUrlParam": "orderId",
"delayForPurchaseRedirect": 1000,
"productPath": ".lw-order-item",
"fields": {
"productId": ":scope @data-item-id",
"title": ".title @text",
"price": ".price @text",
"quantity": ".quantity @text"
}
}
}
```
* **Line 2**. Global attributes inherited by each signal section.
* **Line 3**. The CSS selector to target product elements. This is the global path inherited by each signal section if no custom path is provided at `[query/click/cartAdd/purchase/purchase_complete].productPath`. The default is `.lw-product-item`.
* **Line 4**. The local storage key for the consumer page storing the cart UUID. The `cartId` value defaults to `lwRetailCartId`. The beacon obtains the value from `localStorage.lwRetailCartId` when attaching cart info to `/retail/signals/cartadd ` and `/retail/signals/purchase`.
* **Line 5**. This list specifies the fields treated as number type fields. The default is `["price", "quantity", "revenue"]`.
* **Line 7**. This is the main section to extract product field value from your site. For more information, see the [Field path configuration](#field-path-configuration) section in this topic, which provides detailed configuration about extracting product information to ensure accurate and consistent data collection.
* **Line 8**. The `productId` field with a value of `:scope @id` is the only required field to use the Lucidworks Retail Beacon API.
* **Line 14**. Specifies the URL parameter the beacon uses to monitor query updates. For example, with the default param `query`, if the current product page is filtered with the keyword `hat`, the URL parameter is http\://example.com?query=hat. The default value is `query`.
* **Line 15**. Specifies the delay, in milliseconds, for tracking element updates in the query. The default value is `1000`.
* **Line 17**. Custom overwrite of the fields configuration at the root level.
* **Line 34**. The CSS selector that targets page elements for triggering add-to-cart actions. This has full CSS support for targeting multiple elements with comma-separated selectors. For example, `button.add-to-bag, #AddToBagWithPrice`.
* **Line 44**. Turns off the `purchase` signal, which is sent when the user clicks a checkout element. Because an order can fail after that click, use `purchase_complete` to track completed purchases.
* **Line 47**. The beacon sends a purchase signal when the current URL contains this substring. Use a stable part of your order confirmation page URL.
* **Line 48**. The URL query parameter that contains the order ID. Alternatively, use `orderIdSelector` to read the order ID from a page element.
* **Line 49**. The delay, in milliseconds, before the beacon reads the confirmation page. Increase this value if your site adds order details to the page after it loads. The default value is `1000`.
* **Line 50**. The CSS selector for the purchased items on the confirmation page. If your confirmation page doesn't display purchased items, use a [signal handler](#example-of-a-purchase-complete-signal-from-a-data-layer) to add them.
### Field path configuration
The signals beacon extracts product details from page elements using CSS selectors and attributes.
You can capture any field that’s surfaced in the page’s DOM by adding it to your JSON configuration, under `"fields"`.
This section shows you how to configure your field paths, with examples.
The format is: `[Element CSS Selector] @[Value Attribute]`, as in the example below:
```json Configuration theme={"dark"}
"url": ".details .url @href"
```
```html HTML structure theme={"dark"}
...
```
```bash Data extracted theme={"dark"}
http://example.com/prd-123
```
### Special selectors
These special selectors and attributes are available:
* The `@text` pseudo-attribute captures the inner text node, as in these examples:
```json Configuration theme={"dark"}
"title": ".title @text"
```
```html HTML structure theme={"dark"}
Fancy Hat
```
```bash Data extracted theme={"dark"}
Fancy Hat
```
```json Configuration theme={"dark"}
"price": ".details .price @text"
```
```html HTML structure theme={"dark"}
...
```
```bash Data extracted theme={"dark"}
100
```
* The `:scope` CSS class targets product details defined on the root `productPath` element, as in this example:
```json Configuration theme={"dark"}
{
"attributes": {
"productPath": ".main-page-product",
},
"fields": {
"productId": ":scope @sku",
...
}
}
```
```html HTML structure theme={"dark"}
```
```bash Data extracted theme={"dark"}
prd-123
```
* The `textContent` selector targets elements by their text, as follows:
* Exact match: `[textContent='Add to cart!']`
* Contains: `[textContent*='cart']`
* Starts with: `[textContent^='add']`
* Ends with: `[textContent$='cart!']`
For example:
```json theme={"dark"}
"trigger": "button[textContent='Add to Cart'], .add-to-cart-container button"
```
* You can also use data attributes as selectors, as in this example where `data-testid` is a data attribute:
```json theme={"dark"}
"trigger": ".headerSearchBox, #hdrSrch, input[data-testid=global-search]"
```
### Page type configuration
The `pageTypes` configuration enables you to classify queries by page type based on URL patterns.
**Configuration:**
```json theme={"dark"}
"pageTypes": {
"search": ["*/search*"],
"category": ["*/category/*"],
"product": ["*/product/*"]
}
```
**Type:** `{ [pageType: string]: string[] }`
A mapping of page types to their corresponding URL patterns.
The `pageTypes` configuration enables annotation of query signals via an optional `pageType` property. By default, when no `pageType` is specified, query signals are treated as originating from the search page.
When a `pageType` is provided, its value is used for page-type matching. If a query does not match any configured patterns, its `pageType` is set to "OTHER".
Queries with a `pageType` other than null or "SEARCH" are excluded from the null query report. This is particularly useful for scenarios where queries originate from or redirect to non-search pages (e.g., category pages).
> [!NOTE]
>
> Explicitly configuring the "search" page type is recommended. Doing so ensures that any query signals from URLs that don't match a configured pattern are classified as "OTHER" and excluded from the null query report.
## Configure the beacon with Agent Studio or UI Studio
To use the signals beacon on the same page as Agent Studio or UI Studio, configure the beacon script with additional attributes.
Agent Studio and UI Studio both use the `` web component, which requires specific beacon configuration to work correctly.
For embedding details, select your agent type in [Configure and deploy an agent](/docs/lw-platform/lw-agent-studio/overview#configure-and-deploy-an-agent).
Add the following attributes to the beacon script that you downloaded at **Analytics Studio** > **Integrations**:
* `signal-store-api-url`: API URL for your signals store.
* `signal-store-embed-token`: Embed token for the signals store.
* `beacon="{}"`: Initializes the beacon configuration.
* `initiator="AS"`: Identifies the script as being used with Agent Studio or UI Studio.
The following example shows the beacon script configured with those additional attributes:
```html {6-9} theme={"dark"}
```
Without these attributes, the beacon and `lw-template` components may conflict and fail to initialize.
## Configure the beacon for multiple pages of search results
You can configure the signals beacon if your site separates query results by tabs. For example, one tab for content and another tab for product information.
In the following example, each tab’s content path is separated by a comma under `"productPath"` with the `"fields"` property defining what is tracked for each tab using `:scope`.
```json Configuration theme={"dark"}
{
"attributes": {
"numberTypeFields": [
"price",
"quantity",
"revenue"
],
"productPath": ".cmp-content-search-result-list-item, .cmp-productlist__item"
},
"click": {
"trigger": "a, a h3, .button"
},
"fields": {
"imageuri": ":scope .cmp-content-search-result-list-item__img @src, :scope img @src",
"productId": ":scope .cmp-content-search-result-list-item_link @href, :scope .cmp-text .anchor @text",
"title": ":scope .cmp-content-search-result-list-item__details-name @text, :scope .cmp-text p @text",
"uri": ":scope .cmp-content-search-result-list-item_link @href"
},
"query": {
"queryParam": "search_query"
}
}
```
## Programmatic hooks
Signal handlers modify, enhance, or suppress signals before the beacon sends them.
Use a handler when the data you need isn't in the page's Document Object Model (DOM) but is available elsewhere, such as facets stored outside the URL or order details stored in your site's data layer.
You can define a handler for each signal type: `query`, `click`, `cartAdd`, `purchase`, and `purchase_complete`.
There are two ways to register a handler:
* **In the beacon configuration.** Add a `handler` property to the signal section. The value is a function written as a string. The function receives an object with `window` and `payload` properties.
* **In your site's code.** Call `window.addBeaconListener` after the beacon loads. The callback receives the signal payload. You can register one handler for each signal type, and you only need to register it once.
If a signal type has a handler in both places, the handler in the beacon configuration is used.
### Signal handler behavior
The signal handler can be used for the following:
* **Modify signals:** return the modified payload object to send an enhanced signal.
* **Suppress signals:** return false to prevent the signal from being sent.
* **Error handling**: if a runtime error occurs in the callback function, the original unmodified signal will be sent.
If the signal handler returns `undefined` or `null`, the unmodified signal will be sent.
> [!WARNING]
>
> Signal handlers run synchronously and must return their result immediately.
> Don't use `async` functions or return a `Promise`, because the beacon doesn't wait for it to resolve.
The arguments to the `window.addBeaconListener` function should include these:
1. The signal type.
2. Callback function with one argument (signal payload).
### Examples of signal payload enhancement
Enhancing a `click` payload:
```js theme={"dark"}
window.addBeaconListener('click', (payload) => {
// Modify the payload as needed
payload.productDetails[0].product.productId = '123';
// Return the modified payload to send the signal
return payload;
});
```
Example of a `query` payload:
```js theme={"dark"}
window.addBeaconListener('query', (payload) => {
// Modify the payload as needed
payload.selected_facets = [
{
name: 'color',
values: ['blue', 'white'],
},
];
// Return the modified payload to send the signal
return payload;
});
```
### Example of conditional signal suppression
```js theme={"dark"}
window.addBeaconListener('query', (payload) => {
// Do not send query signals that contain a blocked search term
if (payload.searchTerms === 'blocked query') {
return false;
}
});
```
### Example of a purchase complete signal from a data layer
Order confirmation pages often don't display product details in a way the beacon can extract.
If your site stores order details in a JavaScript data layer, use a `purchase_complete` handler to build the signal from that data.
This example assumes your site pushes an event like the following to `window.dataLayer` when the confirmation page loads.
Adjust the property names in the handler to match your site's data layer.
```js Data layer event theme={"dark"}
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'ORD-12345',
currency: 'USD',
items: [
{ item_id: 'SKU-1001', item_name: 'Fancy Hat', price: 49.99, quantity: 2 },
{ item_id: 'SKU-2002', item_name: 'Wool Scarf', price: 29.99, quantity: 1 }
]
}
});
```
Add the handler to the `purchase_complete` section of your beacon configuration, or register it in your site's code:
```json Beacon configuration theme={"dark"}
"purchase": {
"enabled": false
},
"purchase_complete": {
"urlPattern": "/order-confirmation",
"delayForPurchaseRedirect": 2000,
"handler": "function({ window, payload }) { const event = (window.dataLayer || []).find(e => e.event === 'purchase' && e.ecommerce); if (!event) return false; const order = event.ecommerce; const productDetails = (order.items || []).map(item => ({ product: { productId: String(item.item_id), title: item.item_name, price: Number(item.price) }, quantity: Number(item.quantity) || 1 })); const revenue = productDetails.reduce((sum, p) => sum + p.product.price * p.quantity, 0); return { ...payload, orderId: String(order.transaction_id), productDetails, revenue }; }"
}
```
```js Site code theme={"dark"}
window.addBeaconListener('purchase_complete', (payload) => {
const event = (window.dataLayer || []).find((e) => e.event === 'purchase' && e.ecommerce);
// Suppress the signal if the order details aren't available
if (!event) return false;
const order = event.ecommerce;
const productDetails = (order.items || []).map((item) => ({
product: {
productId: String(item.item_id),
title: item.item_name,
price: Number(item.price),
},
quantity: Number(item.quantity) || 1,
}));
// Calculate revenue from line items so it excludes tax, shipping, and fees
const revenue = productDetails.reduce((sum, p) => sum + p.product.price * p.quantity, 0);
return {
...payload,
orderId: String(order.transaction_id),
productDetails,
revenue,
};
});
```
When you build a purchase signal with a handler, keep the following in mind:
* **The signal must include products.** The beacon doesn't send a purchase signal with an empty `productDetails` list.
* **Product IDs must match your other signals.** Use the same product ID format as your click and cart-add signals, including prefixes and leading zeros. If the formats differ, Analytics Studio can't connect purchases to earlier signals, and conversion metrics are inaccurate. Normalize the IDs in the handler if needed.
* **Use the item subtotal for revenue.** Order-level metrics, such as average order value and revenue per visit, use the `revenue` value. Exclude tax, shipping, and other fees so these metrics reflect the value of the purchased items. Product-level reports use each product's `price` and `quantity` instead.
* **Allow time for the data layer.** The beacon waits for `delayForPurchaseRedirect` milliseconds before it runs the handler. If your site adds order details to the data layer after the page loads, increase this value. A longer delay increases the chance that the user leaves the page before the signal is sent.
## Content Security Policy (CSP) requirements
If your site uses a Content Security Policy (CSP), you must add the following directives to allow the signals beacon to load and send data:
* **`script-src`**: Add `https://storage.googleapis.com` because the beacon script is served from Google Cloud Storage.
* **`connect-src`**: Add the Signal Store API host and, if using Agent Studio, the App Studio API host.
The following example shows the minimum required CSP directives:
```http theme={"dark"}
Content-Security-Policy:
script-src 'self' https://storage.googleapis.com;
connect-src 'self' YOUR_SIGNAL_STORE_API_URL YOUR_APP_STUDIO_API_URL;
```
Replace `YOUR_SIGNAL_STORE_API_URL` with the value in the `signal-store-api-url` attribute of your beacon script, and `YOUR_APP_STUDIO_API_URL` with the value in the `app-studio-api-url` attribute when using Agent Studio.
## Development and troubleshooting
The signals beacon includes the built-in `window.logBeaconInfo()` debugging utility that logs verbose information if the debug flag is enabled.
To enable the debug flag in your local storage, set `localStorage.enableBeaconDev = true`.
# Signals Store
Source: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/signals-store
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/analytics/88pjp2
[localhost link]: http://localhost:3000/docs/lw-platform/lw-analytics/signals/signals-store
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-analytics/signals/signals-store
The Signals Store is the repository in your Lucidworks Platform workspace that holds query, click, cart-add, and purchase complete signals gathered from customer interactions on your site.
Facet usage is recorded in query signals.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Create a Signal Store
One of the tasks to use signals is to create a repository to store signals.
1. Navigate to the megamenu and click **Signals**.

2. Click **Create New**.

3. In the **Name** field, enter a unique user-defined for the Signals Store.
4. In the **Region** field, select the geographical area for the Signals Store.
> [!NOTE]
>
> This selection cannot be changed. If you need a Signals Store in a different region, you need to create another Signals Store with the other region specified.
5. Click **Create**. After the Signals Store is created, you can configure the [signals beacon](/docs/lw-platform/lw-analytics/signals/signals-beacon).
## Signal fields stored
If present in the signal, the information collected by the signals beacon and housed in the Signals Store for each signal is:
* Product ID
* Title
* Image URI
* Price
## Technical components
The properties of each Signals Store include:
* User-defined name.
* Universally unique identifier (`uuid`) of the Signals Store.
The `uuid` will be use to generate a unique Signals Store endpoint using the format of `.signals.lucidworks.com`.
For more information about signals, see [signals](/docs/lw-platform/lw-analytics/signals/overview).
# Core Settings
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/overview
[localhost link]: http://localhost:3000/docs/lw-platform/lw-core/overview
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-core/overview
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/core/fz448o
Core Settings empowers you to build fast, intuitive, and configurable search experiences without the need for complex coding or infrastructure.
With Core Settings, you can define and optimize the search experience with just a few clicks.

Each Site comes equipped with essential services to drive intelligent, responsive search, using an interactive UI for setup and tuning.
Use the preset defaults to quickly get your search experience up and running.
For customization, Core Settings offers controls to adjust performance and relevance.
The built-in development environment view gives full visibility into how changes impact search results before going live, so you can test and launch with confidence.
To get started, reach out to Lucidworks to request a new site, and we’ll create it for you.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Use cases
Core Settings enable tailored search experiences for specific audiences across multiple websites.
A multinational ecommerce company can configure search to localize currency, language, and product availability based on regional shipping permissions.
Another example is when you have different ecommerce and support websites.
The ecommerce website can be set up to search the catalog and datasheets, with an embedded product-finding agent.
The support website can be set up to search the knowledge base and include an embedded troubleshooting agent.
Sites with multiple query profiles can manage different search configurations for Relevance and Boost settings.
Each query profile represents a distinct search experience with its own query pipeline and collection.
# Quickstart
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/quickstart
Build intuitive and configurable searches in 3 steps.
[localhost link]: http://localhost:3000/docs/lw-platform/lw-core/quickstart
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-core/quickstart
This quickstart guide helps you set up and optimize your customer's search and browse experience to return the most relevant content for their queries.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
Core settings default values are set based on informed industry standards when you first launch the application. From there, you can tune and evaluate your configuration to best fit your users.
> [!NOTE]
>
> It is essential that you consistently review results and settings in Commerce Studio and Analytics Studio and modify the Core Settings fields to optimize search results for your customers.
**1. Refine relevance in search results**
Use Neural Hybrid Search (NHS) to take advantage of advanced searching capabilities that combine lexical (Lexical search matches queries to documents based on exact words and character patterns.) search and semantic (Semantic search interprets the meaning of queries to find contextually relevant results, even without exact word matches.) search.

> **Balance between lexical and semantic search**
>
> Click and drag the Neural Hybrid Search Weight slider to set the level of lexical versus semantic search. User behavior and record types will impact the weight setting.
>
> To weight exact word entries higher, drag the slider toward **Lexical**. If your products use specific names, SKUs, or other fields such as model number, lexical search is more likely to generate the most relevant results. Lexical search is also more effective for identifying detailed information in specifications and other documents.
>
> To weight results that interpret the meaning of the query, drag the slider more toward **Semantic**. Semantic search is more helpful if your users tend to enter different terminology for products or enter phrases or complete questions in their queries.
>
> To determine the effectiveness of this setting, enter multiple searches and review where the query entry displays in the results. You can drag the slider in either direction and test again to determine the optimal setting.
> **Control the quality and number of records returned**
>
> Two settings determine the number of records returned:
>
> * **Vector Similarity Threshold**: This threshold sets the minimum of how closely a document must match your query's meaning to be included in results. Enter a decimal value between `0` and `1`.
>
> > [!NOTE]
> >
> > If you enter a value higher than `1`, an error displays and a rounded down value of `1` defaults in the field. If you enter a negative value less than `0`, an error displays and a rounded up value of `0` defaults in the field.
>
> * A higher minimum value returns only results that strongly match the query's meaning. Assessing the quality of possible matches to return strong results may increase latency (processing response time).
>
> * A lower minimum value returns more results because results do not have to match the query's meaning as closely.
>
> * Results that are not semantically close enough to the query's meaning are filtered out before results are re-ranked.
> * **Vector Result Count**: This value specifies how many candidate results the vector (semantic) search retrieves before the results are merged and re-ranked with the lexical results. Enter an integer between `0` and `2000`.
>
> > [!NOTE]
> >
> > If you enter a value higher than `2000`, an error displays and a rounded down value of `2000` defaults in the field. If you enter a negative value less than `0`, an error displays and a rounded up value of `0` defaults in the field.
>
> * A higher value assesses more semantic candidate results, which improves relevant results, but may increase latency (processing response time).
>
> * A lower value assesses fewer semantic candidate results, which may decrease relevant results, but also takes less processing time.
>
> > [!NOTE]
> >
> > These fields map to the `Min Return Vector Similarity` and `Number of Vector Results` fields in the Neural Hybrid Query stage settings in Fusion and Lucidworks Search.
>
> For guidance about choosing starting values and tuning these settings for your use case, see the [Neural Hybrid Search section of the Relevance topic](/docs/lw-platform/lw-core/sites-relevance#neural-hybrid-search).
> [!NOTE]
>
> The [rules](/docs/lw-platform/lw-cs/cstudio-rules) and [query rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite) created in [Commerce Studio](/docs/lw-platform/lw-cs/overview) determine which results display. If results are not as expected, Lucidworks recommends you review and modify the rules and rewrites in Commerce Studio and then adjust the slider.
Use the Sort options to display the search results ordered either by relevance (Sort by relevance if the results need to match the query and user intent most closely.) or date (Sort by date if recent results such as the latest regulations or product updates are more important.). For more information, see [Relevance](/docs/lw-platform/lw-core/sites-relevance).

**2. Configure boost parameters**
These options let you balance the order in which specific results display. You can adjust the display order of products and information by popularity (The popularity boost provides consistent results for user queries about more stable and long-term products and information.) or recency (The recency boost is more important if newer versions of products or more recent technical or compliance specifications are essential.). For more information, see [Boost](/docs/lw-platform/lw-core/sites-boost).
> **Balance between popularity and recency**
>
> Click and drag the Popularity Boost slider to boost real-time user information from signals. If your products and information are more stable and long-term, the popularity boost provides consistent results for user queries.
>
> Click and drag the Recency Boost slider if you want to boost recently added or recently modified items or information. For example, if newer versions of products or more recent technical or compliance specifications are essential, the recency boost is more important.

You can prioritize certain fields such as SKU or title, if you assign and include them in the Attribute Priority section.
Preview the results to determine if the popular versus recent items display as expected, and make changes as needed. Reviewing results and then changing as needed is an ongoing process to obtain optimal results.

**3. Review analytics and update Core Settings**
Lucidworks recommends that you consistently assess your site's analytics and determine where metrics could be improved. [Analytics Studio](/docs/lw-platform/lw-analytics/analytics-screen#types-of-metrics) provides signals graphic overviews for multiple metrics.
Important measures such as conversion rate, search conversion rate, and click-through rate help you determine the success of campaigns and other actions. And underperforming products and zero result search rate identify items that may need attention.
Modify the Core Settings fields and Commerce Studio features as needed to improve the search experiences of your customers and enhance your company's strategic goals.
On an ongoing basis, consistently review analytics and change the settings as needed.
# Boost
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-boost
Core Settings
[localhost link]: http://localhost:3000/docs/lw-platform/lw-core/sites-boost
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-boost
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/core/mcmjd1
Boosting improves the visibility of items in search results. You can control how items are boosted based on their popularity or newness, plus how specific fields in your data affect boosting.

> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Query profiles
When your site has multiple query profiles, you can select which profile you want to configure using the query profile selector at the top of the Boost page:

Query profiles enable you to manage multiple search experiences within a single site.
Each query profile represents a distinct search configuration, including a query pipeline and collection.
> [!NOTE]
>
> The query profile selector only appears when your site has multiple query profiles configured.
> If you have a single query profile, the selector is hidden and all settings apply to that profile automatically.
You can create and manage query profiles in [Lucidworks Search](/docs/lucidworks-search/05-move-data-out/query-profile/overview) or [self-hosted Fusion](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/query-profiles), or by contacting Lucidworks.
> [!WARNING]
>
> If two query profiles point to the same query pipeline, changes made to one query profile's Core Settings will impact the other.
## Popularity Boost
Increase search result ranking using signals obtained from users, such as how many users clicked on an item, added it to their cart, or purchased it.
Using signals requires adding the [signals beacon](/docs/lw-platform/lw-analytics/signals/signals-beacon) to a website or using the [Signals API](/docs/lw-platform/lw-analytics/signals/signals-api) to send signals without the beacon.
Adding signals gives you a deeper understanding of user behavior and is useful when deciding how to configure and rank your search results.
Popularity Boost uses a discrete slider where you set the degree of how much you want the combined behavior of users to impact the search results.
The discrete slider has five settings that range from no boost to full boost.

When you increase how much to boost with signals, you give more weight to those signals when ranking search results.
More weight means items that users have interacted with more frequently appear higher.
This can improve crowd-based relevance, show trending products, and increase conversion rates.
There are, however, potential risks of setting the weight too high.
For example, products with lower visibility may be pushed down even further.
Giving a higher weight to signals can also decrease the impact of curated business rules if not balanced.
A best practice is to start with moderate boosting, then evaluate the impact and adjust as needed.
This protects important or promoted content you set using business rules or manual boosting.
## Recency Boost
You can increase search result ranking based on whether a document was recently added or modified.
There are cases when you want a newer item or page to be prioritized above older content as the more recently updated items are often what users are interested in.

The Recency Boost slider is where you set the degree of how important it is to show the newest content higher in the search results.
A best practice is to start with the moderate setting, then test and tune the weight as needed.
If the slider is set too high, you run the risk of surfacing less relevant but recent content over older, more helpful items.
If the slider is set too low, users looking for newer content might take longer to find it, causing frustration with outdated or irrelevant top results.
## Attribute Priority
You can decide if individual fields should be given priority for user queries.
Search attributes can be included or excluded using the dropdown options.

To see how these fields affect search results, include or exclude the fields relevant to your data and run some queries to analyze their impact.
The fields can also be arranged to assign their importance, so the field at the top of the list is given a greater significance than lower fields.
Matches on the higher fields are boosted more than matches on the lower ones, and matches on excluded fields don’t affect boosting at all.
This is useful when you want to prioritize queries that match the title of an item versus items that have similar words in their descriptions.
For example, a query for "handles" would show door handles higher than a cleaning product whose description says it "handles tough stains."
# Relevance
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-relevance
Core Settings
[localhost link]: http://localhost:3000/docs/lw-platform/lw-core/sites-relevance
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-relevance
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/core/juqsws
Relevance optimizes how well the search results match the user’s intent and query.
Increasing relevance means happier users through better findability of products and documents.
Relevant search results are important for:
* E-commerce sites, where relevant results drive conversions and revenue.
* Support sections of sites, such as help pages, where relevance reduces customer frustration and complaints.
* Enterprise search, where relevance boosts productivity and knowledge discovery by helping employees find what they need to perform their work or solve a problem.

> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Query profiles
When your site has multiple query profiles, you can select which profile you want to configure using the query profile selector at the top of the Relevance page:

Query profiles enable you to manage multiple search experiences within a single site.
Each query profile represents a distinct search configuration, including a query pipeline and collection.
> [!NOTE]
>
> The query profile selector only appears when your site has multiple query profiles configured.
> If you have a single query profile, the selector is hidden and all settings apply to that profile automatically.
You can create and manage query profiles in [Lucidworks Search](/docs/lucidworks-search/05-move-data-out/query-profile/overview) or [self-hosted Fusion](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/query-profiles), or by contacting Lucidworks.
> [!WARNING]
>
> If two query profiles point to the same query pipeline, changes made to one query profile's Core Settings will impact the other.
## Neural Hybrid Search
Lucidworks Core Settings includes the option of using Neural Hybrid Search (NHS) to take advantage of advanced searching capabilities that combine lexical search and semantic search, enabling exact and partial keyword matching, phrase detection, and search results that understand the natural language users might enter in the search box. To improve the relevance of results, you can also set values to assess how closely results match and number of results returned.

> **Weight balance between lexical and semantic search**
>
> Use the **Weight** slider to decide the relative importance of lexical (Lexical search is the basic type of search that uses exact matching of keywords to return results.
> It is useful for situations where the results are simple and predictable, or when a keyword always returns what the user is trying to find. Lexical search can be a good solution for smaller datasets that are well-organized but struggles when the wording of the query is not exact or with common keywords.) and semantic (Semantic search understands the meaning behind the words used in a query and can compare the relationship of the query to the conceptual representation of items in a dataset to return more relevant results. With semantic search, exact keyword matches are not needed, giving the user more freedom in how they word their searches. An additional benefit of semantic search is the ability to return related results, even if those results do not include the keyword entered by the user.) search for your search results. As you increase the weighting of one type of search, the weight of the other type of search decreases.
>
> Depending on the type of content you have, you can adjust the slider to accommodate the information you want the user to see.
>
> For example, a legal, medical, or financial website might have industry-specific words that benefit from a more lexical approach, while an e-commerce website might want to show users similar products and will benefit from giving a greater weighting to semantic search.
>
> NHS uses both of these to optimize the search experience.
>
> **Fine tune the results**
>
> To improve results, evaluate the specific needs of your use case to determine the appropriate balance between lexical and semantic search.
>
> Begin testing by starting in the middle with 50% lexical and 50% semantic and perform a series of queries.
> If the results do not match your expectations, then adjust the slider.
>
> **B2C**
>
> In a B2C context such as a grocery store chain, if a user searches for "ice cream" and the results prioritize "bag of ice" and "sour cream," the semantic weight should be increased. This helps return contextually relevant items like "waffle cones" and "chocolate syrup" that align with the shopper’s intent.
>
> **Financial services**
>
> In contrast, on a financial services site where a user is researching "bonds," overly broad results like CDs, mutual funds, or ETFs may dilute relevance. Increasing the lexical weight ensures the top results remain focused on bonds.
>
> Adjust the weighting strategy to match user intent and the goals of your business.
>
> Adjust the weights for your specific use case, and validate that the search results become more relevant for the users.
> **Control how closely records match and the number of records returned**
>
> Two settings determine the number of records returned:
>
> * **Vector Similarity Threshold**: This threshold sets the minimum of how closely a document must match your query's meaning to be included in results. Enter a decimal value between `0` and `1`.
>
> * A higher minimum value returns only results that strongly match the query's meaning. Assessing possible matches to return strong results may increase latency (processing response time).
>
> * A lower minimum value returns more results because results do not have to match the query's meaning as closely.
>
> * Results that are not semantically close enough to the query's meaning are filtered out before results are re-ranked.
> * **Vector Result Count**: This value specifies how many candidate results the vector (semantic) search retrieves before the results are merged and re-ranked with the lexical results. Enter an integer between `0` and `2000`.
>
> * A higher value assesses more semantic candidate results, which improves relevant results, but may increase latency (processing response time).
>
> * A lower value assesses fewer semantic candidate results, which may decrease relevant results, but also takes less processing time.
>
> > [!NOTE]
> >
> > These fields map to the `Min Return Vector Similarity` and `Number of Vector Results` fields in the Neural Hybrid Query stage settings.
>
> **Recommended starting values by use case**
>
> Use these starting values as a baseline, then adjust based on observed results.
>
> **B2B catalog**
>
> B2B catalog search involves dense product catalogs with technical terminology.
> Users expect both precision (correct part or product) and coverage (all relevant variants).
>
> | Setting | Starting value |
> | - | - |
> | Vector Result Count | 75–150 |
> | Vector Similarity Threshold | 0.60–0.70 |
>
> This balanced configuration provides a candidate pool wide enough to capture product variants and related SKUs,
> while filtering results with weak semantic relevance.
>
> **Signs you should adjust:**
>
> * If searches return too many unrelated items, raise the threshold.
> * If variant products are missing from results, lower the threshold or increase the result count.
>
> **E-commerce**
>
> E-commerce search benefits from high precision.
> Shoppers expect results that closely match their query, and irrelevant results reduce conversion.
>
> | Setting | Starting value |
> | - | - |
> | Vector Result Count | 50–100 |
> | Vector Similarity Threshold | 0.65–0.75 |
>
> The higher threshold filters weakly related products before re-ranking.
> A moderate result count keeps latency low while giving the re-ranker enough candidates to work with.
>
> **Signs you should adjust:**
>
> * If facet-filtered result sets are unexpectedly sparse, lower the threshold toward `0.60` or increase the result count.
> * If results feel unrelated to the query, raise the threshold toward `0.75–0.80`.
>
> **Knowledge management**
>
> Knowledge management and enterprise document search prioritize recall.
> Users need to find the right document even when their wording differs from the document's language.
> A threshold that is too strict hides relevant content.
>
> | Setting | Starting value |
> | - | - |
> | Vector Result Count | 100–200 |
> | Vector Similarity Threshold | 0.50–0.60 |
>
> The larger candidate pool and lower threshold keep vector search broad enough to surface documents
> that match query intent even when wording diverges significantly.
> This is especially important for long-tail queries and specialized terminology.
>
> **Signs you should adjust:**
>
> * If results feel noisy or unrelated, raise the threshold in increments of `0.05` and re-evaluate.
> * If users report missing documents, lower the threshold or increase the result count.
>
> **Tuning these settings**
>
> Adjust one setting at a time so you can identify what is causing changes in results.
>
> 1. **Start permissive.** Set Vector Result Count to `100–150` and Vector Similarity Threshold to `0.50`.
> This gives you a broad candidate pool and avoids prematurely hiding relevant results.
>
> 2. **Adjust the threshold first.** The similarity threshold has the most direct impact on result quality.
> Raise it gradually in increments of `0.05`, querying representative terms after each change.
>
> 3. **Tighten the result count last.** Once the threshold produces clean results, reduce Vector Result Count to improve response time.
> Watch for result quality changes as you lower it — if results degrade, the count is too low for your collection size.
>
> > [!TIP]
> >
> > The underlying vector search algorithm (HNSW) is approximate.
> > A higher Vector Result Count gives the algorithm more candidates to find the best matches,
> > which is why starting high and narrowing down produces better outcomes than starting low.
>
> **What to watch for**
>
> * **Zero or very few results**: A threshold that is too high can exclude all vector candidates for some queries, causing NHS to fall back to lexical-only results.
> A threshold of `0.80` or higher is rarely appropriate except for tightly controlled, well-structured catalogs.
> If users report missing results, lower the threshold by `0.05–0.10` and test again.
> * **Noisy or unrelated results**: If results don't feel related to the query, the threshold is likely too low.
> Also check whether Vector Result Count is higher than needed — a large candidate pool with a low threshold gives re-ranking more noise to contend with.
> * **Slow query response times**: Vector Result Count directly affects how many candidates are retrieved.
> If query times are slow, reduce the result count in increments of `25`.
> Note that if your collection spans multiple Solr shards, the effective candidate pool is Vector Result Count × shard count.
>
> For advanced pipeline-level configuration of these parameters, see the links applicable to your product:
>
> * Self-hosted Fusion clients, see [Choosing, implementing, and troubleshooting NHS stages](/docs/5/fusion/hybrid-search/hybrid-stage-differences) and [Semantic vector search test guidelines](/docs/5/fusion/hybrid-search/testing-svs).
>
> * Lucidworks Search clients, see [Choosing, implementing, and troubleshooting NHS stages](/docs/lucidworks-search/11-vector-search/hybrid-stage-differences) and [Semantic vector search test guidelines](/docs/lucidworks-search/11-vector-search/testing-svs).
## Sort
Sort is how search results are ordered and can be set according to relevance, which is the degree to which each item matches a user’s query based on search settings.
You can change the default sorting order that is used for results by arranging the tiles in the Sort section.
This lets you sort first by relevance, then by date for items with identical relevance, or sort first by date, then by relevance for items with identical dates.

# Typeahead
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-typeahead
Core Settings
[localhost link]: http://localhost:3000/docs/lw-platform/lw-core/sites-typeahead
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-core/sites-typeahead
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/core/1gkhuh
The Typeahead feature in Lucidworks Platform Core Settings provides real-time query and phrase suggestions as a user types into a search bar. This function helps users find relevant results faster by predicting what they are trying to search.
As the user enters text into the search box, the system predicts possible queries and displays instant suggestions in a dropdown menu. The suggestions refine dynamically when the user enters more characters. When the user clicks on the suggestion, the product or document displays.
> [!NOTE]
>
> Typeahead results returned by the API are sorted alphabetically. Sort options are not currently available.
> **[Core Settings Typeahead](https://academy.lucidworks.com/training/019e4691-6560-7890-82e2-894bab6f364d/overview)**
>
> Learn how to configure and manage Typeahead suggestions in Core Settings to help users find relevant results faster.
## How suggestions are created
Suggestions are created in two different ways:
* **Custom terms**. You can enter typeahead suggestions for products and documents. In addition to suggestions you want to include and display when a user searches, you can also enter suggestions to exclude that are not relevant. Excluding suggestions that are not relevant can enhance your user's search experience as much as including suggestions that steer the user to the products or knowledge they seek. A maximum of 4,000 custom terms (included and excluded) can be entered.
* **Suggested terms**. Every hour, Lucidworks Platform analyzes your customers' most frequent queries using signals from the [Signals Beacon](/docs/lw-platform/lw-analytics/signals/signals-beacon) or [Signals API](/docs/lw-platform/lw-analytics/signals/signals-api). The top 1,000 terms from the last 7 days are automatically added to your Included Typeahead Suggestions list.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
Click your use case below to see examples of how typeahead suggestions can enhance the search experience:
**Business-to-Consumer**
For a plumbing company, examples of Included typeahead terms are:
* black bathroom faucet
* gold bathroom faucet
* return policy
* clearance
Examples of Excluded typeahead terms are:
* shower curtain
* bath towels
* shower slippers
**Business-to-Business**
For an auto parts manufacturer, examples of Included typeahead terms are:
* brake kits
* carburetor calibration manual
* OEM factory service manuals (FSMs)
Examples of Excluded typeahead terms are:
* single unit
* retail price
* body shops
**Knowledge Management**
For human resource knowledge management, examples of Included typeahead terms are:
* benefits guide
* company holidays
* sick leave policy
Examples of Excluded typeahead terms are:
* employee address list
* handbook
* policy
## View suggestions
The Typeahead screen displays tabs that contain Included and Excluded suggestions.

You can perform the following actions to review or configure how the suggestions display:
* To view suggestions that contain certain characters, enter those characters in the **Search term** field and press **Enter**.
* To display suggestions based on persistence status, user who last updated the suggestion, or the date the suggestion was created, click **Filters** and select or enter the criteria.
**What is persistent?**
A suggestion marked as "persistent" means that terms generated hourly do not overwrite that suggested term.
All custom typeahead terms are persistent, and must be manually excluded or deleted to be removed from the Included table. To ensure that signal-based Typeahead terms are not replaced during the hourly refresh, toggle `Persistent` to `on`.
**Last Edited (Updated) By value**
The suggestions you enter manually in the user interface are called "custom" terms, with a value of the user signed on in the **Last Edited (Updated) By** field.
The suggestions gleaned from customer queries are called "suggested" terms, with a value of **Lucidworks** in the **Last Edited (Updated) By** field.

* To set the options and columns that display on the Typehead screen, click **Table Settings** and select the toggle to turn the option on or off.

## Configure suggestions
This section details the steps to configure and manage typeahead suggestions.
### Configure Included suggestions
> **Configure individual Included Typeahead suggestions**
>
> To configure a single Included typeahead suggestion, complete the following actions:
>
> * To add an entry, access the Typeahead screen and click **Included > +Add**. Enter the term and press **Enter**. Then, click **Publish** to activate the changes on your site.
>
> * To edit an existing entry, click the entry, enter the changes, and then, click **Publish** to activate the changes on your site.
>
> > [!NOTE]
> >
> > All custom typeahead terms are persistent, and must be manually excluded or deleted to be removed from the Included table. To ensure that signal-based Typeahead terms are not replaced during the hourly refresh, toggle `Persistent` to `on`.
>
> **Other actions to manage individual suggestions**
>
> **Discard changes**
>
> To discard edits to an existing entry, select the entry and click **Discard**.
>
> **Delete suggestions**
>
> You can delete custom terms and suggested terms.
>
> > [!WARNING]
> >
> > When you publish the deletion of a suggested term generated from signals, the term moves to the **Excluded** list instead of being deleted.
> > To stop a signal-generated term from appearing, use **Exclude**.
> > To let the term be suggested again, delete it from the **Excluded** list.
>
> To delete an entry, hold the pointer over the entry and click the trash icon.
>
> When you confirm the deletion, the entry displays in a soft delete status.
>
> To finalize the deletion, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft delete status is removed when you refresh the screen, and the entry is restored to the list.
>
> **Move included suggestions to the excluded list**
>
> To move a custom term you entered or a suggested term generated from signals from the **Included** list to the **Excluded** list, hold the pointer over the entry and click the **Exclude** icon.
>
> > [!NOTE]
> >
> > If you move a suggested term to the Excluded list, the system will not generate that suggestion again, regardless of how many signals contain that term.
>
> When you confirm the exclusion, the entry display in a soft exclude status.
>
> To finalize the move to the Excluded list, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft exclude status is removed when you refresh the screen, and the entry is restored to the Included list.
> **Edit multiple Included Typeahead suggestions**
>
> To edit more than one Included typeahead suggestion at a time, complete the following steps:
>
> In the Typeahead screen, hold the pointer over each entry you want to select and click the checkbox. To deselect all of the entries you have selected, click **Deselect**.
>
> > [!NOTE]
> >
> > To select all of the entries, hold the pointer over the **Terms** header and select the checkbox. All of the suggestions are selected.
>
> 
>
> The following sections detail how to exclude, delete, or deselect the selected entries.
>
> **Move included suggestions to the excluded list**
>
> To move the selected entries from the **Included** list to the **Excluded** list, click **Exclude**.
>
> > [!NOTE]
> >
> > If you move a suggested term to the Excluded list, the system will not generate that suggestion again, regardless of how many signals contain that term.
>
> When you confirm the exclusion, the entries display in a soft exclude status.
>
> To finalize the move to the Excluded list, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft exclude status is removed when you refresh the screen, and the entries are restored to the Included list.
>
> **Delete multiple Included suggestions**
>
> To delete the selected entries, click **Delete**.
>
> > [!WARNING]
> >
> > When you publish the deletion, suggested terms generated from signals move to the **Excluded** list instead of being deleted.
> > To stop signal-generated terms from appearing, use **Exclude**.
> > To let a term be suggested again, delete it from the **Excluded** list.
>
> When you confirm the deletion, the entries display in a soft delete status.
>
> To finalize the deletion, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft delete status is removed when you refresh the screen, and the entries are restored to the Included list.
### Configure Excluded suggestions
Excluding a term blocks the term and related terms from being suggested. For example, if you exclude "dog", the terms "dog house" and "dog food" are also excluded, but "doghouse" is not excluded.
You might want to exclude certain keywords from typeahead for several reasons:
* Frequently searched terms, such as "sale," might dominate typeahead if not excluded, reducing variety in suggestions.
* Filter out generic terms such as "info" or "product" that provide little user intent and might not help guide the user to meaningful content.
* Exclude typeahead suggestions that do not support business goals, such as low-value queries or terms that distract from high-intent, conversion-focused results.

To manage Excluded typeahead suggestions:
The only actions you can perform on the Excluded list are to add or delete entries.
Suggested terms generated from signals that you delete from the **Included** list also display here.
You cannot move excluded items to the Included list. To change a term from Excluded to Included, you must delete it from the Excluded list and then add it to the Included list.
> **Configure individual Excluded Typeahead suggestions**
>
> To configure a single Excluded typeahead suggestion, complete the following steps:
>
> In the Typeahead screen, click **Excluded > +Add**. Enter the term and press **Enter**. Then click **Publish** to activate that term for use on your site.
>
> **Other actions to manage individual suggestions**
>
> **Discard changes**
>
> To discard edits to an existing entry, select the entry and click **Discard**.
>
> **Delete suggestions**
>
> To delete an entry, hold the pointer over the entry and click the trash icon.
>
> When you confirm the deletion, the entry displays in a soft delete status.
>
> To finalize the deletion, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft delete status is removed when you refresh the screen, and the entry is restored to the list.
> **Edit multiple Excluded Typeahead suggestions**
>
> To edit more than one Excluded typeahead suggestion at a time, complete the following steps:
>
> In the Typeahead screen, hold the pointer over each entry you want to select and click the checkbox. To deselect all of the entries you have selected, click **Deselect**.
>
> > [!NOTE]
> >
> > To select all of the entries, hold the pointer over the **Terms** header and select the checkbox. All of the suggestions are selected.
>
> 
>
> The following section details how to delete the selected entries.
>
> **Delete suggestions**
>
> To delete multiple entries, hold the pointer over each entry, click the checkbox, and then click **Delete**.
>
> When you confirm the deletion, the entries display in a soft delete status.
>
> To finalize the deletion, click **Publish**.
>
> > [!NOTE]
> >
> > If you do not click **Publish**, the soft delete status is removed when you refresh the screen, and the entries are restored to the list.
# Typeahead Service API
Source: https://doc.lucidworks.com/docs/lw-platform/lw-core/typeahead-api
The Lucidworks Typeahead Service API returns a list of suggestions created in Lucidworks Platform Core Settings. Using the unique `TYPEAHEAD_ID` for your Typeahead configuration, you can retrieve a list of suggestions based on the characters included in the request.
> [!NOTE]
>
> For detailed API specifications in Swagger/OpenAPI format, see [Platform APIs](/api-reference/get-typeahead-suggestions).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Prerequisites
To use this API, you need:
* Typeahead suggestions entered or written into Lucidworks Platform Core Settings. A total of 5,000 suggestions are allowed in the following distribution:
* Your organization can enter a maximum of 4,000 custom terms (included and excluded) in the Core Settings Typeahead user interface.
* Every hour, a maximum of 1,000 of the terms entered most often in customer searches are added to the Included typeahead suggestions list.
* The unique `TYPEAHEAD_ID` for your typeahead implementation. Contact your Lucidworks Platform representative for this information.
## Unique values for the typeahead use case
Some query parameters unique to the `typeahead` use case can be used in the URL of the `GET` request of the Core Settings Typeahead Service API, including `prefix` and `limit`. Refer to the [API spec](/api-reference/get-typeahead-suggestions) for more information.
### Example GET request with `prefix` query parameter
```bash wrap Request theme={"dark"}
curl --request GET \
--url https://{TYPEAHEAD_ID}.typeahead.lucidworks.com/typeahead/suggestions?prefix=El \
--header 'Accept: application/json' \
--header 'Authorization: Embed EMBED_TOKEN' \
--header 'Content-type: application/json' \
--data ''
```
#### Response
The API call returns suggestions that begins with the letters `El`.
```json wrap theme={"dark"}
[
"Elastic",
"Electric",
"Electrical",
"Electronics",
"Elegant",
"Element",
"Elevator",
"Elite",
"Elixir",
"Ellipse"
]
```
## Result sorting
Typeahead results are sorted alphabetically. Sort options are not currently available with the API.
> [!NOTE]
>
> If the request does not include a query parameter after the `?` in the URL of the request, the complete list of suggestions is returned.
# AI Ranking Insights
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cs-ai-ranking-insights
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
AI Ranking Insights is a Commerce Studio feature that displays a clear, business-friendly explanation about why a product or content is ranked in a given position.
This feature uses a large language model (LLM) to interpret primary ranking drivers, such as text relevance, rules, boosts, rewrites, and AI-driven signals like Neural Hybrid Search (NHS), in Fusion's debug response.
## AI Ranking Insights example
To display the information, hold the pointer over a search result and select **Click Details**. In the Product Details section, click **AI Ranking Insights**.
The AI ranking insights feature identifies key relevancy influencers including merchandising rules, matching fields, and matching logic, and then returns the reasoning in a readable format so merchandisers and search managers can quickly identify the key factors influencing a search result's relevancy.
In this example, the AI ranking insight explains that the selected search result is ranked first because of a pin rule (listed in the **Execute** section of the Editor screen), and that the rule places the item above all other items. Merchandisers and other personnel would use this information to modify the factors of this and other search results, if needed, to rank other results higher than the bathroom faucet handle.

AI Ranking Insights for a popular bathroom faucet handle
## Benefits
Merchandisers, search managers, and other personnel can use this concise explanation to:
* More quickly refine and optimize relevance without requiring expertise in Fusion configuration or search engineering.
* Reduce the requirement for technical expertise to decipher raw scores, weights, and pipeline calculations.
* Reduce reliance on engineering resources to troubleshoot relevance issues.
* Reduce the risk of time-consuming, trial-and-error rule and other configuration changes.
## How it works
This is the flow to display AI Ranking Insights for a product:
1. In Commerce Studio Editor, a user searches for a product. For example, bathroom faucet.
2. Lucidworks Platform captures the corresponding Fusion debug response in the Query Workbench.
3. The debug response, aware of the query context, rules, rewrites, and AI signals, is sent to an LLM.
4. The LLM returns a clear, concise explanation that takes the primary ranking factors into account:
* Interaction of related rules, boosts, and relevance
* Why the product displays in relation to the other products
## Technical requirements
Because AI Ranking Insights reads the Fusion debug response, you must configure the query pipeline to include debug and explain data in every Commerce Studio query.
Commerce Studio cannot pass query parameters per request, so this must be set at the pipeline level using following stage for the product you have deployed:
* [Fusion Additional Query Parameters stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/set-query-params-stage#query-pipeline-stage-condition-examples)
* [Lucidworks Search Additional Query Parameters](/docs/lucidworks-search/09-developer-documentation/config-specs/query-pipeline-stages/additional-query-parameters#query-pipeline-stage-condition-examples)
To enable debug output for Commerce Studio:
1. In the Fusion UI, open the query pipeline used by your Commerce Studio application.
2. In the stage's **Condition** field, add the following expression to scope debug output exclusively to Commerce Studio queries:
```js theme={"dark"}
request.hasParam("lw.em.queryType")
```
This ensures explain data is only added for Commerce Studio requests and not returned to other consumers of the same pipeline.
3. Add an **Additional Query Parameters** stage with the following parameter:
| Name | Value | Policy |
| - | - | - |
| `debug` | `true` | `default` |
Use `default` policy so the parameter is added only when not already set by the request.
Use `replace` if you need to force debug output regardless of incoming request parameters.

Additional Query Parameters
4. Save the changes.
**Debug response**
The debug response includes Solr's `explain` data, which shows how each document's score was calculated — including contributions from lexical scoring, vector similarity, boosts, and merchandising rules.
This is the data the LLM reads to generate the AI Ranking Insights explanation.
For details about reading Solr explain output, including how to find it in Query Workbench and how to interpret NHS scoring, see the information for your product:
* [Fusion Use Solr explain](/docs/5/fusion/hybrid-search/hybrid-stage-differences#use-solr-explain)
* [Lucidworks Search Use Solr explain](/docs/lucidworks-search/11-vector-search/hybrid-stage-differences#use-solr-explain)
# Migration guide
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cs-migrate
This guide explains the client tasks required to migrate from Predictive Merchandiser to Commerce Studio in Lucidworks Platform.
> [!NOTE]
>
> See [Commerce Studio versus Predictive Merchandiser](/docs/lw-platform/lw-cs/cstudio-versus-pm) for a feature comparison.
While Lucidworks will complete the majority of the migration, you will need to perform certain pre-migration and post-migration tasks.
The migration is one-way. The migration can be reverted back to Predictive Merchandiser, but any changes made in Commerce Studio are not reverted back into Predictive Merchandiser.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Prepare for the migration
Complete these client tasks before Lucidworks begins the migration.
> **Prepare Predictive Merchandiser for migration**
>
> ### Determine which rules and rewrites will be migrated
>
> > [!NOTE]
> >
> > * **Unpublished** rules or rewrites have never been published.
> >
> > * **Staged** rules or rewrites have been published at least once, but then were changed and those changes are not yet published. It also includes rules and rewrites that were deleted, but the deletion has not yet been published.
>
> #### Unpublished rules
>
> If you want unpublished rules migrated, then inform Lucidworks to set `excludeUnpublishedRules` to `false` during the migration. This is the default option. If you do not want unpublished rules to be migrated, tell Lucidworks to set `excludeUnpublishedRules` to `true`.
>
> #### Unpublished rewrites
>
> If you want unpublished rewrites migrated, then inform Lucidworks to set `excludeUnpublishedRewrites` to `false` during the migration. This is the default option. If you do not want unpublished rules to be migrated, tell Lucidworks to set `excludeUnpublishedRewrites` to `true`.
>
> #### Publish only approved content
>
> By default, migrated rules and rewrites are published in Commerce Studio if they are published in Predictive Merchandiser.
>
> If you want only approved rewrites and rules to be migrated as published, then inform Lucidworks to set `publishApprovedOnly` to `true` during the migration.
>
> #### Skip rules or rewrites
>
> If you want to skip all rules, then inform Lucidworks to set `skipRules` or `skipRewrites` to `true` during the migration.
>
> #### Staged rules and rewrites
>
> Staged rules and rewrites are skipped in the migration, so you must publish or revert all staged changes to rules and rewrites.
>
> You can only view staged changes in Predictive Merchandiser that belong to your user.
>
> To check for staged changes that belong to other users in your organization, do the following:
>
> 1. Copy the `precheck.sh` script below to check for staged (unpublished) rules and rewrites:
>
> ```bash expandable theme={"dark"}
> #!/bin/bash
>
> set -e
>
> # Function to perform curl requests with error handling and retries
> perform_curl_request() {
> local url=$1
> local max_retries=3
> local retry_count=0
> local wait_time=5
> local curl_opts="-s -w '\n%{http_code}' -H 'Accept: application/json' -u '$FUSION_USERNAME:$FUSION_PASSWORD'"
>
> while [ $retry_count -le $max_retries ]; do
> # Execute curl and capture response with status code
> local response=$(eval "curl $curl_opts '$url'")
> local status_code=$(echo "$response" | tail -n1)
> local body=$(echo "$response" | sed '$d')
>
> # Check if status code is in 2xx range
> if [[ $status_code =~ ^2[0-9][0-9]$ ]]; then
> echo "$body"
> return 0
> else
> # Report the error
> echo "Error: HTTP request failed with status code $status_code" >&2
> echo "URL: $url" >&2
>
> # If it's a 4xx error, don't retry
> if [[ $status_code =~ ^4[0-9][0-9]$ ]]; then
> echo "Client error. Not retrying." >&2
> exit 1
> fi
>
> # For other errors (5xx), retry if we haven't reached max retries
> if [ $retry_count -lt $max_retries ]; then
> retry_count=$((retry_count + 1))
> echo "Retrying in $wait_time seconds... (Attempt $retry_count of $max_retries)" >&2
> sleep $wait_time
> else
> echo "Maximum retries reached. Giving up." >&2
> exit 1
> fi
> fi
> done
>
> exit 1
> }
>
> # Function to validate JSON blob rules
> validate_json_blob_rule() {
> local doc="$1"
> local doc_id="$2"
>
> local json_blob_s=$(echo "$doc" | jq -r '.json_blob_s // empty')
> # Guard: Exit early if no json_blob_s field
> [ -z "$json_blob_s" ] && return 0
>
> # Decode base64 and validate JSON structure
> local decoded_json=$(echo "$json_blob_s" | base64 -d 2>/dev/null || echo "")
> # Guard: Exit early if decoding failed
> [ -z "$decoded_json" ] && return 0
>
> # Check if the decoded JSON is valid
> if ! echo "$decoded_json" | jq empty 2>/dev/null; then
> # Invalid JSON in blob
> bad_json_blob_rule_ids+=("$doc_id")
> echo "found JSON blob rule with invalid JSON: $doc_id"
>
> # Add this entry to our JSON structure for bad JSON blobs
> local content_entry=$(jq -n --arg id "$doc_id" \
> --argjson content "$doc" \
> --arg decoded_content "$decoded_json" \
> '{
> "id": $id,
> "ruleContent": $content,
> "decodedJsonBlob": $decoded_content,
> "error": "Invalid JSON syntax"
> }')
>
> # Add this entry to the second problem (index 1) in our JSON structure
> json_output=$(echo "$json_output" | jq --argjson entry "$content_entry" '.problems[1].content += [$entry]')
> return 0
> fi
>
> # Valid JSON - now check if it's multiple objects
> # A simple heuristic: if we can't parse it as a single JSON value, it's likely multiple objects
> if echo "$decoded_json" | jq -e 'type' >/dev/null 2>&1; then
> # Guard: Exit early if it's a valid single JSON object
> return 0
> fi
>
> # This means jq couldn't parse it as a single value, likely multiple objects
> bad_json_blob_rule_ids+=("$doc_id")
> echo "found JSON blob rule with multiple objects: $doc_id"
>
> # Add this entry to our JSON structure for bad JSON blobs
> local content_entry=$(jq -n --arg id "$doc_id" \
> --argjson content "$doc" \
> --arg decoded_content "$decoded_json" \
> '{
> "id": $id,
> "ruleContent": $content,
> "decodedJsonBlob": $decoded_content
> }')
>
> # Add this entry to the second problem (index 1) in our JSON structure
> json_output=$(echo "$json_output" | jq --argjson entry "$content_entry" '.problems[1].content += [$entry]')
> }
>
> # Function to check for staged published rules
> check_staged_published_rule() {
> local doc="$1"
> local doc_id="$2"
> local deployed="$3"
>
> # Guard: Exit early if rule is deployed (not staged)
> [ "$deployed" != "false" ] && return 0
>
> # Check if the doc exists in the live rewrites collection
> local live_url="$FUSION_BASE_URL/api/apps/$FUSION_APP_ID/query-rewrite/search?q=id:$doc_id&isLive=true&doc_type=rule&fl&rows=1&start=0"
> echo "fetching live rule via $live_url"
> local live_response=$(perform_curl_request "$live_url")
>
> # Check if we have any rules in the live response array
> local live_docs_count=$(echo "$live_response" | jq -r '.response.docs | length')
>
> # Guard: Exit early if doc doesn't exist in live collection
> [ "$live_docs_count" -eq 0 ] && return 0
>
> # Found a published rule with staged changes
> staged_published_rule_ids+=("$doc_id")
> echo "found published rule with staged changes: $doc_id"
>
> # Extract the live doc from the response
> local live_doc=$(echo "$live_response" | jq '.response.docs[0]')
>
> # Create a new entry for this rule with both staging and live content
> local content_entry=$(jq -n --arg id "$doc_id" \
> --argjson staging "$doc" \
> --argjson live "$live_doc" \
> '{
> "id": $id,
> "stagingContent": $staging,
> "liveContent": $live
> }')
>
> # Add this entry to our JSON structure
> json_output=$(echo "$json_output" | jq --argjson entry "$content_entry" '.problems[0].content += [$entry]')
> }
>
> # Function to display help message
> show_help() {
> echo "Usage: $0 [output_file]"
> echo "Example: $0 admin password https://fusion.example.com MyFusionApp precheck_results.json"
> echo "This script performs pre-checks for Fusion content before migration."
> echo "Arguments:"
> echo " fusion_username Fusion username"
> echo " fusion_password Fusion password"
> echo " fusion_base_url Base URL of the Fusion instance"
> echo " fusion_app_id Application ID of the Fusion app to check"
> echo " output_file (Optional) Output file to save results (default: precheck_results.json)"
> }
>
> # Check if required arguments are provided
> if [ "$#" -lt 4 ]; then
> show_help
> exit 1
> fi
>
> FUSION_USERNAME=$1
> FUSION_PASSWORD=$2
> FUSION_BASE_URL=$3
> FUSION_APP_ID=$4
> OUTPUT_FILE=${5:-precheck_results.json}
>
> # Input validation
> if [ -z "$FUSION_USERNAME" ]; then
> echo "Error: fusion_username is required"
> show_help
> exit 1
> fi
>
> if [ -z "$FUSION_PASSWORD" ]; then
> echo "Error: fusion_password is required"
> show_help
> exit 1
> fi
>
> if [ -z "$FUSION_BASE_URL" ]; then
> echo "Error: fusion_base_url is required"
> show_help
> exit 1
> fi
>
> if [ -z "$FUSION_APP_ID" ]; then
> echo "Error: fusion_app_id ID is required"
> show_help
> exit 1
> fi
>
> # Check if jq is installed
> if ! command -v jq &> /dev/null; then
> echo "Error: jq command line tool is required but not installed. Please install jq and try again: https://jqlang.org/"
> exit 1
> fi
>
> # Check if output file exists
> if [ -f "$OUTPUT_FILE" ]; then
> read -p "File $OUTPUT_FILE already exists. Overwrite? (y/n): " -n 1 -r
> echo
> if [[ ! $REPLY =~ ^[Yy]$ ]]; then
> echo "Operation cancelled."
> exit 1
> fi
> fi
>
> # Ensure the output file is writeable
> if ! touch "$OUTPUT_FILE" &> /dev/null; then
> echo "Error: Output file $OUTPUT_FILE is not writeable. Check output path / permissions and try again."
> exit 1
> fi
>
> # Initialize JSON structure
> json_output='{
> "problems": [
> {
> "problem": "Published rule with staged changes will be skipped during migration",
> "fix": "Publish or revert the changes, or manually re-create the skipped content after migrating",
> "content": []
> },
> {
> "problem": "JSON blob rule contains multiple JSON objects instead of a single object",
> "fix": "Update the JSON blob rule to contain only a single JSON object at the top level",
> "content": []
> }
> ]
> }'
>
> # Initialize array to store staged published rule IDs
> declare -a staged_published_rule_ids
>
> # Initialize array to store bad JSON blob rule IDs
> declare -a bad_json_blob_rule_ids
>
> # Fetch query rewrite instances with pagination
> start=0
> rows=10
> processed_docs=0
>
> while true; do
> page_url="$FUSION_BASE_URL/api/apps/$FUSION_APP_ID/query-rewrite/instances?sort=id+asc&doc_type=rule&rows=$rows&editSessionId=*&start=$start"
> echo "fetching next page of rules via $page_url"
> response=$(perform_curl_request "$page_url")
>
> # Check if we got an empty array, which means we're done paginating
> array_length=$(echo "$response" | jq -r '. | length')
> if [ "$array_length" -eq 0 ]; then
> break
> fi
>
> echo "Retrieved $array_length rules at offset $start"
>
> # Process each doc in the array
> while read -r doc; do
> doc_id=$(echo "$doc" | jq -r '.id')
> deployed=$(echo "$doc" | jq -r '.deployed')
> doc_type=$(echo "$doc" | jq -r '.type // empty')
>
> # Check for bad JSON blob rules
> if [ "$doc_type" = "json_blob" ]; then
> validate_json_blob_rule "$doc" "$doc_id"
> fi
>
> # Check for staged published rules
> check_staged_published_rule "$doc" "$doc_id" "$deployed"
>
> processed_docs=$((processed_docs + 1))
> done < <(echo "$response" | jq -c '.[]')
>
> # Move to the next page
> start=$((start + rows))
> done
>
> # Write the final JSON output to file
> echo "$json_output" | jq '.' > "$OUTPUT_FILE"
>
> # Output results
> total_staged_issues=0
> total_json_blob_issues=0
> if [ -n "${staged_published_rule_ids[*]:-}" ]; then
> total_staged_issues=${#staged_published_rule_ids[@]}
> fi
> if [ -n "${bad_json_blob_rule_ids[*]:-}" ]; then
> total_json_blob_issues=${#bad_json_blob_rule_ids[@]}
> fi
>
> total_issues=$((total_staged_issues + total_json_blob_issues))
>
> # Guard: Exit early if no issues found
> if [ $total_issues -eq 0 ]; then
> echo "All pre-checks passed. No issues found."
> echo "Processed $processed_docs rules."
> exit 0
> fi
>
> # Report issues found
> echo "The following pre-checks failed:"
>
> # Report staged published rule issues
> if [ $total_staged_issues -gt 0 ]; then
> echo " Found published rules with staged changes. Publish or revert the changes to fix this issue."
>
> # Display up to 10 IDs
> display_count=$([ $total_staged_issues -gt 10 ] && echo 10 || echo $total_staged_issues)
> for ((i=0; i echo " - ${staged_published_rule_ids[$i]}"
> done
>
> # Indicate if there are more
> [ $total_staged_issues -gt 10 ] && echo " ... and $((total_staged_issues - 10)) more."
> fi
>
> # Report JSON blob rule issues
> if [ $total_json_blob_issues -gt 0 ]; then
> echo " Found JSON blob rules with multiple JSON objects instead of a single object."
>
> # Display up to 10 IDs
> display_count=$([ $total_json_blob_issues -gt 10 ] && echo 10 || echo $total_json_blob_issues)
> for ((i=0; i echo " - ${bad_json_blob_rule_ids[$i]}"
> done
>
> # Indicate if there are more
> [ $total_json_blob_issues -gt 10 ] && echo " ... and $((total_json_blob_issues - 10)) more."
> fi
>
> echo "See $OUTPUT_FILE for the full list of invalid content with complete document details"
> echo "Processed $processed_docs rules."
> exit 0
> ```
>
> 2. Run the script, replacing the placeholder values with your values.
>
> ```bash wrap theme={"dark"}
> ./precheck.sh FUSION_USERNAME FUSION_PASSWORD FUSION_BASE_URL FUSION_APP_ID
> ```
> **Placeholder definitions**
>
> | Placeholder | Description |
> | - | - |
> | `FUSION_USERNAME` | Your Fusion username. |
> | `FUSION_PASSWORD` | The password for your Fusion user. |
> | `FUSION_BASE_URL` | The URL of your Fusion instance including `https://`. For example, `https://FUSION_HOST.com`. |
> | `FUSION_APP_ID` | The application ID of the Fusion app that contains your Predictive Merchandiser. This is the value of the `id` field, and may or may not match the `name` of the Fusion app. To obtain the ID, sign in to your Fusion instance. For example, `FUSION_INSTANCE.com`. Then also open a different browser window and enter `https://FUSION_INSTANCE.com/api/apps`. The `id` and `name` display for each valid Fusion app. The value in the `id` field is the value that needs to be used in this field. |
>
> > [!NOTE]
> >
> > If you receive an error stating `bash: ./precheck.sh: Permission denied`: 1. Make the script
> > executable: `chmod +x precheck.sh`. 2. Run the script again.
>
> 3. Check the output to see if any issues were detected. If there are no issues, the output returns `All pre-checks passed. No issues found.` Continue to [retrieve list of objects in Predictive Merchandiser](#retrieve-lists-of-objects-in-predictive-merchandiser). If there are issues, the output returns a list of issues like the following:
>
> ```
> The following pre-checks failed:
> Found published rules with staged changes. Publish or revert the changes to fix this issue.
> - 2fRtM1GEsU
> - E1YkUTX9r6
> - Eb2A6WARag
> - FNS7Whciwx
> - LlIsMfK4kq
> - OidpIUrVv3
> - P39TDQ2X1K
> - RYbY2XPMOI
> - ZHvW2LiQpe
> - aCseNzc4Xc
> ... and 6 more.
> See precheck_results.json for the full list of invalid content
> ```
>
> 4. Review `precheck_results.json` and inspect each reported rule. If you created the rules, sign into Predictive Merchandiser and publish or revert the staged changes. If the unpublished rules were created by a different user, you cannot publish or revert the rules in the Predictive Merchandiser UI. There are a few options for resolving unpublished rules owned by another user:
>
> * After you complete the pre-migration tasks, tell Lucidworks to proceed with the migration. These rules are skipped and you can re-create them in Commerce Studio.
> * Use the Fusion [Query Rewrite](/api-reference/query-rewrite-api/get-the-query-rewrite-status) and [Custom Rule](/api-reference/custom-rule-type-api/get-a-custom-rule-type) APIs to manually publish or revert the unpublished rules.
> * Use the Fusion [Query Rewrite](/api-reference/query-rewrite-api/get-the-query-rewrite-status) and [Custom Rule](/api-reference/custom-rule-type-api/get-a-custom-rule-type) APIs, or Solr, to manually change the edit session ID of the content in Solr to your current user. Then, manually fix the content in the Predictive Merchandiser UI.
> * Have the user that owns the content in Predictive Merchandiser sign in and either publish or revert the changes.
>
> 5. After resolving issues, re-run the script. If there are no issues, continue to [retrieve list of objects in Predictive Merchandiser](#retrieve-lists-of-objects-in-predictive-merchandiser).
>
> > [!NOTE]
> >
> > You can run the precheck.sh script at any time, even after a migration if desired. It makes no
> > changes to contents and works even if Commerce Studio is enabled.
> **Retrieve lists of objects in Predictive Merchandiser**
>
> After preparing Predictive Merchandiser for migration, Lucidworks recommends that you export lists of rules, rewrites, templates, and zones from your Predictive Merchandiser instance to compare against Commerce Studio later. This will help serve as a reference when performing your post-migration validation checks.
>
> 1. Export a list of your rules and rewrites:
>
> ```bash theme={"dark"}
> curl --request GET \
> --u USER:PASSWORD \
> --url 'https://FUSION_HOST/api/apps/APP_NAME/query-rewrite/instances' \
> --header 'accept: application/json' \
> > exported-rules.json
> ```
>
> 2. Create an inventory of your rules, noting how many of each type and tag appear in the list.
>
> 3. Export a list of your zones:
>
> ```bash theme={"dark"}
> curl --request GET \
> -u USER:PASSWORD \
> --url 'https://FUSION_HOST/api/templating/zones?context=app:APP_NAME' \
> --header 'Accept: application/json' \
> > zones.json
> ```
>
> 4. Export a list of your templates:
>
> ```bash theme={"dark"}
> curl --request GET \
> -u USER:PASSWORD \
> --url 'https://FUSION_HOST/api/templating/templates?context=app:APP_NAME' \
> --header 'Accept: application/json' \
> > templates.json
> ```
> **Notify Lucidworks the migration can be executed**
>
> Notify Lucidworks to begin the migration, but keep in mind that once the migration begins, you will no longer be able to access Predictive Merchandiser.
>
> Lucidworks will set up the Commerce Studio integration and instance, and migrate your data from Predictive Merchandiser to Commerce Studio.
>
> > [!CAUTION]
> >
> > Do not proceed with subsequent procedures until Lucidworks confirms the migration is successful.
## Post-migration tasks
Complete these client tasks when Lucidworks notifies you the migration is complete.
> **Validate migration data**
>
> Lucidworks will run the validation checks in this section, but you must also validate that all Predictive Merchandiser objects appear in Commerce Studio.
>
> Because you can no longer access Predictive Merchandiser, you must consult the [exported JSON](#retrieve-lists-of-objects-in-predictive-merchandiser) you generated in **Retrieve lists of objects in Predictive Merchandiser** for validation checks.
>
> 1. Sign in to [Lucidworks Platform](https://platform.lucidworks.com) as a workspace owner and navigate to **Commerce Studio**.
> 2. Navigate to **Rules**, then compare your rule count in Commerce Studio against the JSON you [exported from Predictive Merchandiser](#retrieve-lists-of-objects-in-predictive-merchandiser).
> 3. Navigate to **Rewrite**, then validate that your query rewrites in Commerce Studio match the exported JSON.
> 4. Navigate to **Settings**, then validate your templates have been correctly migrated.
> 5. Open each page, then validate your Predictive Merchandiser zones have become sections in Commerce Studio, and they are associated with the correct page.
> 6. Navigate to the **Editor** and check that rules and rewrites are applied as expected. Some rules and rewrites only fire under specific conditions:
> 1. For rules that fire under specific templates, change your page to match the required template.
> 2. For rules that fire only when specific tags are applied, verify the tags are displayed on the Rules page for the rule.
> 7. Perform additional rules and rewrites validations as needed, using the exported rules JSON as a reference. For example, check that the direction of synonym rewrites matches the expected direction.
>
> If you encounter any issues, contact your Lucidworks representative.
>
> Web traffic continues to use rules and rewrites from Predictive Merchandiser. Changes made in Commerce Studio do not affect live traffic. Contact Lucidworks when you complete the validation tasks.
## Revert to Predictive Merchandiser
If you want to revert back to using Predictive Merchandiser, inform Lucidworks. Then Lucidworks must delete the Commerce Studio instance.
If the Commerce Studio instance is deleted, changes you made to Commerce Studio after the initial migration from Predictive Merchandiser are *not* populated back into Predictive Merchandiser.
When the Commerce Studio instance is deleted, the system should automatically revert the Fusion app back to Predictive Merchandiser. This restores access to Predictive Merchandiser and routes live traffic back to its rules and rewrites, if traffic had previously been switched to Commerce Studio.
## Frequently asked questions
**Can I revert to Predictive Merchandiser after switching to Commerce Studio?**
Yes. However, any changes made in Commerce Studio after switching will *not* be reverted back into Predictive Merchandiser.
**Does switching to Commerce Studio immediately affect live web traffic?**
No. After a successful migration, web traffic continues to use rules and rewrites from Predictive Merchandiser.
**What happens if I forget to publish changes in Predictive Merchandiser before migrating?**
If you fail to publish pending rules and rewrites before starting the migration, the migration may fail or result in incomplete or inaccurate data. All changes must be published before proceeding.
## Troubleshooting
This section provides troubleshooting steps for resolving issues with the Commerce Studio [Editor](/docs/lw-platform/lw-cs/cstudio-editor) when integrated with Fusion. Use this guidance to debug unexpected behavior that may be caused by Fusion query pipeline or query profile configuration.
This content is intended for users with experience in Fusion and search engineering.
### Symptoms
You may be experiencing a configuration issue if you observe any of the following:
* No results or facets returned in the Editor
* Error messages when performing searches
* Rules not firing or not appearing after creation
* Rewrites not triggering or not affecting live traffic
* Mismatch between facets and results list
* “Targeted documents” column in the rules table is empty or incorrect
* No field value suggestions when configuring rule conditions
* Missing stage data in the Ranking Factors UI
### General troubleshooting steps
1. Open your browser’s developer tools and go to the Network tab.
1. Retry the failing action.
2. Look for requests with a non-200 status or check `render` endpoint responses for `errorMessage` fields.
3. Use the `fusionRequestUrl` to replicate the request in Fusion Query Workbench.
2. Verify that the query pipeline behaves as expected in Fusion Query Workbench.
1. Confirm there are no errors.
2. Verify expected results are returned.
3. In the **JSON view**, check for `fusion.applicable_rules` or `fusion.tagger` values.
3. Confirm that rules and rewrites are saved to the correct Solr collections.
1. In Solr Admin, check `APP_NAME_query_rewrite_staging_em` and `APP_NAME_query_rewrite_em`.
2. Use the rule ID to query and confirm the entry exists.
> [!WARNING]
>
> 1. Commerce Studio exclusively manages `APP_NAME_query_rewrite_staging_em` and `APP_NAME_query_rewrite_em`. Do not manually add, edit, or delete documents in these collections.
> 2. Commerce Studio reflects rules stored in its own platform database. Deleting documents from these Fusion Solr collections does not delete the corresponding rules in Commerce Studio. The collections will re-sync the next time Commerce Studio writes rules.
> 3. Custom tooling built against these collections is not supported.
4. Ensure the staging collection has only one replica.
1. If multiple replicas exist, set `shards.preference=replica.leader` in the **Apply Rules** and **Text Tagger** stage parameters.
5. Verify that the pipeline supports the `fl` parameter.
1. Do not overwrite `fl`. Add required fields only when needed.
2. Do not use `fl=*`.
### Required pipeline configuration
Your Fusion query pipeline must include the following stages in this order:
1. **Text Tagger stage** with a blank value in the **Tagger Collection** field
2. **Apply Rules stage** with a blank value in the **Collection** field
3. **Solr Query stage**
4. **Modify Response stage**
5. **Response Diagnostics stage**
In addition, the pipeline must:
* Use the `edismax` query parser (`defType=edismax`)
* Preserve the following query parameters: `tags`, `lw.rules.simulate`, `lw.app.emStatus`, `context`, `lw.tagger.debug`, `lw.rules.debug`, `lw.em.staging`
* Preserve required response fields: `response.docs`, `response.numFound`, `fusion.tagger`, `fusion.applicable_rules`, `fusion.applicable_stages`, `response.facet_counts`, `responseHeader.params`
### Feature-specific checks
#### Targeted document lookup
* The Fusion app and query profile must have the same name.
* The query profile must support `q=**:**` and standard `fq` parameters.
* Avoid using grouping, collapse/expand, or custom logic that may interfere with standard filter behavior.
#### Field value suggestions
* The Solr collection must match the Fusion app name.
* The collection must support the `/terms` request handler with standard parameters.
* Suggestions will fail if `/terms` is missing or misconfigured.
#### Rewrites and rules interaction
* If the **Text Tagger** stage appears before the **Apply Rules** stage, rewrites apply first.
* If the **Apply Rules** stage appears before the **Text Tagger** stage, only the original terms are used for rule evaluation.
* Rules must target the rewritten query term, not the original term.
#### Grouping via collapse/expand
* The query pipeline must set an `fq` with the collapse field specified, indicating what field identifies members of a group. For example, set `fq={!collapse field=product_id_s}` when `expand=true` is passed as a query param.
* Set the following query parameters:
```bash theme={"dark"}
expand=true
expand.rows=5
```
* Relevant response fields include the following:
```bash theme={"dark"}
expanded
response.docs
```
#### Query Workbench debugging tips
* Use the correct query profile and associated pipeline.
* Set the following query parameters:
```bash theme={"dark"}
lw.rules.debug=1
lw.tagger.debug=1
lw.em.staging=1=_query_rewrite_staging_em
lw.app.emStatus=CONNECTED
queryProfileID=
tags=
lw.rules.target_segment=
```
* Use **View As: JSON** to verify `fusion.applicable_rules` and the final query string.
* Use custom JavaScript stages to inspect `ctx` or log intermediate values.
### Known configuration issues
* Hardcoded `tags` in pipelines may prevent rules from matching if users forget to apply corresponding tags in the Editor.
* Query pipelines that use grouping may break document targeting. Only collapse/expand-based grouping is supported. Grouping via Solr `group` params or blockjoin query parser is not supported.
* If a boost stage and a rule both adjust relevancy, only one may take effect, depending on rule priority and creation date.
# Rules and Rewrites API
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cs-rules-rewrites-api
The Rules and Rewrites API for Commerce Studio enables you to create and manage merchandising [rules](/docs/lw-platform/lw-cs/cstudio-rules) and [query rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite) programmatically.
This API supports enterprise automation workflows, cross-environment synchronization, and integration with internal tools.
For complete details about all of its endpoints, methods, and parameters, see the [Rules and Rewrites API reference](/api-reference/rule-management/list-rules).
## When to use this API
The Rules and Rewrites API enables the following use cases:
* **Automate rule deployment**: Create and update rules and rewrites through CI/CD (continuous integration/continuous deployment) pipelines or automated workflows.
* **Synchronize across environments**: Maintain consistent rules and rewrites across development, QA (quality assurance), and production environments.
* **Manage rules at scale**: Efficiently handle large rule sets that are impractical to manage through the UI (user interface) alone.
* **Fallback with version control**: Fetch rules and rewrites, then commit them to your source control repository at intervals so you can easily revert to earlier versions if needed.
* **Integrate with AI agents**: Use AI to automate creation and updates of rules and rewrites.
> [!NOTE]
>
> For visual rule creation and management, use the Commerce Studio UI.
> The API is designed for programmatic workflows where automation and integration are required.
## Key concepts
### Rule and rewrite identifiers
Every rule and rewrite has two ID fields that you can use interchangeably in API operations:
* **`id`**: Automatically generated UUID (Universally Unique Identifier) assigned by the platform when you create a rule or rewrite.
This identifier is unique within the Commerce Studio instance.
* **`externalId`**: Optional user-defined identifier that you can assign when creating a rule or rewrite.
This field enables you to maintain your own naming conventions and synchronize rules across multiple environments.
> [!TIP]
>
> Use external IDs to maintain stable references across environments.
> For example, assign an external ID like `promo-summer-2026` to ensure the same rule can be identified and updated consistently in development, QA, and production.
> [!WARNING]
>
> External IDs must be unique within a Commerce Studio instance.
> The API prevents duplicate external IDs to maintain rule integrity.
### Authentication scopes
The API uses three separate authentication scopes:
* `commercestudio.rules`: Required for [rule](/docs/lw-platform/lw-cs/cstudio-rules) operations (create, read, update, delete rules)
* `commercestudio.rewrites`: Required for [query rewrite](/docs/lw-platform/lw-cs/cstudio-query-rewrite) operations (create, read, update, delete rewrites)
* `commercestudio.bulkoperations`: Required for [bulk operations](#bulk-operations) (publish, unpublish, edit, delete, and migrate operations on multiple rules)
Request separate access tokens for each scope based on the operations you need to perform.
### Rate limiting
Platform rate limits apply to all API requests to protect system stability.
If you encounter rate limit errors, implement exponential backoff in your integration.
## Use the Rules and Rewrites API
To use the API, you need a Lucidworks service account.
Then you can gather your credentials and begin making API calls.
For complete details about API endpoints, methods, and parameters, see the [Commerce Studio Rules and Rewrites API reference](/api-reference/rule-management/list-rules).
> **Create a service account**
>
> If you don't already have a Lucidworks service account of type "API", complete the following steps:
>
> **Step 1**
>
> In Lucidworks Platform, go to **Settings** > **Service Accounts**.
>
> **Step 2**
>
> Click **Create New Service Account**.
>
> **Step 3**
>
> In the New Service Account window, be sure to select **API** as the service account type.
> Enter a name and optionally a description to help you remember what this account is for.
>
> **Step 4**
>
> Click **Create New Service Account**.
> The new account appears in the list.
> Click the account you created to find the **Client ID** and **Client Secret** you need to access the API.
> **Gather your credentials**
>
> You'll need the following information to access the API:
>
> * **Commerce Studio ID**: Your Commerce Studio instance identifier
> * **Client ID**: From your service account
> * **Client Secret**: From your service account
>
> **1. Find your Commerce Studio ID**
>
> Your Commerce Studio ID is part of your Commerce Studio URL.
> For example, if your Commerce Studio URL is `https://COMMERCE_STUDIO_ID.experiencemanager.lucidworks.com`, your Commerce Studio ID is `COMMERCE_STUDIO_ID`.
>
> **2. Get your service account credentials**
>
> In Lucidworks Platform, go to **Settings** > **Service Accounts** and click the service account you created.
> Copy the **Client ID** and **Client Secret**.
> **Access the API**
>
> **1. Fetch an access token**
>
> Before making API requests, you need to authenticate and obtain an access token.
>
> Send a POST request to the authentication endpoint:
>
> ```bash theme={"dark"}
> curl --request POST \
> --url 'https://identity.lucidworks.com/oauth2/ausao8uveaPmyhv0v357/v1/token?scope=API_SCOPE&grant_type=client_credentials' \
> --header 'Accept: application/json' \
> --header 'Authorization: Basic [CLIENT_ID:CLIENT_SECRET_BASE64]' \
> --header 'Cache-Control: no-cache' \
> --header 'Content-Type: application/x-www-form-urlencoded'
> ```
>
> Replace `API_SCOPE` with one or more of these (as a space-separated list):
>
> * `commercestudio.rules` for rule operations
> * `commercestudio.rewrites` for query rewrite operations
> * `commercestudio.bulkoperations` for bulk operations
>
> The `Authorization` header uses basic authentication with your base64-encoded client ID and client secret.
> You can encode your credentials using:
>
> ```bash theme={"dark"}
> echo -n "CLIENT_ID:CLIENT_SECRET" | base64
> ```
>
> > [!NOTE]
> >
> > Some HTTP clients perform the base64 encoding automatically when you provide the client ID as the username and client secret as the password.
>
> A successful response returns:
>
> ```json theme={"dark"}
> {
> "token_type": "Bearer",
> "expires_in": 3600,
> "access_token": "YOUR_ACCESS_TOKEN",
> "scope": "commercestudio.rules"
> }
> ```
>
> **2. Make API requests**
>
> Use the access token in the `Authorization` header of your API requests:
>
> ```bash theme={"dark"}
> curl --request GET \
> --url 'https://{COMMERCE_STUDIO_ID}.experiencemanager.lucidworks.com/em-rules' \
> --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'
> ```
>
> Replace `{COMMERCE_STUDIO_ID}` with your Commerce Studio instance ID.
>
> **3. Refresh your token**
>
> Access tokens expire after 60 minutes.
>
> > [!WARNING]
> >
> > Once you request a new token, the previous one is deleted *even if it has not yet expired*.
> > All subsequent API calls must use the new token.
## Bulk operations
Bulk operations enable you to perform actions on multiple rules simultaneously.
This is useful for scenarios like these:
* Publishing or unpublishing large sets of rules at once
* Applying consistent edits across multiple rules
* Deleting obsolete rules in batches
* Migrating rule sets between Commerce Studio instances
> [!NOTE]
>
> Bulk operations require an authentication token with the `commercestudio.bulkoperations` scope.
> See [Authentication scopes](#authentication-scopes).
### Supported bulk operations
The API supports these bulk operation types:
* `publishRule`: Make multiple rules active simultaneously.
* `unpublishRule`: Deactivate multiple rules at once.
* `editRule`: Apply the same updates to multiple rules.
* `deleteRule`: Remove multiple rules in one operation.
* `migrateRule`: Copy rules to another Commerce Studio instance.
### Example requests
Each bulk operation is a POST request to `/bulk-operations`.
The request body's `type` field determines which operation runs, and you can target rules by ID, external ID, or a `specification` filter (or a combination of all three), as shown in these examples:
**Publish**
Publish all draft rules tagged `holiday-2026`.
```json theme={"dark"}
{
"type": "publishRule",
"specification": {
"tags": ["holiday-2026"],
"publishState": "DRAFT"
}
}
```
**Unpublish**
Unpublish a specific set of rules by ID.
```json theme={"dark"}
{
"type": "unpublishRule",
"ruleIds": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}
```
**Edit**
Raise the precedence of every rule tagged `holiday-2026`.
This example sets `stageChanges` to `false`, so the patch applies immediately, including to already-published rules.
Set `stageChanges` to `true` instead to apply the patch to staging content only, leaving published rules live and unaffected until the changes are published.
```json theme={"dark"}
{
"type": "editRule",
"specification": {
"tags": ["holiday-2026"]
},
"patch": {
"precedence": 5
},
"stageChanges": false
}
```
**Delete**
Delete draft rules last modified before a cutoff date, excluding one rule you want to keep.
```json theme={"dark"}
{
"type": "deleteRule",
"specification": {
"publishState": "DRAFT",
"lastModifiedEnd": "2026-01-01T00:00:00Z"
},
"excludeRuleIds": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
]
}
```
**Migrate**
Migrate a rule to another Commerce Studio instance and publish it there immediately.
```json theme={"dark"}
{
"type": "migrateRule",
"ruleExternalIds": [
"promo-summer-2026"
],
"targetExperienceManagerInstanceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"published": true
}
```
### How bulk operations work
Bulk operations execute asynchronously.
When you create a bulk operation, the API returns immediately with an operation ID.
You can then poll the operation status to track progress.
**1. Create a bulk operation**
Send a POST request to `/bulk-operations` with the operation type and list of rule IDs or external IDs.
The API returns a bulk operation ID and initial status.
**2. Monitor operation progress**
Poll the bulk operation status using GET `/bulk-operations/{id}`.
The response includes the following information:
* Overall operation status:
* `IN_PROGRESS`: Operation is currently executing.
* `COMPLETED`: All rules processed successfully.
* `FAILED`: Operation failed before processing any rules.
* `COMPLETED_WITH_ERRORS`: Some rules succeeded, others failed.
* Individual status for each rule
* Error messages for any failed rules
> [!WARNING]
>
> Rules included in an active bulk operation cannot be modified until the operation completes.
> The `pendingInBulkOperation` field indicates when a rule is locked by a bulk operation.
**3. Handle completion**
When the operation reaches a terminal status (`COMPLETED`, `FAILED`, or `COMPLETED_WITH_ERRORS`), review the results.
For operations that completed with errors, the response identifies which rules succeeded and which failed.
For detailed information about bulk operation endpoints and parameters, see the [Bulk Operations API reference](/api-reference/bulk-operations/list-bulk-operations).
### Best practices
Follow these guidelines when using bulk operations:
* **Start with small batches**: Test bulk operations on a small set of rules before scaling up.
* **Monitor operation status**: Don't assume success—always check the final status and handle partial failures.
* **Handle errors gracefully**: When operations complete with errors, review which rules failed and retry them individually if needed.
* **Avoid modifying locked rules**: Check the `pendingInBulkOperation` flag before attempting to update rules.
* **Use external IDs for stability**: External IDs make it easier to retry operations and maintain consistency across environments.
For detailed information about bulk operation endpoints and parameters, see the [Bulk Operations API reference](/api-reference/bulk-operations/list-bulk-operations).
# Editor
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-editor
The Commerce Studio Editor lets you configure search ranking rules, manage product boosting and blocking, set facets, and preview search results in real time to optimize product visibility.
To access it, go to your site in Commerce Studio and click **Commerce Studio** > **Editor**.

> [!TIP]
>
> If the Editor doesn't display items in the expected format, you might need to configure Commerce Studio's [settings](/docs/lw-platform/lw-cs/cstudio-settings).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Use the Conditions Manager
At the top of the Editor you'll find the Conditions Manager.
This is where you set the conditions for any rules you create in Commerce Studio, such as the query, timeframe, category, and more.
The full page control displays in the Conditions Manager. To collapse the Conditions Manager, click the arrow below the Conditions Manager.

### Select a search profile to preview
The Preview dropdown shows you the available search profiles.
Query profiles represent different predefined search results that you can display on different pages of your customer-facing site, such as new items, seasonal items, sale items, and so on.
You might also have experimental query pipelines for testing different configurations.

Select the search profile that represents the items you want to preview.
### Use search conditions
When **Search** is selected in the Conditions Manager, you can enter queries and see the results in the live preview.

You can enter multiple queries that specify the qualifier for the search terms:
* **is**: The search query must match the defined term exactly. For example, if the rule is set to "\[is] black shoes", it only triggers when the user search is exactly "black shoes."
* **contains**: The search query must include one or more of the defined terms anywhere within the query. Each word is evaluated independently. For example, if the rule is set to "\[contains] black shoes", it triggers for any query containing "black" (such as "black boots") and any query containing "shoes" (such as "running shoes"). The words do not need to appear together or in a specific order.
* **contains phrase**: The search query must include the defined phrase in the exact word order entered. For example, if the rule is set to "\[contains phrase] black shoes", it triggers for "black shoes" or "men's black shoes," but not for "shoes black" or "black running shoes."
* **starts with**: The search query must begin with the defined word or phrase. For example, if the rule is set to "\[starts with] winter", it triggers for "winter jackets" or "winter boots," but not for "jackets for winter." Multi-word phrases respect word order, so "\[starts with] winter jackets" triggers for "winter jackets sale" but not for "jackets winter sale."
* **ends with**: The search query must end with the defined word or phrase. For example, if the rule is set to "\[ends with] manual", it triggers for "installation manual" or "product manual," but not for "manual installation guide." Multi-word phrases respect word order, so "\[ends with] near me" triggers for "pizza near me" but not for "near pizza me."
If you enter multiple queries, you can click to switch between them in the live preview.
You can also filter results by tags, fields, or date range.
### Use category conditions
The Category condition in the Conditions Manager impacts all of the following aspects of information simultaneously on the Commerce Studio Editor screen:
* Live preview, which displays the results returned for a user on that category page
* Rules (pin, boost, bury, redirects, and so on) created when the category is selected are saved and relate to that category, not to the entire site or in keyword searches
* Individual search result metrics such as impressions, CTR, conversion, and so on, are filtered based on the specified category so merchandisers can identify the individual search result's performance
The Category condition matches against the Solr field designated in the [Commerce Studio Settings **Category** field](/docs/lw-platform/lw-cs/cstudio-settings#configure-categories).
When you select **Category** in the Conditions Manager, you can enter values as a live typeahead search for categories, then select one or more to affect the live preview, rules, and search metrics. Just like search conditions, you can enter more than one category, then click to switch between them to view the effect on search results.

## Configure the item card display
The fields displayed in the Editor for any search profile are configured on the [Settings](/docs/lw-platform/lw-cs/cstudio-settings) screen.
Once those are configured, you can click **Preview Settings** in the Editor to toggle whether each field is displayed or hidden, including these:
* Item fields, such as the title, description, image, and so on.
* Variants such as color or image variants
* Metric fields such as impressions, add-to-cart (ATC), conversion rate (CVR), revenue per visit (RPV), and more.

## View and modify rules
In the Execute panel on the left side of the Editor, you can view the rules that apply to the current query or category.

### Rule state
Published rules are indicated by an up arrow in the **State** column. Draft rules are displayed with a pencil icon in the **State** column.
### Preview rule
The **Preview** feature lets you test to see the search results if a rule is removed from a query without actually deleting the rule.
You can click the **Preview** toggle `on` to execute that rule in the query, or click **Preview** `off` to exclude it from the query. The query results display based on the rules included in the query.
> [!NOTE]
>
> Your live site is *never* affected by setting the **Preview** toggle to `off`.
### Rule details
When you click a specific rule, the Rule Details section displays. You can view rule information such as name, creation information, and the action such as boost or bury.
In addition, you can scroll to see other information such as the history of changes to the rule, conflicts with other rules, and items linked to the rule.
You can edit, delete, or duplicate the rule. If the rule status is `Draft`, you can click **Publish** to make the rule active on your site. If the rule status is `Published`, you can click **Unpublish** to deactivate the rule, or click **Edit** to open the rule for editing, then click **Save as Draft** to save your changes as a draft attached to the published rule — the live version continues to serve your site until you publish the draft. For more information, see [Manage rules](/docs/lw-platform/lw-cs/cstudio-rules#manage-rules).

## Create new rules
When you create a new rule in the Editor, the rule is triggered by the current query or category in the **Conditions Manager**.
For example, when "party supplies" is the current query and you create and publish a rule, the rule is triggered only when end users search for "party supplies".
Likewise, when "Rugs" is the current category, a new rule is triggered only when end users view the "Rugs" category on your site.
There are several ways to create new rules in the Editor:
* Click **Create Rule** in the Execute panel to open the Visual Builder and select a rule type.
* Hold the pointer over any facet and click to create a facet rule.
* Hold the pointer over any item card and click the controls to create a rule that applies that item.
* Select the checkboxes for multiple items, then click the controls to create a rule that applies to that set of items.

> [!TIP]
>
> You can also create rules directly on the [Rules](/docs/lw-platform/lw-cs/cstudio-rules) screen using the Form Builder, which provides a form-based interface without the live preview.
## View product details
If you **Click for details**, the Product details panel displays and provides the following information: product name, image, position (ranking in results), triggered rules for the item, and the item analytics selected to view.
**Product image, position, and price**

**Total revenue**

**Total clicks and purchases**

## Ranking insights
This section displays the ranking factors for the results.
Factors include:
* **Sort**: Ranking signals such as relevance score
* **Query processing**: Any rules that fired when creating the result set, such as phrase detections
* **Analytics**: Selected performance metrics such as total revenue, total searches, total purchases, and average click position
For more information about these and other metrics in Analytics Studio, see [types of metrics](/docs/lw-platform/lw-analytics/analytics-screen#types-of-metrics).
**Sort factors**

**Analytics**

**Total searches and purchases**

**Average click position**

## Impressions metrics
Product impressions measure the number of times a product displays in search results in response to user queries. The product is counted each time it displays, even if users do not interact further with the product.
Impressions metrics can be displayed in [**Top Performing Products**](/docs/lw-platform/lw-analytics/analytics-screen#param-top-performing-products) in Analytics Studio and Commerce Studio Editor on the search results cards.
For information about how to use impressions metrics to enhance product visibility and conversions, see [Impressions metrics usage](#impressions-metrics-usage).
> **Analytics Studio Impressions metrics**
>
> If you select [**Top Performing Products**](/docs/lw-platform/lw-analytics/analytics-screen#param-top-performing-products) in Analytics Studio, the dashboard displays a column for the number of impressions per product.
>
> 
> **Commerce Studio Impressions metrics**
>
> To enable impressions to display on product cards in Commerce Studio Editor, complete the following steps:
>
> 1. Navigate to Commerce Studio Settings and scroll to the [Inline Analytics section](/docs/lw-platform/lw-cs/cstudio-settings#inline-analytics). Click the toggle `on` for Inline Analytics. This setting is required to display the Metrics option in Commerce Studio Editor Preview Settings. If the toggle is `off`, you cannot display any metrics on search results cards in Commerce Studio Editor.
>
> 
>
> Commerce Studio Setting enablement for Inline Analytics Metrics
>
> * **Metrics Duration.** The timeframe selected in the Metrics Duration field sets the default. But you can override this duration by selecting a different timeframe in Commerce Studio Editor Preview Settings Metrics.
>
> * **Document ID Field.** Enter the name of the search result document field used as the document ID when retrieving metrics from the Signals Store. The default is `id`.
>
> > [!NOTE]
> >
> > For detailed information, see [Commerce Studio inline analytics settings](/docs/lw-platform/lw-cs/cstudio-settings#inline-analytics).
>
> 2. Navigate to the Commerce Studio Editor screen and click **Preview Settings**. In the **Metrics** section, click the toggle to `on` for each metric you want to display on search results cards in Commerce Studio Editor.
>
> 
>
> Commerce Studio Editor Preview Settings Metrics
>
> The search results cards reflect all of the metrics selected. Here is an example with Impressions, Sales, and CVR metrics.
>
> 
### Impressions metrics usage
Merchandisers can use impressions metrics information to help optimize and measure the effectiveness of customer search experiences. Ensuring the appropriate products display is essential to visibility and increased conversions.
This section provides information about how merchandisers can use product impressions metrics to identify opportunities and take action in Commerce Studio.
#### Understand the context for engagement metrics
For example, a product with 1,000 impressions and 50 clicks has a 5% click-through rate, while a product with 50 impressions and 50 clicks has a 100% click-through rate. Without impression data, these scenarios appear identical.
If a product has thousands of impressions but few clicks, consider taking the following actions to improve the potential for conversions.
* Review product title, description, and image quality.
* Check if the product is appearing for relevant search queries.
* Consider adjusting product positioning or boosting rules.
#### Identify product visibility gaps
For example, products with high conversion rates but low impressions may be underexposed and represent missed revenue opportunities.
If a product has a high click-through rate and conversion rate but limited impressions, consider taking the following actions to improve product visibility and enhance the potential for even more conversions.
* Boost the product in relevant search queries to increase visibility.
* Add merchandising rules to feature the product more prominently.
* Ensure the product is properly categorized and tagged.
#### Measure the impact of merchandising efforts
For example, impressions metrics track how boosting rules, pinning, and other merchandising actions affect product visibility over time.
If a previously visible product shows decreasing impression trends, consider taking the following actions to improve product visibility and enhance the potential for conversions.
* Investigate if new products are displacing that product in search results.
* Review relevancy rules and ensure the product matches user search intent.
* Check inventory status and product availability.
#### Expand the number of products with high impression-to-conversion ratios
If most of the impressions are concentrated on a few products while others receive minimal exposure, consider taking the following actions to improve impressions for a greater number of products to enhance the potential for conversions.
* Diversify search results to expose a broader product range.
* Implement merchandising rules to rotate featured products.
* Balance automated relevance with strategic product visibility.
# Rewrites
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-query-rewrite
You can configure query rewrite rules to help users find more relevant results. Create rules to account for underperforming or misspelled search terms, identify phrases to boost items, map synonyms to alternative search terms, and remove words from queries that limit the results returned.
To learn more about the different rewrite rules, see [Types](#types). To start creating and publishing query rewrites, refer to the [Manage rewrites](#manage-rewrites) section.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Query rewrites vs. rules
Query rewrites improve the accuracy and relevance of search results by modifying the query. In contrast, [rules](/docs/lw-platform/lw-cs/cstudio-rules) manipulate the ranking and presentation of search results.
Query rewrites focus on the user’s intent. They take effect before the query is submitted and results are returned.
## Types
There are several different types of rewrite rules to choose from depending on your use case.
### Underperforming Queries
An underperforming rewrite, also known as a tail query rewrite, replaces a poorly-defined search term with an improved one. This function adds fields that are used as facets and tags to clarify intent, which improves the relevance of results.
* B2B organizations use this feature to change vague or incomplete user entries and add structured information that clarifies user intent and enhances relevant results. For example, if a user enters a query using general terms, a query rewrite can add business-specific terminology to improve the results returned.
* B2C organizations use this feature to interpret user entries that may be general or ambiguous and add fields that align with items in the product catalog. For example, you can create a tail query rewrite that replaces the query `iphone case yellow` with `iphone case yellow +color:"yellow"`, which uses the color field in your search facets.
* Knowledge management organizations use this feature to tag incomplete or imprecise user queries with existing content to improve discoverability of site information. For example, if the user enters `set password`, the tags may include `set password +doc_type:"login credentials"`.
### Misspelling Detections
A misspelling query rewrite detects and corrects common spelling mistakes.
When a customer enters a search term containing a known misspelling, the incorrect spelling is replaced with the spelling correction.
* B2B organizations enter corrections for industry-specific terminology, jargon, or technical terminology. For example, if your organization provides auto parts, a user might enter `brake petal`, so the correction would be `brake pedal`.
* B2C organizations enter corrections to common misspellings of items in the product catalog. For example, if your customers frequently misspell or mistype the word `sweater` as `sweatre`, you can define an entry to correct it.
* Knowledge management organizations enter terms from their content that users frequently misspell. For example, if medication clinical trials are part of the data, the user enters `metfrmin side effects`, so the correction your site enters would be `metformin`.
### Phrase Detections
A phrase rewrite identifies phrases used in search terms so that products with matching phrases are boosted in the search results.
This is helpful when users do not use quotation marks to identify phrases in their search terms.
For B2B, B2C, and knowledge management organizations, this function adds quotation marks around the phrase the user enters to match the entire phrase and not the individual words of the phrase. For example, without phrase detection, a search for the words `remote control` would show results for both `remote` and `control`.
With phrase detection, this search would correctly boost results for `"remote control"`.
### Synonym Detections
You can specify synonyms for a query so that alternative words with the same meaning are automatically used in the search query.
When a customer enters a search term with a synonym match, the alternative words are used instead of, or in addition to, the original search term.
B2B, B2C and knowledge management organizations enter synonyms for products and content specific to their site. For example, a B2C organization might enter synonyms such as `pullover` and `jumper` for the search term `sweater`.
Synonym query rewrites use one of two matching methods:
* `ONEWAY` synonyms replace the original query with the synonym.
Use a one-way synonym if you are confident the synonym is best for your product catalog.
For example, a running specialty store may use a one-way synonym to rewrite the term `sneakers` to `running shoes`.
* `SYMMETRIC` synonyms expand the query to include the original term and specified synonyms.
Use a symmetric synonym when terms are used interchangeably (`sweater` and `pullover`) to increase the volume of results.
### Word Removal
Use the remove words rewrite to simplify search queries and increase results. B2B, B2C, and knowledge management organizations determine words to remove that will improve query results for their site.
For example, a B2C organization may rewrite the query `best wireless headphones` to remove the word `best`, which restricts the number of results returned. The improved query, `wireless headphones`, returns more results.
> [!TIP]
>
> **FAQ: When should I use a remove words query rewrite instead of an underperforming rewrite?**
>
> Use a remove words query rewrite to broaden a query to include more results. Use an underperforming query rewrite to simplify a complex query (head) or expand a short query (tail).
## Manage rewrites
To get started working with query rewrites, navigate to Commerce Studio and click **Rewrites** to display the Query Rewrites screen.
### Create a query rewrite
1. Click **Create Query Rewrite**.
2. In the **New Rewrite** panel, select the rewrite **Type** and complete its fields.

The following tabs provide guidance for each type of rewrite:
**Underperforming Queries**
For **Type**, select **Enhance underperforming queries**.
1. In the **Tail Query** field, enter an underperforming query.
For example, `latest shoes`.
2. In the **Improved Query** field, enter the replacement query.
For example, `new shoes`.
To add another query, click the plus icon.
3. Optional: In the **Description** field, describe the rewrite.
For example, `improve to display new shoes`.
**Misspelling Detections**
For **Type**, select **Correct spelling errors**.
1. In the **Misspelled Query** field, enter a common misspelling.
For example, `intertainment`.
2. In the **Suggested Correction** field, enter the correct spelling.
For example, `entertainment`.
To add another correction, click the plus icon.
3. Optional: In the **Description** field, describe the rewrite.
For example, `correcting for entertainment`.
**Phrase Detections**
For **Type**, select **Detect Phrases**.
1. In the **Phrase** field, enter the phrase to detect.
For example, `new shoes with low heels`.
2. Optional: In the **Description** field, describe the rewrite.
For example, `phrase for new, low-heeled shoes`.
**Synonym Detections**
For **Type**, select **Add Synonyms**.
1. In the **Search Query** field, enter the term to add synonyms for.
For example, `shoes`.
2. In the **Synonym** field, enter a synonym.
For example, `sneakers`.
To add another synonym, click the plus icon.
3. Select a **Synonym Matching Method**:
* `ONEWAY` replaces the search query with the synonyms.
* `SYMMETRIC` expands the search query to include the original term and the synonyms.
4. Optional: In the **Description** field, describe the rewrite.
For example, `synonyms for shoes that are sneakers`.
**Word Removal**
For **Type**, select **Remove unnecessary words**.
1. In the **Words To Remove** field, enter the words to remove from queries.
For example, `retro`.
2. In the **Trigger Phrases** field, enter a phrase that contains the words to remove.
For example, `retro sneakers`.
To add another phrase, click the plus icon.
3. Optional: In the **Description** field, describe the rewrite.
For example, `remove retro to get all sneakers`.
3. Click **Publish** to make the rewrite active immediately, or click **Save as Draft** to save it unpublished.
### Edit a query rewrite
Click a query rewrite to open its details panel, which shows its fields and history.
You can edit, publish, and delete the rewrite from this panel.
1. In the details panel, click **Edit**.
You can also select **Edit** from the row's actions menu.
2. Change the fields.
You can't change the rewrite type.
3. Click **Save** to save your changes, or **Publish** to save and publish them.
For a published rewrite, only **Publish** is available, so changes take effect immediately.
### Publish a query rewrite
To publish a query rewrite, open its details panel, click **Publish**, and confirm.
Published query rewrites take effect immediately.
To unpublish a rewrite, click **Unpublish** instead.
The **Rule State** column shows whether each rewrite is published.
### Delete a query rewrite
To delete a query rewrite, do one of the following, and then confirm:
* In the details panel, click **Delete**.
* From the row's actions menu, select **Delete**.
> [!WARNING]
>
> Query rewrites are deleted permanently. There is no way to undo this action.
### Bulk actions
Select the checkboxes for multiple query rewrites to display bulk actions:
* **Publish** publishes the selected unpublished rewrites.
* **Unpublish** unpublishes the selected published rewrites.
* **Export** downloads the selected rewrites as a CSV file.
* **Delete** permanently deletes the selected rewrites.
Each action shows how many rewrites it applies to.
Publish, unpublish, and delete ask for confirmation.
## Effective workflows for teams
Your team’s Data Analyst monitors Analytics Studio to identify low performing queries, recommends recommend which queries should be rewritten, and helps verify query rewrites are effective.
Apart from the insights Analytics Studio provides, your team may start with existing industry knowledge. For example, some clothing brands prefer the term "pant" over "pants." Depending on your catalog, your team’s Product Manager may create a synonym query rewrite to treat the query `pants` the same as the query `pant`.
Your Customer Experience Manager creates query rewrites based on knowledge of your customers' intent. For example, the CX Manager rewrites the query term `cheap` to the query terms `discount` or `sale`. These rewritten queries trigger rules that are used in a sales event.
# Rules
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-rules
Rules affect the order in which products appear in your search results.
Rules let you pin, boost, bury, and block specific items in your catalog.
You can also use rules to display custom banners, redirect customers to a different page on your site, set facets, and more.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
> **[Every rule in Commerce Studio](https://academy.lucidworks.com/paths/019cbff3-cf91-7ee8-a1e0-ea69743d60d1)**
>
> Learn how to use every rule type in Commerce Studio to improve search results and merchandising. This course provides detailed guidance on boost, pin, bury, block, facets, banners, redirects, and advanced configurations.
Click your organization type to see examples of how to use rules to benefit your business goals:
**Business-to-Consumer**
B2C organizations use rules to promote items such as these to achieve business goals:
* Products for marketing campaigns
* New product launches
* Products with inventory levels the organization wants to reduce
* Any other business objective, such as increasing conversions
For example, a boost rule could be applied to promote summer sandals and clothing for an end-of-summer promotion.
**Business-to-Business**
B2B organizations use rules to promote the most relevant items, services, and documents based on customer queries, and provide similar products and specifications based on customer intent. For example, if your organization sells computer memory components to distributors, the results include installation instructions and specifications that distributors can confirm and provide to their customers.
**Knowledge Management**
Knowledge management organizations use rules to retrieve and display the most relevant documents based on user queries. For example, an organization that provides scientific study results for medication clinical trials may pin the most recent results, while burying results for previous studies.
## Rules vs. query rewrites
Both rules and query rewrites can be configured to help return the best search results to your users.
Query rewrites allow you to alter and interpret search terms in multiple ways so relevant results are delivered.
Rules changes the order in which search results are displayed, allowing you to promote certain items over others.
Although query rewrites are configured in the [Rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite) screen, you will see the effects of those rules on the Editor screen.
## How rules work
Rules contain [conditions](#conditions) and [actions](#actions).
When a condition or a combination of conditions is met, the rule performs an action.
[Commerce Studio Rules](https://app.supademo.com/embed/cmucrswqh028qxr0jrcinhc43?embed_v=2\&utm_source=embed)
## Conditions
You can trigger rules on a single condition or a combination of conditions.
**Dates** `string`
The date and time range for the rule. Click the field to select a date and time, or enter manually. For example, `05/15/2026 12:00`.
**Field Value** `string`
The field value to which the rule applies. For example, you can specify the `Color` field and set it to `Color: Black`. and multiple values for a given field to create more specific rules. For example, if you set the `Color` field to `Color: Black` and specify the `Brand` field to include multiple brands, then the rule triggers only if the Color and Brand field conditions are satisfied.
**Query** `string`
The query that triggers the rule. You must select a **Query Matching Method** to determine when a rule triggers.
* **is**: The search query must match the defined term exactly. For example, if the rule is set to "\[is] black shoes", it only triggers when the user search is exactly "black shoes."
* **contains**: The search query must include one or more of the defined terms anywhere within the query. Each word is evaluated independently. For example, if the rule is set to "\[contains] black shoes", it triggers for any query containing "black" (such as "black boots") and any query containing "shoes" (such as "running shoes"). The words do not need to appear together or in a specific order.
* **contains phrase**: The search query must include the defined phrase in the exact word order entered. For example, if the rule is set to "\[contains phrase] black shoes", it triggers for "black shoes" or "men's black shoes," but not for "shoes black" or "black running shoes."
* **starts with**: The search query must begin with the defined word or phrase. For example, if the rule is set to "\[starts with] winter", it triggers for "winter jackets" or "winter boots," but not for "jackets for winter." Multi-word phrases respect word order, so "\[starts with] winter jackets" triggers for "winter jackets sale" but not for "jackets winter sale."
* **ends with**: The search query must end with the defined word or phrase. For example, if the rule is set to "\[ends with] manual", it triggers for "installation manual" or "product manual," but not for "manual installation guide." Multi-word phrases respect word order, so "\[ends with] near me" triggers for "pizza near me" but not for "near pizza me."
**Query Profile** `string`
Trigger this rule on a specified query profile. This value must match an existing Fusion query profile, which points to a specific configuration.
> **Query matching methods**
>
> You must select a **Query Matching Method** to determine when a rule triggers:
>
> * **is**: The search query must match the defined term exactly. For example, if the rule is set to "\[is] black shoes", it only triggers when the user search is exactly "black shoes".
>
> * **contains**: The search query must include one or more of the defined terms anywhere within the query. Each word is evaluated independently. For example, if the rule is set to "\[contains] black shoes", it triggers for any query containing "black" (such as "black boots") and any query containing "shoes" (such as "running shoes"). The words do not need to appear together or in a specific order.
>
> * **contains phrase**: The search query must include the defined phrase in the exact word order entered. For example, if the rule is set to "\[contains phrase] black shoes", it triggers for "black shoes" or "mens black shoes," but not for "shoes black" or "black running shoes".
>
> * **starts with**: The search query must begin with the defined word or phrase. For example, if the rule is set to "\[starts with] winter", it triggers for "winter jackets" or "winter boots," but not for "jackets for winter". Multi-word phrases respect word order, so "\[starts with] winter jackets" triggers for "winter jackets sale" but not for "jackets winter sale".
>
> * **ends with**: The search query must end with the defined word or phrase. For example, if the rule is set to "\[ends with] manual", it triggers for "installation manual" or "product manual," but not for "manual installation guide". Multi-word phrases respect word order, so "\[ends with] near me" triggers for "pizza near me" but not for "near pizza me".
> **[Commerce Studio: Starts With/ Ends With Rules](https://academy.lucidworks.com/training/019feca8-d6a0-744a-992e-3c23cbaf6cfa/overview)**
>
> Learn how to use the starts with and ends with query matching methods in Commerce Studio rules to trigger rules based on how a query begins or ends.
## Actions
You can only apply one action per rule. Commerce Studio alerts you if you create multiple rules with conflicting actions. For example, a conflict occurs if you create rules that boost, block, and bury the same item.
### Rerank

Boost, pin, bury
#### Boost
Increases the ranking of one or more products so they move up in the search results.
##### Boost by attributes
Boosts items in the search results that match selected attributes, based on the weight given the attribute in a slider. This is the recommended type of boost because it adapts to changing catalogs and reflects a broader merchandising strategy.
This demo describes how to create a boost rule by specifying attributes in the Commerce Studio Rules screen (Form Builder).
[Boost by Attribute](https://app.supademo.com/embed/cmuczuywh07fpqmgl2gnumtey?embed_v=2\&utm_source=embed)
> [!NOTE]
>
> If you click **Create Rule** and then select **Visual Builder**, the Commerce Studio Editor screen displays and you can create a rule from that screen.
You can boost items based on multiple attributes, including multiple values in one category.
* **Within a single attribute**: When you select multiple values for one attribute (for example, `Color: Black, Gray`), items matching any of those values are included using **OR logic**, so items matching either Black or Gray are boosted.
* **Across multiple attributes**: You can combine different attribute categories using **AND logic** for more granular targeting. For example, if you set `Color: Black, Gray` AND `Count: 40, 50`, the rule boosts only black or gray items that come in packs of 40 or 50. Items must match at least one value from each attribute category.
> [!NOTE]
>
> Existing attribute rules continue to use OR logic between attributes, ensuring backward compatibility for older rules.
> **Boost Param examples**
>
> The **Boost Param** dropdown sets how the boost is applied to matching products.
> Enter your query expression in the **Boost Query** field.
>
> | Boost Param | Boost Query example | Effect on products |
> | - | - | - |
> | `bq` | `category_s:"Small Business"^5` | Additive. Products matching the query receive an extra relevance boost on top of their normal ranking. The number after `^` sets how much weight to add. |
> | `boost` | `if(termfreq(brand_s,'Acme'),10,1)` | Multiplicative. Products where the condition is true have their score multiplied by the specified number (here, 10×). Products where the condition is false are multiplied by 1 (unchanged). |
This rule type also supports these comparison operators for numerical fields:
* **Equals** matches the specified value exactly (text or numeric).
* **Greater than** matches numeric values greater than the specified number.
* **Less than** matches numeric values less than the specified number.
* **Greater than or equal to** matches numeric values greater than or equal to the specified number.
* **Less than or equal to** matches numeric values less than or equal to the specified number.
* **Between** matches numeric values within the specified range (inclusive).
* **Not equal to** excludes values that match the specified value exactly.
> [!NOTE]
>
> Numeric comparison operators and boosting by AND attributes require Fusion 5.17.1 or later.
##### Boost items
Boosts specific items to the top of the results. These items must be identified individually. This approach is more precise but less flexible than boost by attributes.
#### Pin items
Pins products to an exact location within search results. This allows precise control over product placement. For example, you can ensure certain products always appear next to each other.
> [!NOTE]
>
> Another example is that you can pin a product to a specific position that reliably appears on page 2 after pagination. This capability requires the applicable Fusion patch to be installed. For more information, contact your Lucidworks support representative.
#### Bury
Moves selected items to the bottom of search results. Unlike the Block action, products are not removed entirely from the search results.
##### Bury by attributes
Buries items in the search results that match selected attributes, based on the weight given the attribute in a slider. This is the recommended type of bury for the same reasons as boost by attributes.
For example, you can use this to de-emphasize a particular brand in your results without removing it entirely.
> [!NOTE]
>
> The steps to bury by attributes are the same as those described in the [Boost by attributes](#boost-by-attributes) demo, except you would select the **Bury** in the **Action** field.
You can bury items based on multiple attributes, including multiple values in one category.
* **Within a single attribute**: When you select multiple values for one attribute (for example, `Color: Black, Gray`), items matching any of those values are included using **OR logic**, so items matching either Black or Gray are buried.
* **Across multiple attributes**: You can combine different attribute categories using **AND logic** for more granular targeting. For example, if you set `Color: Black, Gray` AND `Count: 40, 50`, the rule buries only black or gray items that come in packs of 40 or 50. Items must match at least one value from each attribute category.
> [!NOTE]
>
> Existing attribute rules continue to use OR logic between attributes, ensuring backward compatibility for older rules.
This rule type also supports these comparison operators for numerical fields:
* **Equals** matches the specified value exactly (text or numeric).
* **Greater than** matches numeric values greater than the specified number.
* **Less than** matches numeric values less than the specified number.
* **Greater than or equal to** matches numeric values greater than or equal to the specified number.
* **Less than or equal to** matches numeric values less than or equal to the specified number.
* **Between** matches numeric values within the specified range (inclusive).
* **Not equal to** excludes values that match the specified value exactly.
> [!NOTE]
>
> Numeric comparison operators and burying by AND attributes require Fusion 5.17.1 or later.
##### Bury items
Buries specific items to the bottom of the results. These items must be identified individually.
Like boost items, this approach is more precise but less flexible than bury by attributes.
#### Block
Removes selected items from search results entirely. Blocked items don't appear for matching searches.
##### Block by attributes
Applies block based on selected attributes. Products matching the specified attributes are completely removed from search results.
You can block items based on multiple attributes, including multiple values in one category.
* **Within a single attribute**: When you select multiple values for one attribute (for example, `Color: Black, Gray`), items matching any of those values are included using **OR logic**, so items matching either Black or Gray are blocked.
* **Across multiple attributes**: You can combine different attribute categories using **AND logic** for more granular targeting. For example, if you set `Color: Black, Gray` AND `Count: 40, 50`, the rule blocks only black or gray items that come in packs of 40 or 50. Items must match at least one value from each attribute category.
> [!NOTE]
>
> Existing attribute rules continue to use OR logic between attributes, ensuring backward compatibility for older rules.
This rule type also supports these comparison operators for numerical fields:
* **Equals** matches the specified value exactly (text or numeric).
* **Greater than** matches numeric values greater than the specified number.
* **Less than** matches numeric values less than the specified number.
* **Greater than or equal to** matches numeric values greater than or equal to the specified number.
* **Less than or equal to** matches numeric values less than or equal to the specified number.
* **Between** matches numeric values within the specified range (inclusive).
* **Not equal to** excludes values that match the specified value exactly.
> [!NOTE]
>
> Numeric comparison operators and blocking by AND attributes require Fusion 5.17.1 or later.
##### Block items
Applies block to specific products that must be identified individually. These products will be completely removed from search results.
### Facets
#### Manage facets
Customizes which facet categories appear in the query response, their display order, and their individual configuration settings. For example, if your site sells clothing, you can configure facet categories for brand, color, price, size, and other attributes.
Each facet category can be extensively customized to control how values are displayed and how users interact with them.
> **Advanced configuration options**
>
> **Type** `enum` *required* (default: Term)
>
> Specifies how facet values are generated. **Term** generates discrete values like brand names or colors. **Gap Range** generates numeric ranges like price brackets or size ranges.
>
> **Value Selection** `enum` *required* (default: Multi-select)
>
> Controls how users can select facet values. **Single-select** allows users to choose only one value at a time. **Multi-select** allows users to choose multiple values simultaneously.
>
> **Value Order** `enum` *required* (default: Count)
>
> Determines how facet values are sorted. **Index** sorts values in alphabetical or numeric order. **Count** sorts values by the number of matching products.
>
> **Minimum Count** `integer` *required* (default: 1)
>
> Sets the minimum number of matching products required for a facet value to be displayed. Values with fewer matches will be hidden from the facet list.
>
> **Boost Values** `array`
>
> Promotes specific facet values higher in the list, making them appear more prominently to users.
>
> **Bury Values** `array`
>
> Moves specific facet values lower in the list, de-emphasizing them without removing them entirely.
>
> **Block Values** `array`
>
> Removes specific facet values from display entirely, preventing them from appearing in the facet list.
### Advanced
#### Add banner
Associates an image URL with a search rule and includes it in the search results JSON response. You can specify the image URL and optionally define a page zone identifier. Your frontend application can then consume this data to dynamically display promotional banners or images alongside the corresponding search results.
**Banner URL** `string` *required*
The URL of the image to display as a banner.
**Banner Zone** `string`
An identifier specifying which zone or area of the page the banner should appear in.
> **Response JSON example**
>
> ```json theme={"dark"}
> "banner": [{
> "url": "https://example.com/assets/holiday-banner.png",
> "zone": "top-wide"
> }]
> ```
#### Filter items
Applies [filter queries](https://solr.apache.org/guide/common-query-parameters.html) (`fq`) to the query and changes the results so a pre-selected set of content displays.
#### Set JSON configuration
Allows you to define a custom JSON blob that will be included in the search results response. You can input any valid JSON structure, which your frontend application can then interpret and use for custom functionality. This provides flexibility to pass arbitrary data alongside search results for frontend consumption.
**Blob type** `string`
An optional identifier used primarily for categorizing or identifying the blob.
**JSON blob** `string` *required*
The custom JSON blob to include in the search results response.
> **Response JSON example**
>
> ```json theme={"dark"}
> "jsonBlob": {
> "example-blob": [{
> "event": "Black Friday Sale 2026",
> "startDate": "11/27/2026 00:00",
> "endDate": "11/27/2026 23:59",
> "description": "Our biggest sale of the year! Save up to 70% on select items during our Black Friday event.",
> "banner": {
> "url": "https://example.com/assets/black-friday-2026-banner.png",
> "zone": "top-wide"
> },
> "promotionCode": "BF2026"
> }]
> },
> ```
#### Redirect
Includes a redirect URL in the search results JSON response. Your frontend application can consume this data to redirect users to a specific destination, such as dedicated landing pages or custom pages for queries that return zero results.
**Path or URL** `string` *required*
The URL or path to redirect users to.
> **Response JSON example**
>
> ```json theme={"dark"}
> "redirect": ["https://example.com/new-location"]
> ```
#### Set response value
Sends an arbitrary value to the frontend or pipeline to trigger another action. This action can be combined with other actions within the same rule. For example, an e-commerce website may use the response value action to display an advertisement.
#### Set parameters
Sets a [parameter name and value](https://solr.apache.org/guide/solr/latest/query-guide/common-query-parameters.html) to a search query. For example, the sort order for the results, or a filter that affects results.
## Advanced Grouping
Advanced grouping is a conditional, rule-based approach to product [variant grouping](/docs/lw-platform/lw-cs/cstudio-settings#variants) that enables different grouping behaviors based on rules.
You can implement advanced grouping using the Set Parameters rule type.
When you create a Set Parameters rule that includes the required grouping parameters, Commerce Studio automatically detects and enables grouping for queries where the rule conditions are met. This conditional behavior means grouping can activate for some searches but not others, based on your rule configuration.
Advanced grouping enables scenarios like these:
* Apply color-based grouping for apparel queries but ID-based grouping for electronics
* Group by size for furniture searches but by style for home decor
* Enable grouping only for specific categories or query types
* Switch grouping fields based on seasonal campaigns or promotions
### Enable advanced grouping
To enable advanced grouping, your Set Parameters rule must include the following:
**expand.rows** `number` *required*
Controls how many variants to display per group.
**expand** `boolean` *required*
Must be set to `true` to enable expansion.
**fq** `string` *required*
Contains the Solr `collapse` syntax that defines the grouping field.
Here's an example of the syntax for the `fq` parameter:
```
{!collapse tag=collapse field=FIELD_NAME nullPolicy=expand}
```
It includes the following parameters:
**tag** `string` *required*
This must be set to `collapse`.
**field** `string` *required*
The field to group by (for example, `id`, `color_s`, `product_family_s`).
**nullPolicy** `string` *required*
Determines behavior for items without a value in the grouping field (typically `expand`).
### Example configurations
These example configurations illustrate how to configure advanced grouping for different scenarios:
**Group by product ID**
```
{!collapse tag=collapse field=id nullPolicy=expand}
```
**Group by color**
```
{!collapse tag=collapse field=color_s nullPolicy=expand}
```
**Group by custom field**
```
{!collapse tag=collapse field=Collapse_Field_s nullPolicy=expand}
```
## Rule edit states
Facet rules in Commerce Studio support draft and published states, allowing you to prepare changes before making them live.
### Draft and published states
When you create or modify a facet rule, you can save it as a draft without immediately publishing it to your live site. Drafts support the following tasks:
* Prepare changes in advance
* Review configurations before going live
* Test rule behavior internally
A draft rule is not active on your site until you explicitly publish it. Once published, the rule becomes active and affects search results.
### Concurrent editing
Commerce Studio does not lock rules when multiple users edit them. If two users edit the same facet rule simultaneously, the last user to save their changes will overwrite any previous modifications. Commerce Studio does not maintain version history for rules, so there is no way to recover overwritten changes.
To avoid conflicts, coordinate with team members before editing the same rule.
## Create rules
Commerce Studio offers two ways to create rules: the Visual Builder and the Form Builder.
### Visual Builder
The Visual Builder lets you create rules while previewing live search results in the [Editor](/docs/lw-platform/lw-cs/cstudio-editor). Use this approach when you want to see how a rule affects item ranking in context as you configure it.
[Create a rule in Commerce Studio Editor](https://app.supademo.com/embed/cmjd7f1gn01s64e35foztaypg?embed_v=2\&utm_source=embed)
> [!NOTE]
>
> More information about creating rules in the Editor, including options to create rules for individual items, is in the [Commerce Studio Editor](/docs/lw-platform/lw-cs/cstudio-editor) topic.
### Form Builder
The Form Builder lets you create rules directly on the Rules screen without the live preview. Use this approach when you know exactly what rule you want to create and do not need to see the search results in context.

Form Builder in Commerce Studio
To create a rule using the Form Builder:
**1. Open the Form Builder**
On the Rules screen, click **Create Rule** and select **Form Builder**.
**2. Configure the rule fields**
Configure the rule fields in the panel that appears.
> **Configuration options**
>
> **Name** `string` *required*
>
> A name for the rule. You can edit this at any time.
>
> **Precedence** `integer` *required*
>
> Determines when rules should take effect in relation to other triggered rules. A higher number means higher precedence. For example, a rule with precedence of `10` will take effect before a rule with precedence of `3`. If two rules have the same precedence, the newer rule takes effect first.
>
> **Conditions** `object` *required*
>
> The conditions that trigger the rule. These correspond to the condition types described in [Conditions](#conditions).
>
> **Action** `enum` *required*
>
> The action the rule performs when its conditions are met. Select an action type from the dropdown. The form updates to show the configuration fields for that action type. For details on each action type, see [Actions](#actions).
>
> **Description** `string`
>
> Optional text describing the purpose of the rule.
**3. Save or publish the rule**
Click **Save as Draft** to save the rule without publishing it, or click **Publish** to make it immediately active on your site.
To edit a rule that is already published, see [Edit a published rule](#edit-a-published-rule).
## Manage rules
The Rules screen lists all rules in your Commerce Studio environment and is where you publish, edit, filter, and perform bulk actions on them.
### Rule states
Each rule on the Rules screen is in one of the following states:
* **Published.** The rule is active on your site.
* **Draft.** The rule is saved but is not active on your site.
* **Published with draft edits.** A published rule has unpublished edits saved as a draft. The published version remains active on your site, and the draft appears as a second row beneath it so you can see and act on both.
### Edit a published rule
When you edit a published rule, the published version continues to serve your site until you explicitly publish the changes. Your edits are shown in the Editor as a draft so you can preview their impact without affecting customers.
When you finish editing, click **Publish** to replace the published version with your edits and apply them to your site immediately. Alternatively, click **Save as Draft** to save your edits as a draft attached to the published rule. The published version remains live, and the draft appears beneath it on the Rules screen.
> [!NOTE]
>
> A published rule can have only one draft edit at a time. If a draft already exists, opening the rule for editing adds to the existing draft.
### Manage a published rule with draft edits
When a published rule has draft edits, both versions appear as two rows on the Rules screen. The actions available depend on which row you act on.
On the **published row**:
* **Edit** is disabled. Edits must be made to the draft version.
* **Delete** removes both the published rule and the draft edits.
* **Duplicate** is disabled. The draft edits must be published or deleted before the rule can be duplicated.
* **Unpublish** unpublishes the rule and deletes the draft edits.
On the **draft row**:
* **Edit** opens the draft for further editing.
* **Delete** discards the draft and restores the rule to the published version.
* **Publish** replaces the published version with the draft and applies it to your site.
### Bulk actions
When you select multiple rules from the Rules screen, the bulk action options let you update all of the selected rules at one time.
Watch this demo to learn how to select multiple Commerce Studio rules and update them all at once.
[Bulk Update Commerce Studio Rules](https://app.supademo.com/embed/cmulegwjl039aqm9gfcgrwrrc?embed_v=2\&utm_source=embed)
The following bulk options are available based on the rules selected.
> **Publish multiple rules**
>
> 1. After you select the rules to publish, click **Publish** from the bulk action option bar. The confirmation window displays, and indicates any rules that conflict with the rules you want to publish.
>
> 
>
> Publish multiple rules
>
> 2. To proceed, click **Publish**.
> **Unpublish multiple rules**
>
> 1. After you select the rules to unpublish, click **Unpublish** from the bulk action option bar. The confirmation window displays and indicates the number of rules to unpublish.
>
> 
>
> Unpublish multiple rules
>
> 2. To proceed, click **Unpublish**.
> **Edit multiple rules**
>
> 1. After you select the rules to modify, click **Edit** from the bulk action option bar.
>
> 
>
> Edit multiple rules
>
> 2. Click the **Tags** field to select from the list. If you click **+** you can add another tag.
>
> 3. Click the **Query Profiles** field to select from the list. If you click **+**, you can add another query profile.
>
> 4. Select either **Save as Draft** or **Publish changes** for the rules you are editing.
>
> > [!NOTE]
> >
> > If you select to change a rule that has existing draft edits, this edit overwrites those existing edits.
>
> 5. Click **Apply** to save the changes to the selected rules.
> **Migrate multiple rules to a different Commerce Studio environment**
>
> This option lets you select multiple rules to migrate from one Commerce Studio environment to a different Commerce Studio environment. For example, you might want to migrate rules in your Development environment to your Production environment.
>
> > [!WARNING]
> >
> > Before you use this option, the following issues need to be considered.
> >
> > * The bulk migration doesn't let you filter which rules are migrated by author, label, campaign, or tag.
> >
> > * The bulk migration doesn't detect if a rule already exists in the target environment that might conflict with a rule being migrated.
> >
> > * It is vital to preview what will change before committing to the migration.
>
> 1. After you select the rules you want to migrate from one Commerce Studio environment to a different Commerce Studio environment, click **Migrate** from the bulk action option bar.
>
> 
>
> Migrate multiple rules to a different Commerce Studio environment
>
> 2. Click the **Target Environment** field to select from the list.
>
> 3. Select either to migrate the selected rules and designate the rules with the **Draft** or **Published** status.
>
> 4. Click **Migrate** to complete the migration of those rules.
>
> 5. Access the target Commerce Studio environment and verify the rules migrated correctly.
> **Export multiple rules to a CSV file**
>
> This option lets you select rules and export them to a CSV file for processing outside of Commerce Studio.
>
> After you select the rules to export, click **Export** from the bulk action option bar. The rules are written to a CSV file that is saved to your computer.
> **Delete multiple rules**
>
> After you select rules you want to remove, click **Delete** from the bulk action option bar. Click **Delete** to confirm the removal of the rules and any draft edits on those rules.
>
> > [!WARNING]
> >
> > The selected rules and **any draft edits** on the rules are deleted using this process. Verify that is the action you want to take before confirming the deletion.
> **Deselect the rules currently selected**
>
> To deselect all of the rules currently selected on the screen, click **Deselect** from the bulk action bar.
## Examples to improve search results using rules
Commerce Studio allows you to apply targeted actions when a search query contains specific terms. These actions don't require code changes and support the following business goals:
* Improved relevance
* Faster discovery of the content users are seeking
This section provides examples of how to use rules to improve search results.
**Ecommerce**
B2B and B2C organizations can use rules to improve product discovery and merchandising outcomes by performing the following actions. These examples describe some actions for a bookstore website.
* **Promote high-priority products.** Boost books from a popular series so they appear higher in search results when users search by author name.
* **Remove outdated or unavailable items.** Block discontinued titles to ensure only relevant, purchasable books appear in results.
* **Highlight specific products.** Boost selected new or overstocked titles to increase visibility and drive sales.
* **Refine results by intent.** Filter results to show only children’s and young adult books when users search for children’s content.
* **Improve ranking within related groups.** Boost items within a series so the most popular titles appear first when users search for that series.
* **Target branded searches.** Use "\[starts with]" to boost promotional campaigns when users begin their query with a specific brand name, without affecting queries where the brand appears later in the query.
* **Support location-based queries.** Use "\[ends with] near me" to apply location-specific filtering or boosting logic for geo-modified searches.
* **Manage available facets.** Display genre facets on the homepage and top author facets on search results pages to help users refine results.
* **Apply advanced configurations.** Use a `Set Banner` rule to display a promotional banner when users search for mystery titles.
**Knowledge management**
B2B, B2C, and Knowledge management organizations can use rules to improve user search experiences for documents on their site by performing the following actions.
For example, organizations could set rules to enhance the discovery of internal policies and procedures for employees, and different rules for searches about external, customer-facing policies, procedures, and product specifications.
These examples describe some actions that can be applied to knowledge and support content to reduce friction and guide users quickly.
* **Surface critical content.** Pin a gift card information document to the top of results for searches including the term, "gift".
* **Guide users to key destinations.** Redirect users to a "Contact Us" page when they search for terms such as "email" or "contact".
* **Target support documentation.** Use "\[ends with] manual" to boost user manuals and product documentation, or use "\[ends with] pdf" to prioritize downloadable resources.
* **De-emphasize outdated content.** Bury notices related to discontinued programs so they appear lower in results.
* **Prioritize important documents.** Redirect to the privacy policy page when a user searches for "privacy policy".
* **Manage grouped content visibility.** Bury older product support documents within a group while pinning new program information to the top for related searches.
# Settings
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-settings
In Commerce Studio's settings, you can configure what the [Editor](/docs/lw-platform/lw-cs/cstudio-editor) displays for each search profile.
Some of these settings require the names of data fields in Fusion, but you can type to search for the fields you need.
In your site on Lucidworks Platform, navigate to **Commerce Studio** > **Settings** to access these settings.
Start by selecting a search profile to configure.
Search profiles represent different predefined search results that you can display on different pages of your customer-facing site, such as new items, seasonal items, sale items, and so on.
You might also have experimental search profiles for testing different configurations.
The configuration you create here determines how the item cards are displayed in the Editor when the same search profile is selected.

## Configure Search Results
In the **Search Results** section, you can configure the fields displayed for each result item in the Editor.
Once you configure these settings, you can turn different display fields on or off while you're working in the Editor using its [Preview Settings](/docs/lw-platform/lw-cs/cstudio-editor#configure-the-item-card-display).



### Layout
The **Layout** section lets you select to display search results in a vertical list or a grid pattern.

Select the option you want, click **Save**, and then verify the list displays on the Editor screen.
This demo explains the Layout options and how each displays search results.
[Search Results Layout in Commerce Studio](https://app.supademo.com/embed/cmt921799057eqmz1o5r8xw81?embed_v=2\&utm_source=embed)
### Fields Style
Under **Fields Style**, you can select and format the fields that the preview cards display in the Editor.
* To add a field, click the button.
* To change a field, click the field and type to search for another one.
* To change a field's display style, click the dropdown and select the style that best matches the field's data type.
### Variants
When you enable Variants, you can select the fields that contain data about different variants of your products. To enable product grouping in Commerce Studio, follow the procedure for your configuration.
**Fusion**
If you are using Fusion, configure grouping in your query pipeline. Then, configure grouping in Commerce Studio.
**1. Open your query pipeline**
In Fusion, open the query pipeline for which you want to configure grouping.
**2. Add query parameters**
The query profile must pass a `fq`, `expand`, and `expand.rows` query parameters.
1. Add a new **Additional Query Parameters** pipeline stage or edit an existing one.
2. Add the following query parameters:
**fq** `string`
**Parameters and Values**
**Parameter Name** `string` *required*
`fq`
**Parameter Value** `string` *required*
`{!collapse field=FIELD_NAME}`
**Update Policy** `enum` *required*
`default`
**expand** `boolean`
**Parameters and Values**
**Parameter Name** `string` *required*
`expand`
**Parameter Value** `boolean` *required*
`true`
**Update Policy** `enum` *required*
`default`
**expand.rows** `number`
**Parameters and Values**
**Parameter Name** `string` *required*
`expand.rows`
**Parameter Value** `number` *required*
The number of variant swatches displayed on each product card in Commerce Studio. For example, `5` displays 5 variant swatches on the product card. All variants are included in the response regardless of this value. This parameter must be set in Fusion or in the same Set Parameter Rule as the collapse parameter.
**Update Policy** `enum` *required*
`default`
3. Save the pipeline stage and pipeline configuration.
4. Verify that your query pipeline passes the query parameters you set up in previous steps. In the query workbench, open the **View As** selector and select JSON. Navigate to `responseHeader.params` in the response.

Query parameters in the response JSON
> [!NOTE]
>
> Setting a parameter requires proper Solr syntax. If you receive errors in Commerce Studio after completing these steps, verify that you set up these parameters correctly.
**3. Configure Commerce Studio**
Go to **Commerce Studio** > **Settings** and configure these options:

Variant settings in Commerce Studio
**Variant Field Name** `string`
The Fusion field containing visual data (image path or color) used for variant swatches on the product card. This information is used for visual display purposes only.
**Variant Field Type** `enum`
Specifies whether the variant field name contains an `image` or `color`, determining which type of swatch Commerce Studio displays. This information is used for visual display purposes only.
**Variant SKU ID** `string`
The field containing IDs of individual products collapsed into a single group in the Editor. This information is used for visual display of variant swatches and for creating rules to rerank products within the group.
> [!NOTE]
>
> These configurations determine how products with variants are visualized in the Editor.
**4. Verify your settings**
Save your changes, then visit the Editor to verify that items are correctly grouped.
**Core Settings**
If you are using Core Settings, enable product grouping in the Lucidworks Platform UI.
**1. Turn it on**
Go to **Core Settings** > **Relevance** and turn on **Product Grouping**:

Product Grouping toggle in Core Settings
**2. Configure Commerce Studio**
Go to **Commerce Studio** > **Settings** and configure these options:

Variant settings in Commerce Studio
**Variant Field Name** `string`
The Fusion field containing visual data (image or color) used for variant swatches on the product card. For visual display purposes only.
**Variant Field Type** `enum`
Specifies whether the variant field name contains an `image` or `color`, determining which type of swatch Commerce Studio displays. For visual display purposes only.
**Variant SKU ID** `string`
The field containing IDs of individual products collapsed into a single group in the Editor. This information is used for visual display of variant swatches and for creating rules to rerank products within the group.
**3. Verify your settings**
Save your changes, then visit the Editor to verify that items are correctly grouped.
> [!TIP]
>
> For conditional, rule-based grouping that can vary based on queries, categories, or other conditions, see [advanced grouping](/docs/lw-platform/lw-cs/cstudio-rules#advanced-grouping) in the Rules documentation.
### Inline Analytics
When you configure and use the signals beacon and Analytics Studio to collect and display signal information, you can also enable Inline Analytics in Commerce Studio Settings, which lets you select the metrics to display in Commerce Studio Editor search results cards.
> **Enable Commerce Studio Impressions metrics**
>
> To enable metrics to display in Commerce Studio, complete the following steps:
>
> 1. Navigate to Inline Analytics and click the toggle `on`.
>
> > [!NOTE]
> >
> > IMPORTANT: This setting is required to display the Metrics option in Commerce Studio Editor Preview Settings. If the toggle is `off`, you cannot display any metrics on search results cards in Commerce Studio Editor.
>
> 
>
> Commerce Studio Setting enablement for Inline Analytics Metrics
>
> 2. Select a default option in the **Metrics Duration** field. This is the default duration for the Commerce Studio Editor Preview Settings Metrics section. Options include Last Hour, Last 24 Hours, Last 7 Days, Last 30 Days, and Last Year.
>
> > [!NOTE]
> >
> > The timeframe selected in the Metrics Duration field is the default. But you can override this duration by selecting a different timeframe in Commerce Studio Editor Preview Settings Metrics.
>
> 3. In the **Document ID Field**, enter the name of the search result document field used as the document ID when retrieving metrics from the Signals Store. The default is `id`.
>
> > [!NOTE]
> >
> > This is the Solr field that corresponds to the product identifier that your signals beacon logs for each item. The default value of `id` matches the Solr `uniqueKey` for most catalogs. However, use the value your catalog uses. Another example of the value used is `sku_s`.
>
> This value is used to calculate the search result's Impressions, ATC,
> Orders, Sales, RPV, and CVR data on the result card.
>
> > [!WARNING]
> >
> > If the Document ID Field doesn't match what your signals beacon records as the product identifier, the metrics cannot be calculated and a `--` placeholder displays on the result card.
>
> 4. Optionally, if you want to build a preview of how metrics display on the search result card before you deploy it in Commerce Studio Editor, you can select the metrics checkboxes for Impressions, Add-To-Cart (ATC), Orders, Sales, Revenue Per Visit (RPV), and Conversion Rate (CVR).
>
> In this example, all of the checkboxes except Impressions are checked, and the Settings Preview Result Card indicates how that displays:
>
> 
>
> 
>
> > [!NOTE]
> >
> > IMPORTANT: When you select these options, they only display on the Preview result card in Commerce Studio Settings. To select metrics to display on search result cards in Commerce Studio Editor, you must navigate to Commerce Studio Editor > Preview Settings > Metrics and select metrics options. For detailed information, see [Commerce Studio Editor Impressions metrics](/docs/lw-platform/lw-cs/cstudio-editor#impressions-metrics).
## Category
The **Category** field you select is the name of the Fusion Solr field that contains indexed values you use to categorize search results. The Solr field is populated during Fusion indexing using the connector field mapping or an index pipeline stage configured with Field Mapping, JSON, or Script. The field name can be any Solr field such as `title_s` or `category_s`. For a Solr field with multiple values, the field has a `ss` at the end. For example, `title_ss` or `categories_ss`.
The category values indexed in this field can be selected in the Commerce Studio Editor Conditions Manager, and apply to all of the following Editor features:
* Display category-specific results to users
* Mark specific rules that apply to that category and not the entire site
* Display search metrics for only the selected category
> **Guidelines and best practices for categories**
>
> These are the guidelines and best practices to consider when selecting the Solr field to use.
>
> * Use a dedicated string field that is a stable canonical value that reflects a category ID or a normalized breadcrumb path. Do not use a raw display label, an analyzed text field, or a free-text field.
>
> The Commerce Studio Editor's **Category** condition entered in the Condition Manager matches the literal indexed value, so exact matching is required. For example, in a B2B organization, category names may be updated to match procurement terminology or regulatory standards, so the underlying IDs should remain stable even when display labels change.
>
> * The field must be multivalued if items can belong to more than one category, for example, `categories_ss`.
>
> For example, a B2C product like a wool running jacket might belong to Running, Outerwear, and Sale simultaneously. In a B2B organization, a part might appear under both a product-type tree and an industry-application tree. And a knowledge article might be tagged under both a department and a content type.
>
> > [!WARNING]
> >
> > IMPORTANT: A single-valued field drops secondary category assignments, breaking both rules and facet counts.
>
> * In the Facet Fields section of the query pipeline, add the field to make category-level filtering available to users and drive Commerce Studio's per-category product-performance metrics.
>
> * For hierarchical categories where documents belong to a multi-level taxonomy, you need rules and facets to work at any level of that tree. For example, Electronics > Computers > Laptops.
>
> For this type of multi-level taxonomy, use a depth-prefix convention on a multivalued ancestor-path field, indexing each level as a separate value:
>
> * 0/Electronics
> * 1/Electronics/Computers
> * 2/Electronics/Computers/Laptops
>
> This lets Solr use facet prefix queries to retrieve only nodes at a given depth, and enables breadcrumb navigation and parent-child drill-down in your UI. Rules scoped to a parent node, such as Electronics, automatically apply to all child nodes.
> **Configure a Fusion pipeline for categories**
>
> To configure a Fusion pipeline with categories that can be used in Commerce Studio, complete the following steps:
>
> **1. Add depth-prefixed values**
>
> In your index pipeline, add a JavaScript Index Stage or Field Mapper to generate the depth-prefixed values and write them to a multivalued string field. For example, `category_path_ss`.
>
> **2. Add leaf-level category**
>
> Add a second field for the leaf-level category for rules that target only the most specific node. For example, `category_leaf_s`.
>
> **3. Set facet field**
>
> Set `category_path_ss` as a facet field in your query pipeline in the Field Facet stage.
>
> **4. Set tree depth**
>
> In your query pipeline, set the `facet.prefix` parameter to `{depth}/` to retrieve only one level of the tree at a time. For example, `1/`.
>
> **5. Add optional companion field**
>
> Optionally, add a companion field such as `category_parents_ss`, listing only non-leaf nodes. When a facet value displays in this field, your UI renders an expand control. Otherwise it renders a leaf link, avoiding extra Solr round-trips.
> **Configure categories in Commerce Studio**
>
> To configure categories used in Commerce Studio, complete the following steps:
>
> 1. In the **Category** field, select the identified Fusion Solr field name.
>
> > [!NOTE]
> >
> > This setting is per search profile. If you have multiple search profiles, configure the category field for each one that serves category pages.
>
> 
>
> 2. Verify the values in the **Examples** section reflect the values you need for categories.
>
> > [!NOTE]
> >
> > When you select a value in the **Category** field, Commerce Studio accesses that Solr field using the read-only introspection endpoints granted to the `lwp_user` and `lwp_service_account` roles, and retrieves a sampling of values for the **Examples** field. It doesn't retrieve all of the field values.
> >
> > For the values that display in the Commerce Studio Editor screen, see [Use category conditions](/docs/lw-platform/lw-cs/cstudio-editor#use-category-conditions).
## Configure typeahead
Typeahead, also known as autocomplete or autosuggest, is a feature that provides real-time query and phrase suggestions as you type in the Editor's search bar.
In the Typeahead section, you can configure the fields to use for typeahead for this search profile.

* To add a field, click the button.
* To change a field, click the field and type to search for another one.
* To change a field's display style, click the dropdown and select the style that best matches the field's data type.
> [!NOTE]
>
> The Commerce Studio Settings Typeahead feature is for internal use in Commerce Studio. This is different than the [Lucidworks Platform Core Settings Typeahead feature](/docs/lw-platform/lw-core/sites-typeahead), which is where typeahead options for customer queries is configured.
# Commerce Studio versus Predictive Merchandiser
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-versus-pm
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/cs/dndnds
[localhost link]: http://localhost:3000/docs/lw-platform/lw-cs/cstudio-versus-pm
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-versus-pm
This topic explains the differences and similarities between Commerce Studio and [Predictive Merchandiser](/docs/5/fusion/getting-data-out/curating-your-search-experience/predictive-merchandiser/overview) to make [migrating from Predictive Merchandiser to Commerce Studio](/docs/lw-platform/lw-cs/cs-migrate) easy.
Both Predictive Merchandiser and Commerce Studio enable merchandisers, marketers, and product teams to manipulate search results for maximum impact.
Commerce Studio has enhancements that make it easier and more efficient to use, optimizing your team's workflow.
Contact Lucidworks for information about migrating from Predictive Merchandiser to Commerce Studio.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Feature overview
This table summarizes the differences and similarities between Predictive Merchandiser (PM) and Commerce Studio (CS):
| Feature | PM | CS | Details |
| - | :-: | :-: | - |
| Real-time dynamic preview | | | In Commerce Studio's [Editor](/docs/lw-platform/lw-cs/cstudio-editor), search results are updated instantly while you create and manage rules and query rewrites. |
| Instant point-and-click rule creation | | | In Commerce Studio's Editor, you can hold the pointer over any item and click to create a new rule for it. No need to start a new task first; just point and click. |
| Drag-and-drop rule creation | | | In Commerce Studio's Editor, you can drag and drop items to instantly create rules about their ordering. |
| Integrated analytics | | | Commerce Studio displays metrics inline in the Editor to show you which products are performing or underperforming so you can take action with rules and rewrites. |
| Conditions Manager | | | Commerce Studio's Conditions Manager lets you compare multiple queries and set specific conditions for your rules, such as a time range or tags. |
| Ranking Insights | | | Commerce Studio's Ranking Insights feature shows you all of the ranking method and any rewrites that affect a query's results so you can adjust them as needed to achieve your goals. |
| Execute panel | | | Commerce Studio's Execute panel displays all the of the rules associated with the given conditions (such as query, dates, and so on) right in the Editor, allowing you to view, add, and/or edit rules as needed. |
| Rules Editor | | | In Commerce Studio, you can use either the [Rules UI](/docs/lw-platform/lw-cs/cstudio-rules) or the Editor. |
| Query Rewrites Editor | | | Like Predictive Merchandiser, Commerce Studio provides a simple interface for [query rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite). |
| Customer interface simulation | | | Whereas Predictive Merchandiser uses templates and zones, Commerce Studio uses [preview settings](/docs/lw-platform/lw-cs/cstudio-settings) that you can customize for each search profile to simulate the pages on your customer-facing website. |
| Integration with Fusion | | | Both products support [integrating with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration). |
## Intro to Commerce Studio for Predictive Merchandiser clients
Click below for a quick tour of Commerce Studio's Editor that shows you how it improves on Predictive Merchandiser's user experience with smoother, integrated controls:
[Commerce Studio Editor demo for PM clients](https://app.supademo.com/embed/cmfhh5j07004zzd0jxrrhkdsi?embed_v=2\&utm_source=embed)
## Query rewrites
All types of query rewrites are supported in both Predictive Merchandiser and Commerce Studio.
When you [migrate to Commerce Studio](/docs/lw-platform/lw-cs/cs-migrate), all of your query rewrites are migrated too.
The names of the query rewrite types differ slightly between the two products, as shown in this table:
| Predictive Merchandiser rewrites | Commerce Studio rewrites |
| - | - |
| Head/Tail | Underperforming Queries |
| Misspelling | Misspelling Detections |
| Phrase | Phrase Detections |
| Synonym | Synonym Detections |
| Remove Words | Word Removal |
See [Rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite) for more details.
## Rule publication
Like query rewrites, all of your existing rules are migrated when you migrate from Predictive Merchandiser to Commerce Studio.
The possible values for a rule's publication status differ slightly between Predictive Merchandiser and Commerce Studio.
This table shows the equivalent rule statuses between the two products:
| Predictive Merchandiser rule status | Commerce Studio rule status |
| - | - |
| Published + Disabled | Draft |
| Published + Enabled | Published |
| Unpublished + Disabled | Draft |
| Unpublished + Enabled | n/a |
See [Rules](/docs/lw-platform/lw-cs/cstudio-rules) for more details.
# Commerce Studio
Source: https://doc.lucidworks.com/docs/lw-platform/lw-cs/overview
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/cs/nd39eb
[localhost link]: http://localhost:3000/docs/lw-platform/lw-cs/overview
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-cs/overview
Commerce Studio is Lucidworks’ next-generation merchandising studio, featuring an intuitive drag-and-drop, point-and-click editor.
Designed and built for search teams, Commerce Studio lets business users tailor the search and browse experience through powerful rule building, visual merchandising, and more.
To use Commerce Studio, you must complete all of the procedures described in the [Commerce Studio integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration) topic.
> [!TIP]
>
> This article describes features that are only available in certain packages. See [Lucidworks Feature Limited Availability](/docs/policies/feature-availability) for details, or reach out to your Lucidworks representative.
> [!TIP]
>
> **FAQ: What if I'm using Predictive Merchandiser?**
>
> You can migrate Predictive Merchandiser data to Commerce Studio, including rules, query rewrites and template data. To compare the features of Predictive Merchandiser to Commerce Studio, see [Commerce Studio versus Predictive Merchandiser](/docs/lw-platform/lw-cs/cstudio-versus-pm). To migrate Predictive Merchandiser to Commerce Studio, see the [Migration guide](/docs/lw-platform/lw-cs/cs-migrate).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Key features
Commerce Studio provides several core features for crafting your search experience.
### Editor
The [Editor](/docs/lw-platform/lw-cs/cstudio-editor) screen lets you visually merchandise results sets and simulate and test outcomes. The options on this screen let you:
* Simulate search and browse experiences including rule execution and facet selection.
* Review results based on rule and query rewrite configurations.
* View ranking insights and analytics.
* Preview field, variant, and metrics settings that display on each item in the catalog, including both standard and advanced grouping configurations.
* View product performance metrics for each item in the result set.
When you sign in to Lucidworks Platform, scroll to the Commerce Studio section, and then click the Commerce Studio instance to manage. The Editor screen is the default display.

For more information, see [Editor](/docs/lw-platform/lw-cs/cstudio-editor).
### Rules
The [Rules](/docs/lw-platform/lw-cs/cstudio-rules) screen lets you easily and intuitively manage your merchandising rules. You can create conditional rules based on queries, durations, and categories.
The rules affect the order products display in search results. The options on this screen let you pin, boost, bury, and block specific items in your catalog. You can also set facets, redirect customers to another page on your site, and more.
The people in your organization who would create and edit rules include the following personnel:
* Customer Experience Manager
* Product Manager
* Merchandiser
For more information about user roles, see [Who is Commerce Studio for?](#who-is-commerce-studio-for)
From the Commerce Studio screen, click **Rules** to display the screen. For example:

For more information, see [Rules](/docs/lw-platform/lw-cs/cstudio-rules).
### Rewrites
The [Rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite) screen lets you configure rules to improve the query and generate more relevant results. In this option, you can:
* Replace and improve less relevant search terms in underperforming queries
* Correct misspelled words
* Rewrite phrases to match higher performing phrases
* Specify synonyms
* Remove unnecessary words
The people in your organization who would rewrite queries include the following personnel:
* Director of eCommerce
* Customer Experience Manager
* Product Manager
* Merchandiser
* Digital Marketer
For more information about user roles, see [Who is Commerce Studio for?](#who-is-commerce-studio-for)
From the Commerce Studio screen, click **Rewrites** to display the screen. For example:

For more information, see [Rewrites](/docs/lw-platform/lw-cs/cstudio-query-rewrite).
### Settings
The [Settings](/docs/lw-platform/lw-cs/cstudio-settings) screen lets you customize the Editor's live preview to reflect how your website looks.
The options on this screen let you add fields to display for each search profile and configure typeahead settings to closely match the layout and behavior of your frontend so you can simulate scenarios that test the effectiveness of your rules and query rewrites before you implement them in your live customer environment.
From the Commerce Studio screen, click **Settings** to display the screen.
The people in your organization who would configure the preview settings include the following personnel:
* Director of eCommerce
* Customer Experience Manager
* Product Manager
* Merchandiser
* Digital Marketer
For more information about user roles, see [Who is Commerce Studio for?](#who-is-commerce-studio-for)
> [!NOTE]
>
> The Commerce Studio Settings Typeahead feature is for internal use in Commerce Studio. This is different than the [Lucidworks Platform Core Settings Typeahead feature](/docs/lw-platform/lw-core/sites-typeahead), which is where typeahead options for customer queries is configured.
For more information, see [Settings](/docs/lw-platform/lw-cs/cstudio-settings).
### Technical requirements
| Requirement | Commerce Studio | Analytics Studio |
| - | - | - |
| Fusion 5.9.8 or later\[1] | | \[2] |
| Lucidworks Platform | | |
| Signals data | \[3] | |
| Signals beacon\[4] | \[5] | |
* \[1]: Requires a Fusion or Lucidworks Search environment running Fusion 5.9.8 or later.
* \[2]: Analytics Studio provides search analytics insights and can operate independently of Fusion.
* \[3]: Commerce Studio does not require signals data, but key features like product analytics depend on it.
* \[4]: Future support is planned for alternative signals data sources.
* \[5]: Commerce Studio does not require signals data, but key features like product analytics depend on it.
## Who is Commerce Studio for?
Commerce Studio is designed for business users and ecommerce teams, including directors of ecommerce, customer experience managers, product managers, merchandisers, and digital marketers. The ecommerce teams can use Commerce Studio to build search and browse experiences to drive relevant search results to end users, while leveraging robust review and publishing workflows.
Depending on the size and structure of your organization, one person may cover several of these roles.
> [!NOTE]
>
> To use Commerce Studio, you must be granted **Workspace Owner** permissions in a Lucidworks Platform environment.
### Director of Ecommerce
Use Commerce Studio to help develop and execute the overall ecommerce strategy. This includes all aspects of the online shopping experience, from site performance and customer experience to search optimization and revenue generation.
* Optimize the search and browse experience and identify areas for improvement.
* Develop and implement search optimization strategies to drive organic traffic and achieve revenue goals.
* Analyze customer data and behavior to identify current and emerging trends and preferences.
* Optimize ecommerce operations for efficiency and cost-effectiveness.
### Customer Experience Manager
Use Commerce Studio to ensure customers have a seamless and satisfying search-to-purchase experience.
* Conduct user testing and research to understand customer preferences and pain points.
* Implement changes to the search experience based on customer insights.
* Analyze search data to understand customer intent and preferences.
* Identify and address factors contributing to "no results found" queries (also known as "null results" queries).
### Product Manager
Use Commerce Studio to oversee product assortment and strategy across all digital channels. Ensure that products are optimally positioned to maximize visibility, customer experience, and sales.
* Develop strategies to ensure that products are easily discoverable by customers.
* Strike a balance between promoting trending products and ensuring that evergreen products remain visible.
* Monitor inventory levels and ensure that in-stock products are prominently displayed and out-of-stock products are buried or hidden.
* Consider bundling or cross-selling to promote slow-moving items.
### Merchandiser
Use Commerce Studio to oversee product merchandising across all digital storefronts. Ensure that products are effectively positioned to maximize sales and conversions, drive customer engagement, and maintain brand consistency.
* Develop and implement merchandising strategies to increase product visibility and discoverability on the website.
* Strategically place products on the website to maximize sales and conversions.
* Develop and execute merchandising plans for seasonal promotions.
* Monitor the performance of seasonal promotions and make necessary adjustments to optimize results.
### Digital Marketer
Use Commerce Studio to drive traffic to the site through marketing strategies. Ensure that digital marketing campaigns align with search results and maximize return on marketing campaigns align with search results and maximize return on ad spend.
* Develop marketing campaigns that align with product launches or promotions.
* Optimize product pages and website content for relevant keywords to ensure that promotions and new products appear prominently in search results.
* Monitor and adjust strategies to maximize visibility during promotional periods.
### Data Analyst
Use Commerce Studio to analyze search data and customer behavior. Uncover valuable insights that influence the merchandising strategies of the team.
* Track and analyze key search metrics.
* Identify areas of strength and weakness in search performance.
* Recommend data-driven merchandising strategies.
* Monitor performance over time to adjust strategies and recommendations.
# Authentication API
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/authentication-api
[old doc.lw link]: https://doc.lucidworks.com/lw-platform/ai/oa96k5
[localhost link]: http://localhost:3000/docs/lw-platform/lw-platform/authentication-api
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-platform/authentication-api
The Authentication API authenticates users to use Lucidworks Platform APIs, including the [Lucidworks AI APIs](/docs/lw-platform/lw-ai/lw-ai-apis/overview) and [Commerce Studio Rules and Rewrites API](/docs/lw-platform/lw-cs/cs-rules-rewrites-api).
The single endpoint generates an access token to use in future API requests.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Token guidelines and behavior
* Lucidworks uses OAuth 2.0 to authenticate your credentials.
* Tokens generated by the Authentication API are [Java Web tokens (JWT) tokens](https://jwt.io/).
* Every token generated is active for 3600 seconds before it expires. After that token expires, API requests attempting to use the token fail and generate an HTTP status `401 Unauthorized` error.
* You can generate a new token at any time. To avoid authorization failures, generate a new token before the current token expires. For example, generate a new token five minutes before the current token expires.
> [!NOTE]
>
> To calculate the token expiration time, Base64 decode the JWT and review the `exp` field, which contains the expiration time in seconds since the Unix epoch.
## Authentication scope
You must specify one or more values for the `scope` of each authentication request.
The values depend on which API you use:
| Scope | Used For |
| - | - |
| `machinelearning.predict` | Use Case API, Prediction API, Async Prediction API, and Async Chunking API |
| `commercestudio.rules` | Commerce Studio rule operations (create, read, update, delete rules) |
| `commercestudio.rewrites` | Commerce Studio query rewrite operations (create, read, update, delete rewrites) |
> [!WARNING]
>
> Because the Use Case API, Prediction API, Async Prediction API, and Async Chunking API use the `machinelearning.predict` scope, if you request a new token with that scope, it deletes the existing token, so all of the APIs are affected.
> You need to manage token regeneration for those APIs to run successfully.
## Fetch the access token
> **Fetch an access token**
>
> **1. Locate your client ID and secret**
>
> Where you find the client ID and secret depends on which API you're using:
>
> * For [Lucidworks AI APIs](/docs/lw-platform/lw-ai/lw-ai-apis/overview), go to **Models** > **Integrations** and click your integration, then copy the **Client ID** and **Client Secret**. [Learn more about Lucidworks AI integrations](/docs/lw-platform/lw-ai/integrations).
>
> * For [Commerce Studio APIs](/docs/lw-platform/lw-cs/cs-rules-rewrites-api), go to **Settings** > **Service Accounts** and click your service account, then copy the **Client ID** and **Client Secret**. [Learn how to create a service account](/docs/lw-platform/lw-cs/cs-rules-rewrites-api#create-a-service-account).
>
> **2. Compose your request**
>
> Send your access token request to the authentication endpoint.
>
> The request uses basic authentication, where your base64-encoded client ID is your username and your base64-encoded client secret is your password.
> Some clients perform the encoding automatically; if not, you can use the `base64` command-line utility, like this:
>
> ```bash theme={"dark"}
> echo -n "CLIENT_ID:CLIENT_SECRET" | base64
> ```
>
> Compose your request like this:
>
> ```bash theme={"dark"}
> curl --request POST \
> --url 'https://identity.lucidworks.com/oauth2/ausao8uveaPmyhv0v357/v1/token?scope=API_SCOPE&grant_type=client_credentials' \
> --header 'Accept: application/json' \
> --header 'Authorization: Basic [CLIENT_ID:CLIENT_SECRET_BASE64]' \
> --header 'Cache-Control: no-cache' \
> --header 'Content-Type: application/x-www-form-urlencoded'
> ```
>
> Set the `scope` query parameter to the value for your API, as listed in [Authentication scope](#authentication-scope).
>
> **3. Fetch the access token**
>
> A successful request returns:
>
> ```json theme={"dark"}
> {
> "token_type": "Bearer",
> "expires_in": 3600,
> "access_token": "ACCESS_TOKEN",
> "scope": "API_SCOPE"
> }
> ```
>
> Copy the value of the `access_token` key and use it for API authentication.
>
> **4. Refresh your token every 60 minutes**
>
> API access tokens expire after 60 minutes.
>
> > [!WARNING]
> >
> > Once you request a new token, the previous one is deleted *even if it has not yet expired*.
> > All subsequent API calls must use the new token.
# Indexes
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/indexes
The Indexes screen in Lucidworks Platform is where you can view your Fusion instances and perform promotions between environments. For Lucidworks Search clients, Lucidworks sets up and configure Fusion integrations for Lucidworks Platform. Self-hosted Fusion clients must set up [Fusion integrations](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview) to view their Fusion instances here.
Navigate to the megamenu and click **Indexes** to display the screen.

> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Fusion instances
The Fusion Instances tab displays by default, indicating if the deployment is self-hosted or Lucidworks Search and the environment such as Dev, Staging, or Prod.
Using multiple Fusion environments lets you to try out new features, test configurations, and stage changes before pushing them into production. Making your changes in a Fusion environment for developers allows your team to test any changes thoroughly and make sure everything works as expected before promoting to an environment where more people, including your end users, can view the changes. These environments protect your website from a situation where a simple configuration error may affect your users, security, and operational goals.
### Accessing Lucidworks Search instances
If you're using [Lucidworks Search](/docs/lucidworks-search/overview), you can access Fusion instances using SSO directly from Lucidworks Platform.
Click **Managed** on a Fusion instance card to authenticate automatically.

If you need elevated access to perform administrative tasks in an instance of Lucidworks Search, request role elevation from Lucidworks Support or your Customer Success Manager.
After the role is granted, log in again with Lucidworks Platform to activate your new permissions.
### Accessing Grafana metrics
If you're using Lucidworks Search, you can access Grafana monitoring using SSO from Lucidworks Platform.
Click the three dots on your Fusion instance card and select **View Metrics** to access your [Customer Dashboard](/docs/lucidworks-search/08-administration/monitoring/lucidworks-search/grafana-customer-dashboard-managed).

## Configuration promotion
This feature is available to both self-hosted and Lucidworks Search clients using Fusion 5.9.8 or later.
The Configuration Promotion tool uses a GitHub configuration for every Fusion instance you want to manage.
> [!NOTE]
>
> To use this feature, self-hosted Fusion clients must set up
> [ConfigSync](/docs/5/fusion/operations/config-sync/overview) and complete all of the procedures described in the
> [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration) topic.
### Create and manage promotions
To create and manage promotions, navigate to the Indexes screen and click the **Configuration Promotion** tab.

#### Promotion statuses
The Configuration Promotion table displays an Approval Status for each promotion request. The following statuses indicate the current state of a promotion:
* **Creating Pull Request**: The system is generating the pull request for the promotion.
* **Pending**: The pull request has been created and is awaiting review.
* **Approved**: The promotion has been reviewed and approved for merging.
* **Merged**: The changes have been successfully applied to the target environment.
* **Withdrawn**: The promotion request has been canceled before merging.
* **Broken**: The promotion encountered an error and cannot proceed. Contact your administrator for assistance.
#### Start promotion
For Lucidworks Search clients, promotion requests are reviewed by Lucidworks. You can track the approval status in the Configuration Promotion table.
To promote an instance, click **Start Promotion**.
1. In the **Source** section, select the Fusion instance that contains the changes you want to promote. For example, if you’re promoting changes to a Staging environment, select your Dev environment. A file tree appears in the Source section that represents all the Fusion objects within the selected system.
2. Select the checkboxes for the files you want to promote into the target instance.
> [!NOTE]
>
> Some files are restricted and cannot be selected for promotion.
3. In the **Target** section, select the Fusion instance where the changes will be promoted and then verify your selection.

4. Click **Request Promotion**.
On the Configuration Promotion page, a new promotion appears with an Approval Status of `Creating Pull Request`. When the Approval Status changes to `Pending`, the pull request has been created and is ready to be reviewed.
#### Withdraw promotion
To cancel a promotion request that hasn’t been merged yet, click the request to display the Details screen and then click **Withdraw Promotion**.

# Platform Features
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/overview
Lucidworks Platform
[old doc.lw link]: https//doc.lucidworks.com/lw-platform/platform/rcwjfo
[localhost link]: http://localhost:3000/docs/lw-platform/lw-platform/overview
[mintlify link]: https://doc.lucidworks.com/docs/lw-platform/lw-platform/overview
Lucidworks Platform connects everything behind the scenes so your team can focus on what drives value: smarter experiences and better outcomes.
Seamlessly integrated with Fusion, it provides powerful, no-code tools like [Lucidworks AI](/docs/lw-platform/lw-ai/overview), [Commerce Studio](/docs/lw-platform/lw-cs/overview), [Analytics Studio](/docs/lw-platform/lw-analytics/overview), and [Agent Studio](/docs/lw-platform/lw-agent-studio/overview) that let merchandisers, analysts, and AI innovators launch and optimize high-converting experiences with speed and confidence.
Click your use case below to see examples of how you can enhance the search experience using Lucidworks Platform:
**Business-to-Consumer**
* **Commerce Studio:**
Boost conversion rates by giving merchandisers no-code tools to fine-tune product rankings, promotions, and rules based on real-time shopper behavior.
* **Analytics Studio:**
Identify underperforming queries and high-value trends to optimize search and category experiences for maximum revenue impact.
* **Agent Studio:**
Power AI-driven support that delivers faster, more accurate answers by training agents on semantically chunked product and help content.
* **Lucidworks AI:**
Deploy scalable, cloud-hosted AI models that personalize search results, recommendations, and content based on user intent and behavior—without the infrastructure overhead.
**Business-to-Business**
* **Commerce Studio:**
Customize product visibility and ranking by buyer type, region, or industry to better serve complex purchase journeys.
* **Analytics Studio:**
Analyze buyer behavior and search trends to improve lead qualification, refine content strategy, and increase deal velocity.
* **Agent Studio:**
Create AI agents that surface relevant specs, compliance data, and product insights from complex content libraries so buyers can verify requirements faster.
* **Lucidworks AI:**
Centralize control of AI model lifecycles for industrial-scale deployments—enabling more accurate relevance, faster updates, and streamlined governance across product catalogs and document repositories.
**Knowledge Management**
* **Commerce Studio:**
Organize and prioritize knowledge artifacts so users and partners can access the most relevant information quickly and confidently.
* **Analytics Studio:**
Uncover content gaps and measure knowledge findability to continuously improve documentation and training resources.
* **Agent Studio:**
Deliver context-aware, role-specific answers with AI agents trained on semantically segmented internal knowledge, driving faster onboarding and support.
* **Lucidworks AI:**
Scale intelligent search and question-answering capabilities across vast corpora by managing models, chunking, and vector indexing from one unified cloud interface.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Platform Home screen
When you access Lucidworks Platform, the Home screen displays:

From the Home screen, you can access all of your sites, plus Lucidworks Platform products your organization has deployed, such as [Lucidworks AI](/docs/lw-platform/lw-ai/overview), [Commerce Studio](/docs/lw-platform/lw-cs/overview), [Analytics Studio](/docs/lw-platform/lw-analytics/overview), and [Agent Studio](/docs/lw-platform/lw-agent-studio/overview).
## Megamenu

The megamenu lets you access and manage global functions.
It's available on every screen in Lucidworks Platform.
Different options display based on Lucidworks Platform features and components your organization deploys.
[Signals](/docs/lw-platform/lw-analytics/signals/overview) populate metrics in Analytics Studio. This option lets you view and manage the configuration for signals that collect and display customer interaction data from your website.
The [Indexes](/docs/lw-platform/lw-platform/indexes) option lets you access and interact with Fusion instances that are registered with Lucidworks Platform. These include Fusion and Lucidworks search instances that provide links to the webpage and additional actions such as [performing promotions between environments](/docs/lw-platform/lw-platform/indexes). For example, after you test the configuration and performance of Lucidworks Platform in the Development (Dev) environment, you can promote it to Production (Prod) for your customers to use.
**Models** is the option to manage integrations with Fusion and deploy pre-trained embedding models, custom embedding models, and generative AI models for [Lucidworks AI](/docs/lw-platform/lw-ai/overview).
Under [Settings](/docs/lw-platform/lw-platform/settings/overview), you can [create and manage user accounts](/docs/lw-platform/lw-platform/settings/lw-users/overview) and [configure integrations between Fusion and Lucidworks Platform and its products](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview).
## Feature compatibility and availability
The table below lists the available Lucidworks Platform offerings with their dependencies and licensing requirements.
| Feature | Dependency |
| - | - |
| Lucidworks AI | Fusion or Lucidworks Search 5.9.5 or later |
| Lucidworks Platform | Fusion or Lucidworks Search 5.9.5 or later |
| Neural Hybrid Search with Lucidworks AI | Fusion or Lucidworks Search 5.9.5 or later |
| Neural Hybrid Search with Seldon | Fusion or Lucidworks Search 5.9.5 or later |
| Enterprise SSO | Fusion or Lucidworks Search 5.9.5 or later |
| Commerce Studio | Fusion or Lucidworks Search 5.9.8 or later |
| Cloud Signal Storage | Lucidworks Search 5.9.6 or later |
| Signals beacon | |
| Analytics Studio | Fusion or Lucidworks Search 5.9.8 or later. Also requires the Signals beacon or Signals API. |
Contact Lucidworks for access to the features you need.
## Getting help
You can open the Help Center anywhere in Lucidworks Platform to access resources from our Knowledge Services and Technical Support teams, plus announcements about the latest products and capabilities.
[https://app.supademo.com/embed/cmhzk1xug012oqnb96sm2f7vw?embed\_v=2\&utm\_source=embed](https://app.supademo.com/embed/cmhzk1xug012oqnb96sm2f7vw?embed_v=2\&utm_source=embed)
Ready for your first training module? Start here:
> **[About Lucidworks Platform](https://academy.lucidworks.com/about-lucidworks-platform)**
>
> Learn about Lucidworks Platform in this free training course.
# Rate limiting
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/rate-limiting
Rate limiting is used to help control network traffic and performance based on configuration of the timing and repetition of requests allowed on the network.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
Lucidworks Platform employs rate limiting to:
* Provide a reliable service and optimal network performance for client organizations.
* Protect clients from exceeding contracted consumption quotas which could result in overage charges.
Each of the Lucidworks Platform APIs uses a similar approach:
* Rate limitations are specified in the Lucidworks contract for your organization. Typically, most of the simple operations that do not impact query time are set to a lower rate limit. APIs considered to be in the critical path for query performance use a separate, higher rate limit.
* If the request rate to a particular API exceeds the relevant limit, the system generates the [HTTP 429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) error. To resolve the issue, Lucidworks recommends you retry the request by implementing an [exponential backoff pattern](https://en.wikipedia.org/wiki/Exponential_backoff).
For more information, or to ask questions about your account related to rate limiting, contact [Lucidworks Support](https://support.lucidworks.com).
# Commerce Studio integration with Fusion
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration
This type of Fusion integration lets you connect self-hosted Fusion instances to Lucidworks Commerce Studio.
If you want to migrate from Predictive Merchandiser to Commerce Studio, the information in this topic is used in coordination with the procedures described in [Migration guide from Predictive Merchandiser to Commerce Studio](/docs/lw-platform/lw-cs/cs-migrate).
You must satisfy the [prerequisites](#prerequisites) and complete all of the procedures in the order described in this topic to implement Lucidworks Commerce Studio:
1. [Create a Commerce Studio integration with Fusion](#create-a-commerce-studio-integration-with-fusion)
2. [Create Fusion roles required for Commerce Studio](#create-fusion-roles-required-for-commerce-studio)
3. [Create a Fusion security JWT realm for Commerce Studio](#create-a-fusion-security-jwt-realm-for-commerce-studio)
4. [Create the lwp service account in the JWT realm](#create-the-lwp-service-account-in-the-jwt-realm)
5. [Verify Commerce Studio integration with Fusion](#verify-commerce-studio-integration-with-fusion)
6. [Create a Commerce Studio instance using the UI](#create-a-commerce-studio-instance-using-the-ui)
> [!TIP]
>
> This topic is specific to integrating Lucidworks Platform with Fusion for the use of Commerce Studio.
>
> * To configure a general integration for Lucidworks Platform with Fusion, follow the procedures in [Fusion integrations](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview).
> * To configure an integration that uses the Lucidworks Configuration Promotion tool, follow the procedures in the [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration) topic.
> * For information about a Fusion integration with Lucidworks AI, see [Lucidworks AI integrations](/docs/lw-platform/lw-ai/integrations).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Prerequisites
To create an integration, you must have the following prerequisites in place:
* Admin privileges to a self-hosted Fusion environment running Fusion 5.9.8 or later.
* A Fusion application that contains usable data.
* Workspace Owner permissions in a Lucidworks Platform environment.
* Privileges to access and use Lucidworks Commerce Studio in a Lucidworks platform workspace.
> [!NOTE]
>
> **Network access requirements:** Lucidworks Platform must be able to reach the Fusion API URL you provide. Your Fusion instance must also be able to reach the Lucidworks JWK endpoint (`https://api.lucidworks.com/customers/`) to retrieve JSON Web Key Sets during JWT authentication. This endpoint is hosted on a separate IP range from the Lucidworks Platform itself. To obtain the IP ranges to add to your network allowlist, or for help configuring proxy access through the Fusion API gateway, contact Lucidworks support.
## Create a Commerce Studio integration with Fusion
Complete the following procedures to create an integration from Lucidworks Commerce Studio to Fusion.
1. Navigate to the megamenu and click **Settings > Fusion Integrations**.
2. Click **Connect New Fusion**.
3. In the **Name** field, enter a unique name for the integration. For example, `Lucidworks Demo Dev`.
4. In the **API URL** field, enter the URL of your Fusion instance. For example, `https://FUSION_INSTANCE.com`. Do not enter a path after `.com`.
5. In the **Environment** field, select the Fusion instance environment or use the default of **Development**.
6. Optional: Enter one or more descriptive **Tags** that differentiate multiple integrations.

7. Do not enter values in any of the fields in the **GitHub** section. Values in these fields are only required to set up the [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration).
8. Click **Add**. Lucidworks Platform sends a `GET /api` request to your Fusion API gateway to validate the connection. If that request cannot reach your Fusion instance, the integration will not be created. If the value in the **API URL** field is:
* Not valid, the integration is not created, and it is not displayed on the Fusion Integrations screen.
* Valid, the Instructions to Connect with Fusion screen displays:

9. Copy both the **JWK Set URL** value and the **Issuer URL** value to a secure location. These values must be used to create the JWT realm and are not displayed again after you click **Close**.
10. Click **Close**.
11. Verify the new integration displays on the Fusion Integrations screen.
> [!NOTE]
>
> To edit the integration, hold the pointer over the integration, click the pencil icon, enter the changes, and click **Save**. To delete the integration, hold the pointer over the integration and click the trash can icon.
## Create Fusion roles required for Commerce Studio
1. Sign in to your Fusion instance as an admin and click the Fusion application to connect with Commerce Studio.
2. Navigate to **System > Access Control > Roles** and click **Add Role**.
3. In the **Name** field, enter `lwp_user`.
4. In the **Permissions** field, enter:
```bash lines highlight={3-4} theme={"dark"}
GET,PUT,DELETE,POST,HEAD:/query/experience-manager/**
GET,POST:/query/*
POST:/query/*/preview
GET,POST,PUT:/query-pipelines/**
GET:/suggestions/**
GET:/solr/*/terms
PUT,POST,GET:/apps/*/query-pipelines/**
GET:/apps/*/query-profiles/**
GET,PUT:/apps/*
POST:/apps/*/query/**
GET:/solr/*/admin/luke
GET:/solr/**
```
Each permission grants the following access:
* `GET,PUT,DELETE,POST,HEAD:/query/experience-manager/**`: Commerce Studio query endpoints (read/write) for Commerce Studio UI and rule management.
* `GET,POST:/query/*`: Query execution endpoints (read/write). `POST` sends query parameters in the request body and does not create or persist any configuration in Fusion.
* `POST:/query/*/preview`: Rule preview endpoint (write) to view rule results without publishing them to production.
* `GET,POST,PUT:/query-pipelines/**`: Query pipeline configuration (read/write) to manage pipeline stages used by Commerce Studio.
* `GET:/suggestions/**`: Autocomplete and typeahead suggestions (read-only).
* `GET:/solr/*/terms`: Solr term analysis (read-only) to view field values and vocabulary.
* `PUT,POST,GET:/apps/*/query-pipelines/**`: Application-scoped query pipeline management (read/write) to manage app-specific pipeline operations.
* `GET:/apps/*/query-profiles/**`: Query profiles (read-only) to view search configuration profiles.
* `GET,PUT:/apps/*`: Fusion application settings (read/write) to view and update app metadata.
* `POST:/apps/*/query/**`: Run queries (write) against a specified app's query profile without modifying the app.
* `GET:/solr/*/admin/luke`: Solr index schema inspection (read-only) used to view available fields.
* `GET:/solr/**`: General Solr read access (read-only).
> [!TIP]
>
> Beginning with Fusion 5.9.15, all Commerce Studio integrations must have the `POST:/query/*/preview` and `GET,POST,PUT:/query-pipelines/**` permissions assigned to both the `lwp_user` and `lwp_service_account` roles in Fusion.
This role does not require any UI permissions, so you do not have to select any values in the **UI Permissions** field.
5. In the **Description** field, enter role information. For example, "The lwp\_user account is required to access and use Commerce Studio. It is a super user account, but does not include the ability to get, modify, or delete the `HEAD` section of the site."
6. Click **Save**.
7. Click **Add Role**.
8. In the **Name** field, enter `lwp_service_account`.
9. In the **Permissions** field, enter the following permissions. These permissions include most of the lwp\_user account permissions plus the privileges to migrate Fusion Predictive Merchandiser rewrites, rules, templates and zones.
```bash lines highlight={3-4} theme={"dark"}
GET,PUT,DELETE,POST,HEAD:/query/experience-manager/**
GET,POST:/query/*
POST:/query/*/preview
GET,POST,PUT:/query-pipelines/**
GET:/suggestions/**
GET:/solr/*/terms
PUT,POST,GET:/apps/*/query-pipelines/**
GET:/apps/*/query-profiles/**
GET,PUT:/apps/*
GET,DELETE,PATCH,PUT,POST,HEAD:/apps/*/query-rewrite/**
GET,HEAD:/templating/**
GET:/solr/*/admin/luke
GET:/solr/**
```
The `lwp_service_account` role includes most `lwp_user` permissions plus the following additional permissions that are required to migrate Predictive Merchandiser to Commerce Studio:
* `GET,DELETE,PATCH,PUT,POST,HEAD:/apps/*/query-rewrite/**`: Query rewrite rules (read/write) to migrate Predictive Merchandiser rewrites, rules, and zones to Commerce Studio.
* `GET,HEAD:/templating/**`: Templating access (read-only) to access Predictive Merchandiser templates during migration.
> [!TIP]
>
> Beginning with Fusion 5.9.15, all Commerce Studio integrations must have the `POST:/query/*/preview` and `GET,POST,PUT:/query-pipelines/**` permissions assigned to both the `lwp_user` and `lwp_service_account` roles in Fusion.
This role does not require any UI permissions, so you do not have to select any values in the **UI Permissions** field.
10. In the **Description** field, enter role information. For example, "The lwp\_service\_account contains most of the lwp\_user permissions as well as the privileges to migrate Fusion Predictive Merchandiser components to Lucidworks Commerce Studio."
11. Click **Save**.
> [!TIP]
>
> The `PUT,POST,GET:/apps/*/query-pipelines/**` permission reflects the requirement to assign all necessary query pipeline permissions to the `lwp_user` and `lwp_service_account` roles. An additional example is for configuring a Lucidworks AI Gateway integration, where you need to assign `POST:/your-account-name/`.
## Create a Fusion security JWT realm for Commerce Studio
1. Sign in to your Fusion instance as an admin and click the application in which you created the `lwp_user` and `lwp_service_account` accounts to use with Commerce Studio.
2. Navigate to **System > Access Control > Security Realms** and click **Add Security Realm**.
3. In the **Name** field, enter a unique connection name. For example, **Lucidworks Commerce Studio JWT realm**.
4. In the **Type** field, select **jwt**.
5. Set the checkboxes in the following configuration.
* Select the **Enabled** checkbox.
* Do not select the **Ephemeral Users** checkbox.
* Select the **Auto-Create Users** checkbox.
6. In the **Roles** field, select `lwp_user`.
7. In the **JWT Issuer** field, paste the **Issuer URL** value generated in the [Create a Commerce Studio integration with Fusion](#create-a-commerce-studio-integration-with-fusion) procedure.
8. In the **JWK Set URL** field, paste the **JWKS URL** value generated in the [Create a Commerce Studio integration with Fusion](#create-a-commerce-studio-integration-with-fusion) procedure.
9. In the **JWK Set Timeout** field, enter a timeout value in milliseconds for retrieving the JWKS.
* This field is required.
* Minimum value: `500` ms (set higher for known network latency).
10. Do not enter values (default is blank) in any of the following fields:
* **Signing Key**
* **Groups Key**
* **Groups Mapping**
* **User ID Attribute**
11. Click **Save**.
> [!NOTE]
>
> Self-hosted Fusion clients can also view the integration `ID`, `Issuer URL`, `JWKS URL`, and other integration details in **Settings > Fusion Integrations** when the existing integration is selected. For general information, see [Lucidworks Platform integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview). Integrations for Lucidworks Search clients are created and updated by Lucidworks.
## Create the lwp service account in the JWT realm
1. Sign in to your Fusion instance as an admin and click the application to be connected with Commerce Studio.
2. Navigate to **System > Access Control > Users** and click **Add User**.
3. In the **Realm** field, select the JWT realm you created in the [Create a Fusion security JWT realm for Commerce Studio](#create-a-fusion-security-jwt-realm-for-commerce-studio).
4. In the **Username** field, enter `lwp-service-account`.
5. In the **Roles** field, select the `lwp_service_account` role.
6. In the **Timezone** field, select the appropriate timezone for the user account.
7. Click **Create**.
## Verify Commerce Studio integration with Fusion
When the Fusion security JWT realm is created, complete the following steps to verify the Fusion information is displayed.
1. Navigate to the megamenu and click **Settings > Fusion Integrations**.
2. Hold the pointer over the integration and click the pencil icon.
3. Verify the information is accurate.
> [!NOTE]
>
> The information in the Instructions section must match the values in the **Additional URLs JWKS URL** and **Issuer URL** fields.
## Create a Commerce Studio instance using the UI
> [!WARNING]
>
> Do not create a Commerce Studio instance using the UI if you are migrating data from Predictive Merchandiser into that Commerce Studio instance. Instead, you must create the [instance using the API](/docs/lw-platform/lw-cs/cs-migrate).
1. In Lucidworks Platform, navigate to **Commerce Studio** and click **Create New**.
2. In the **Name** field, enter a unique name for the Commerce Studio instance.
3. In the **Region** field, select the geographic region for the Commerce Studio instance. This cannot be changed after the instance is created.
4. In the **Fusion to Connect** field, select the Fusion integration instance that matches the **Name** field created in the [Create a Commerce Studio integration with Fusion](#create-a-commerce-studio-integration-with-fusion) procedure.
5. Optional: In the **Signal Store** field, select the location where the Commerce Studio signals are stored. This value is only required if you want to use Lucidworks Analytics.
6. In the **Fusion Application** field, enter Lucidworks Platform application that connects to your Fusion instance.
7. Click **Next** to confirm settings, and then **Next** to create the instance.
> [!NOTE]
>
> Data from the Fusion app is sent to Commerce Studio so you can create rules and refine the search experience. You can only connect one instance of Commerce Studio to a Fusion app. You cannot create multiple instances of Commerce Studio using the same Fusion app.
> [!WARNING]
>
> 1. Commerce Studio exclusively manages `APP_NAME_query_rewrite_staging_em` and `APP_NAME_query_rewrite_em`. Do not manually add, edit, or delete documents in these collections.
> 2. Commerce Studio reflects rules stored in its own platform database. Deleting documents from these Fusion Solr collections does not delete the corresponding rules in Commerce Studio. The collections will re-sync the next time Commerce Studio writes rules.
> 3. Custom tooling built against these collections is not supported.
## Troubleshooting
These errors may occur when Commerce Studio communicates with Fusion.
When an error response includes a `fusionErrorMessage` field, use the message contents to identify the cause.
> **400 error**
>
> The Commerce Studio instance status in Fusion may have been removed or disabled.
> Manually set the status back to `READY` (if in preview mode) or `CONNECTED` (if already live).
> **401 or 403 error**
>
> The JWT security realm used by Commerce Studio is not configured correctly.
> Verify that the JWT realm is configured as described in [Create a Fusion security JWT realm for Commerce Studio](#create-a-fusion-security-jwt-realm-for-commerce-studio).
>
> If the realm configuration is correct, an expired JWT may be reaching Fusion.
> Contact [Lucidworks support](https://lucidworks.com/support/).
>
> > [!NOTE]
> >
> > In some network environments, a JWT realm misconfiguration, particularly when Fusion cannot reach the JWKS endpoint, can surface as a 500 error rather than a 401 or 403.
> > If you are investigating a 500 error and cluster health appears normal, also check the JWT realm configuration and network egress to the JWKS endpoint.
> **500 or an unexpected response error**
>
> This typically indicates a problem with the Fusion instance itself.
> Check the details of the returned error response to determine the cause:
>
> * **"Could not find a healthy node"** — The Fusion cluster cannot reach a healthy Solr node. Contact your Fusion instance administrator or [Lucidworks support](https://lucidworks.com/support/).
> * **"Connection reset", "interrupted", or "timed out"** — The Fusion cluster may be overloaded or have a configuration issue causing slow responses. Contact your Fusion instance administrator.
> * **JWT realm / JWKS endpoint unreachable** — If Fusion cannot reach the Lucidworks JWKS endpoint, for example, due to a firewall or proxy blocking egress, it fails to retrieve JWT signing keys and may return a 500 to Commerce Studio instead of a 401 or 403. Check egress rules, proxy configuration, and the JWT realm setup even when the error is a 500. See [network access requirements](#prerequisites) and the JWT realm configuration steps.
# Configuration Promotion tool integration with Fusion
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration
This type of Fusion integration lets you connect self-hosted Fusion instances to the Lucidworks Configuration Promotion tool.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Use cases
Configuration Promotion connects Fusion to a Git-backed promotion flow so you can version, review, and safely move configuration changes to pipelines, schemas, and rules from development to staging to production. It standardizes releases with approvals and audit trails, reducing risk while speeding up delivery.
### B2B use case
Configuration Promotion adds a controlled, auditable path for repeatable, low-risk releases.
For example, support and knowledge teams can reliably promote new index pipelines and security configurations after a pull request is approved.
### B2C use case
For consumer search applications, Configuration Promotion shortens time-to-market by enforcing controlled promotions of relevancy rules, pipelines, and schemas across environments.
For example, merchandising teams can test ranking tweaks in staging and promote them safely to production during a release window, following the same GitHub checks every time.
> [!TIP]
>
> This topic is specific to integrating the Lucidworks Platform with Fusion for the use of the Configuration Promotion tool.
>
> * To configure a general integration for Lucidworks Platform with Fusion, follow the procedures in [Fusion integrations](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview).
> * To configure an integration that uses Lucidworks Commerce Studio, follow the procedures in the [Commerce Studio integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration) topic.
> * For information about a Fusion integration with Lucidworks AI, see [Lucidworks AI integrations](/docs/lw-platform/lw-ai/integrations).
## Prerequisites
To create an integration, you must have the following prerequisites in place:
* Admin privileges to a self-hosted Fusion environment running Fusion 5.9.8 or later.
* A Fusion application that contains usable data.
* Workspace Owner permissions in a Lucidworks Platform environment.
You must complete all of the procedures in the order described in this topic to implement the Lucidworks Configuration Promotion tool.
1. [Create a GitHub token for configuration promotion](#create-a-github-token-for-configuration-promotion)
2. [Set up GitHub branch protection (optional)](#set-up-github-branch-protection-optional)
3. [Configure the integration](#configure-the-integration)
4. [Create a Fusion security JWT realm](#create-a-fusion-security-jwt-realm)
5. [Verify the Configuration Promotion tool integration with Fusion](#verify-the-configuration-promotion-tool-integration-with-fusion)
## Create a GitHub token for configuration promotion
To set up the Configuration Promotion tool, you must generate a GitHub token.
1. Sign in to GitHub with an account that has access to the integrated systems repository.
2. In GitHub, click your profile icon, and then click **Settings**.
3. Navigate to **Developer Settings > Personal Access Tokens > Tokens (classic)**.
4. Click **Generate new token** and then select **Generate new token (classic)**.
5. In the **Note** field, enter details about the token.
6. In the **Expiration** field, select the period of time the token is active. Lucidworks recommends configuring a long duration in line with your organization’s security practices. You must generate and configure a new token for your Fusion integration every time your token expires.
7. In the **Select scopes** section, select the **repo** checkbox. This ensures the token has all required permissions.
8. Click **Generate token**.
9. Copy the generated token and save it in a secure location.
> [!NOTE]
>
> Your GitHub organization may need to authorize your token.
For more information, see [Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens).
## Set up GitHub branch protection (optional)
Lucidworks recommends enabling GitHub branch protection for your production (PROD) branch. This protects a branch with requested changes from being promoted until that request has been reviewed.
To configure branch protections, see [About protected branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches).
The configuration promotion tool looks at GitHub to see if the branch is ready to merge. The tool can integrate with any GitHub automations that change the merge-ready status of the branch.
## Configure the integration
To create an integration for the Lucidworks Configuration Promotion tool with Fusion, navigate to the megamenu and click **Settings > Fusion Integrations**.
1. Click **Connect New Fusion**.
2. In the **Name** field, enter a unique name for the integration. For example, `Lucidworks Demo Dev`.
3. In the **API URL** field, enter the URL of your Fusion instance. For example, `https://FUSION_INSTANCE.com`. Do not enter a path after `.com`.
4. In the **Environment** field, select the Fusion instance environment or use the default of **Development**.
5. Optional: Enter one or more descriptive **Tags** that differentiate multiple integrations.

6. All fields in the **GitHub** section are required if you’re setting up the Configuration Promotion tool.
1. In the **GitHub Branch URL** field, enter the URL from GitHub for your self-hosted Fusion install. The format is `https://github.com/ORGANIZATION_NAME/REPOSITORY_NAME/tree/BRANCH_NAME`. For example, `https://github.com/company_name/fusion_install/tree/lucidworks_demo_dev`.
2. In the **GitHub Token** field, enter the [personal access token](#create-a-github-token-for-configuration-promotion) granted privileges to the GitHub organization linked to your self-hosted Fusion install.
7. Click the **Enable Fusion Configuration Promotion** field to **ON** to allow files or instances to be promoted from development to a staging or production environment.

8. Click **Add**. If the value in the **API URL** field is:
* Not valid, the integration is not created, and it is not displayed on the Fusion Integrations screen.
* Valid, the Instructions to Connect with Fusion screen displays:

9. Copy both the **JWK Set URL** value and the **Issuer URL** value to a secure location. These values must be used to [Create a Fusion security JWT realm](#create-a-fusion-security-jwt-realm). These values must be used to create the JWT realm and are not displayed again after you click **Close**.
10. Click **Close**.
11. Verify the new integration displays on the Fusion Integrations screen.
> [!NOTE]
>
> To edit the integration, hold the pointer over the integration, click the pencil icon, enter the changes, and click **Save**. To delete the integration, hold the pointer over the integration and click the trash can icon.
## Create a Fusion security JWT realm
To complete required fields in the integration, you must create a Fusion security realm.
1. Sign in to your Fusion instance as an admin and click the Fusion application to connect with the Lucidworks Configuration Promotion tool.
2. Navigate to **System > Access Control > Security Realms** and click **Add Security Realm**.
3. In the **Name** field, enter a unique connection name. For example, **Lucidworks Configuration Promotion tool JWT realm**.
4. In the **Type** field, select **jwt**.
5. Set the checkboxes in the following configuration.
* Select the **Enabled** checkbox.
* Do not select the **Ephemeral Users** checkbox.
* Select the **Auto-Create Users** checkbox.
6. In the **Roles** field, select the roles that this realm provides after successfully authenticating a user by default.
7. In the **JWT Issuer** field, paste the **Issuer URL** value generated in the [Configure the integration](#configure-the-integration) procedure.
8. In the **JWK Set URL** field, paste the **JWKS URL** value generated in the [Configure the integration](#configure-the-integration) procedure.
9. Do not enter values (default is blank) in any of the following fields:
* **Signing Key**
* **Groups Key**
* **Groups Mapping**
* **User ID Attribute**
10. Click **Save**.
## Verify the Configuration Promotion tool integration with Fusion
When the Fusion security JWT realm is created, complete the following steps to verify the Fusion information is displayed.
1. Navigate to the megamenu and click **Settings > Fusion Integrations**.
2. Hold the pointer over the integration and click the pencil icon.
3. Verify the information is accurate.
> [!NOTE]
>
> The information in the Instructions section must match the values in the **Additional URLs JWKS URL** and **Issuer URL** fields.
# Fusion Integrations
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/fusion-integrations/overview
The Fusion Integrations features lets you connect self-hosted Fusion instances to Lucidworks Platform features and other software to extend and enhance your workflows.
This topic details how to create an integration between Lucidworks Platform and Fusion. You must satisfy the [prerequisites](#prerequisites) and complete the procedures in the order described in this topic:
1. [Create a Lucidworks Platform integration with Fusion](#create-a-lucidworks-platform-integration-with-fusion)
2. [Create a Fusion security JWT realm for Lucidworks Platform](#create-a-fusion-security-jwt-realm-for-lucidworks-platform)
3. [Verify the integration](#verify-the-integration)
> [!TIP]
>
> This topic details the steps to configure a general integration for Lucidworks Platform with Fusion.
>
> * To configure an integration that uses the Lucidworks Configuration Promotion tool, follow the procedures in the [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration) topic.
> * To configure an integration that uses Lucidworks Commerce Studio, follow the procedures in the [Commerce Studio integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration) topic.
> * For information about a Fusion integration with Lucidworks AI, see [Lucidworks AI integrations](/docs/lw-platform/lw-ai/integrations).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Prerequisites
To create an integration between Lucidworks Platform and Fusion, you must have the following prerequisites in place:
* Admin privileges to a self-hosted Fusion environment running Fusion 5.9.8 or later.
* A Fusion application that contains usable data.
* Workspace Owner permissions in a Lucidworks Platform environment.
## Create a Lucidworks Platform integration with Fusion
Complete the following steps to create an integration from Lucidworks Platform to Fusion.
1. Navigate to the megamenu and click **Settings > Fusion Integrations**.
2. Click **Connect New Fusion**.
3. In the **Name** field, enter a unique name for the integration. For example, `Lucidworks Demo Dev`.
4. In the **API URL** field, enter the URL of your Fusion instance. For example, `https://FUSION_INSTANCE.com`. Do not enter a path after `.com`.
5. In the **Environment** field, select the Fusion instance environment or use the default of **Development**.
6. Optional: Enter one or more descriptive **Tags** that differentiate multiple integrations.

7. Do not enter values in any of the fields in the **GitHub** section. Values in these fields are only required to set up the [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration).
8. Click **Add**. If the value in the **API URL** field is:
* Not valid, the integration is not created, and it is not displayed on the Fusion Integrations screen.
* Valid, the Instructions to Connect with Fusion screen displays:

9. Copy both the **JWK Set URL** value and the **Issuer URL** value to a secure location. These values must be used to create the JWT realm. These values must be used to create the JWT realm and are not displayed again after you click **Close**.
10. Click **Close**.
11. Verify the new integration displays on the Fusion Integrations screen.
> [!NOTE]
>
> To edit the integration, hold the pointer over the integration, click the pencil icon, enter the changes, and click **Save**. To delete the integration, hold the pointer over the integration and click the trash can icon.
## Create a Fusion security JWT realm for Lucidworks Platform
To complete required fields in the integration, you must create a Fusion security realm.
1. Sign in to your Fusion instance as an admin and click the Fusion application to connect with Lucidworks Platform.
2. Navigate to **System > Access Control > Security Realms** and click **Add Security Realm**.
3. In the **Name** field, enter a unique connection name. For example, **Lucidworks Platform JWT realm**.
4. In the **Type** field, select **jwt**.
5. Set the checkboxes in the following configuration.
* Select the **Enabled** checkbox.
* Do not select the **Ephemeral Users** checkbox.
* Select the **Auto-Create Users** checkbox.
6. In the **Roles** field, select the roles that this realm provides after successfully authenticating a user by default.
7. In the **JWT Issuer** field, paste the **Issuer URL** value generated in the [Create a Lucidworks Platform integration with Fusion](#create-a-lucidworks-platform-integration-with-fusion) procedure.
8. In the **JWK Set URL** field, paste the **JWKS URL** value generated in the [Create a Lucidworks Platform integration with Fusion](#create-a-lucidworks-platform-integration-with-fusion) procedure.
9. Do not enter values (default is blank) in any of the following fields:
* **Signing Key**
* **Groups Key**
* **Groups Mapping**
* **User ID Attribute**
10. Click **Save**.
## Verify the integration
When the Fusion security JWT realm is created, complete the following steps to verify the Fusion information is displayed.
1. Navigate to the megamenu and click **Settings > Fusion Integrations**.
2. Hold the pointer over the integration and click the pencil icon.
3. Verify the information is accurate.
> [!NOTE]
>
> The information in the Instructions section must match the values in the **Additional URLs JWKS URL** and **Issuer URL** fields.
# Users and Provisioning
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/lw-users/overview
The Users and Provisioning screen lets you [invite workspace owners](#invite-workspace-owners) to use Lucidworks Platform. In addition, you can [create authentication that supports sign-on (SSO)](/docs/lw-platform/lw-platform/settings/lw-users/sso), which restricts user logins to specified email domains.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Users
The Users screen displays all the users associated with your workspaces.
To view a list of users, navigate to the megamenu and click **Settings > Users & Provisioning**. The name, status, date user was created, and email of each user displays.

**User**
**properties**
**Name** `string`
First and last name of the user.
**Status** `string`
Possible values:
* **Active.** User has clicked the **Activate** link in the email and can access Lucidworks Platform as a workspace owner, which can manage the workspace and invite other users.
* **Awaiting Activation.** User is invited, but has not clicked the **Activate** link in the email.
* **Deleted.** User account has been deleted.
* **Deprovisioned.** User account has been deactivated and cannot access Lucidworks Platform.
* **Recovery.** User account was once deprovisioned, but has been recovered for future use.
* **Password-expired.** User must create a new password to reactivate the account.
**Created** `string`
Date the invitation was created.
**Email** `string`
User’s email address.
### Invite workspace owners
> [!NOTE]
>
> Only workspace owners for the specified workspace can invite users to that workspace.
1. Navigate to the megamenu and click **Settings > Users & Provisioning**.
2. Click **+ Invite** and enter the user’s information in the **First name**, **Last name**, and **Email** fields. Required fields are notated with an asterisk (\*).

3. To email the user the invitation, click **Send Invite**. To exit without creating a user, click **Cancel**.
4. In the Users list, verify the status of the new user status is **Awaiting Activation**.
> [!NOTE]
>
> When the user accepts the email invitation, the status displays as Active. If the user does not receive the email invitation in their inbox, ask them to look in the spam folder for an email from `no-reply@lucidworks.com`. If the invitation is not in their inbox or spam folder, verify the user's email information. If your troubleshooting efforts are unsuccessful, contact [Lucidworks Support](https://support.lucidworks.com).
### Edit or delete users
To edit a user, click the entry for the user you want to edit. You can also click **View/Edit**. Workspace owners can also click **Delete User** to delete the user.
## Authentication using single-sign on
The Authentication screen lets you configure a single sign-on (SSO) option, which supports the following features:
* Restricts user logins to specified email domains
* Uses your organization’s identity provider authentication method instead of Lucidworks' built-in authentication
Workspace owners can configure SSO via OpenID Connect (OIDC) or Security Assertion Markup Language (SAML).
For more information, see [Single sign-on authentication](/docs/lw-platform/lw-platform/settings/lw-users/sso).
# Single sign-on authentication
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/lw-users/sso
Lucidworks Platform supports single sign-on (SSO), which restricts user logins to specified email domains and uses your organization’s identity provider authentication method instead of Lucidworks' built-in authentication.
Workspace owners can configure SSO via [OpenID Connect (OIDC)](#oidc-authentication) or [Security Assertion Markup Language (SAML)](#saml-authentication).
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## OIDC Authentication
[OIDC](https://openid.net/developers/how-connect-works/) is an authentication protocol based on the OAuth 2.0 framework, which uses HTTPS endpoints to retrieve user data. It uses JSON web tokens (JWT) to authenticate user identity data (also known as claims).
Tokens are digitally signed and can also be encrypted.
Complete all of the following procedures to configure OIDC authentication.
### Create users in Lucidworks Platform
> [!TIP]
>
> **Prerequisites**
>
> 1. Users must be added to the Lucidworks Platform.
> 2. Users must exist in your identity provider, and be enabled for the application you are using to connect with Lucidworks Platform.
> 3. The user’s email address in your identity provider and Lucidworks Platform must match, including case. Some identity providers treat email addresses as case-sensitive, which can prevent a user from accessing Lucidworks Platform if the case doesn't match exactly.
1. Navigate to the megamenu and click **Settings > Users & Provisioning > Users**.
2. Verify all necessary users are listed, active, and their emails match their identity provider user counterparts.
3. If any users are missing, add the appropriate users by completing the steps in [invite workspace owners](/docs/lw-platform/lw-platform/settings/lw-users/overview#invite-workspace-owners).
### Create an OIDC application in your identity provider
1. Create a new OIDC application in your identity provider. Refer to your provider's documentation for detailed steps:
* [Okta](https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_oidc.htm)
* [Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/add-application-portal-setup-oidc-sso#configure-oidc-sso-for-custom-non-gallery-applications)
* [Google Workspace](https://support.google.com/cloud/answer/6158849)
2. When creating the application, use the following settings:
* **Sign-in method**: Select **OIDC**.
* **Application type**: Select **Web Application**.
* **Sign-in redirect URIs**: Leave this blank for now. You’ll configure it in a later step.
* **Logout redirect URIs**: Remove all URIs.
* **Controlled access**: Allow everyone in your organization to access the application.
* **Access approval**: Disable any setting that grants users immediate access without admin approval.
3. After creating the application, copy the **Client ID** and the **Client Secret**, and save them in a secure location.
> [!TIP]
>
> The **Client ID** and the **Client Secret** credentials are critical for OIDC communication and must be kept secure.
4. Assign at least one user and one admin to the application. These users must already exist in Lucidworks Platform. You must assign yourself as one of the users to be able to complete the authentication configuration.
### Create the Identity Provider in Lucidworks Platform
1. Navigate to the megamenu and click **Settings > Users & Provisioning > Authentication > OIDC**.
2. Enter values in the required fields:
* **Email Domains**: Enter the list of domains you want to use as filter options, for example, `lucidworks.com`.
> [!WARNING]
>
> Be careful not to lock yourself out at this step in the process. If you list a domain that you already use to log into Lucidworks Platform, and you don’t complete the rest of the steps listed here, then you will be prompted to log in via SSO the next time you log out, which won’t work. If you are unable to log into Lucidworks Platform, contact Support or your Lucidworks representative.
* Enter the **Client ID** and **Client Secret** provided by your identity provider's OIDC application.
* Enter the **Configuration URL** provided by your identity provider.
> [!TIP]
>
> To get the full OIDC configuration URL, append `/.well-known/openid-configuration` to your Issuer URL. For example, if your issuer is `https://idp.example.com`, the full configuration URL would be: `https://idp.example.com/.well-known/openid-configuration`
* Enter the **Issuer URL**, which identifies your identity provider's authorization server and is provided by your identity provider's OIDC application.
* Enter the **Authorization URL** for the server that performs user authorization.
* Enter the **Token URL** for the server where the authorization code is sent to obtain a user access token.
* Enter the **User Info URL** for the server where the user profile attributes are stored and can be retrieved after authentication.
* Enter the **JWKS URL**, which is the JSON Web Key Set that verifies signed JWT tokens, provided by your identity provider's OIDC application.
3. Click **Save**.
4. The Identity Provider process may take several minutes to complete. Once finished, the **URLs for IDP Configuration** display on the right side of the screen. Copy the **Redirect URL** and save it in a secure location.
### Configure the redirect URI in your identity provider
1. In your identity provider, navigate to the application you created for Lucidworks SSO.
2. Add the **Redirect URL** generated by Lucidworks Platform to the application's sign-in redirect URIs.
3. Save your changes.
### Test SSO functionality
After configuring both Identity Provider and the application, test the integration by attempting to log into Lucidworks Platform with one of the users assigned to the application. If the configuration is successful, you are prompted to log in with your identity provider's authentication.
## SAML authentication
[SAML](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language) is an XML-based protocol that uses HTTP to authenticate and authorize user data. In a SAML workflow, Lucidworks Platform is the Relying Party (RP) that requests and receives SAML assertions from the identity provider.
### Create users in Lucidworks Platform
> [!TIP]
>
> **Prerequisites**
>
> 1. Users must be added to the Lucidworks Platform.
> 2. Users must exist in your identity provider, and be enabled for the application you are using to connect with Lucidworks Platform.
> 3. The user’s email address in your identity provider and Lucidworks Platform must match, including case. Some identity providers treat email addresses as case-sensitive, which can prevent a user from accessing Lucidworks Platform if the case doesn't match exactly.
1. Navigate to the megamenu and click **Settings > Users & Provisioning > Users**.
2. Verify all necessary users are listed, active, and their emails match their identity provider user counterparts.
3. If any users are missing, add the appropriate users by completing the steps in [invite workspace owners](/docs/lw-platform/lw-platform/settings/lw-users/overview#invite-workspace-owners).
### Create a SAML application in your identity provider
1. Create a new SAML application in your identity provider. Refer to your provider's documentation for detailed steps:
* [Okta](https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_saml.htm)
* [Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/add-application-portal-setup-sso)
* [Google Workspace](https://support.google.com/a/answer/6087519)
2. When creating the application, use the following settings:
* **Sign-in method**: Select **SAML 2.0**.
* **Single Sign On URL (ACS URL)**: Enter a placeholder URL for now. You’ll configure it in a later step.
* **Audience URI (SP Entity ID)**: Enter a placeholder URL for now. You’ll configure it in a later step.
* **Name ID Format**: Select the appropriate Name ID format. This is usually `EmailAddress`.
* **Application username**: Choose how your identity provider should map the user’s application username. For example, their identity provider username or email address.
3. After creating the application, locate its metadata, copy the **Metadata URL**, and save it in a secure location.
> [!TIP]
>
> The **Metadata URL** is critical for SAML communication and must be kept secure.
4. Assign at least one user and one admin to the application. These users must already exist in Lucidworks Platform. You must assign yourself as one of the users to be able to complete the authentication configuration.
### Create the Identity Provider in Lucidworks Platform
1. Navigate to the megamenu and click **Settings > Users & Provisioning > Authentication > SAML**.
2. Fill out required fields:
* **Email Domains**: Enter the list of domains you want to filter by, for example, `\lucidworks.com`.
> [!WARNING]
>
> Be careful not to lock yourself out at this step in the process. If you list a domain that you already use to log into Lucidworks Platform, and you don’t complete the rest of the steps listed here, then you will be prompted to log in via SSO the next time you log out, which won’t work. If you are unable to log into Lucidworks Platform, contact Support or your Lucidworks representative.
* Enter the **Metadata URL** provided by your identity provider's SAML application.
* Enter the **Issuer URL** that specifies which identity provider is used by SAML. This value is generated when the SAML application is created.
* Enter the **Identity Provider SSO URL**, which is the single sign-on endpoint for users, and is provided by your identity provider's SAML application.
* Paste the **Certificate** information, which is provided by your identity provider's SAML application and is used by the identity provider to sign SAML responses.
3. Click **Save**.
4. The Identity Provider process may take several minutes to complete. Once finished, the **URLs for IDP Configuration** display on the right side of the screen:
* **Audience URI**
* **Assertion Consumer Service URL**
5. Copy the URLs and save them in a secure location.
### Configure the application in your identity provider
1. In your identity provider, navigate to the application you created for Lucidworks SSO.
2. Update the application's SAML settings:
* In **Single Sign On URL (ACS URL)** paste the **Assertion Consumer Service URL** generated by Lucidworks Platform.
* In **Audience URI (SP Entity ID)** paste the **Audience URI** generated by Lucidworks Platform.
3. Optional: If your identity provider supports SAML attribute mapping, configure the following mappings to send additional user information to Lucidworks Platform:
| | Name | Name Format | Value |
| - | - | - | - |
| **Email** | `email` | Unspecified | `user.email` |
| **First Name** | `firstName` | Unspecified | `user.firstName` |
| **Last Name** | `lastName` | Unspecified | `user.lastName` |
| **Username** | `username` | Unspecified | `user.login` |
4. Save your changes.
### Test SSO functionality
After configuring both Identity Provider and the application, test the integration by attempting to log into Lucidworks Platform with one of the users assigned to the application. If the configuration is successful, you are prompted to log in with your identity provider's authentication.
# Settings
Source: https://doc.lucidworks.com/docs/lw-platform/lw-platform/settings/overview
The Settings options of Lucidworks Platform lets you:
import from '/snippets/LwTemplate.jsx';
* Create and manage user accounts, including setting roles, permissions, and authentication for users in Lucidworks Platform.
* Configure integrations that connect Fusion to Lucidworks Platform and other software to extend and enhance your workflows.
To access the screen, navigate to the megamenu, click **Settings**.
* To create and manage user accounts and user permissions, click **Users & Provisioning > Users**. For more information, see [Users and Provisioning](/docs/lw-platform/lw-platform/settings/lw-users/overview).
* To configure single sign-on authentication, click **Users & Provisioning > Authentication**. For more information, see [Single sign-on authentication](/docs/lw-platform/lw-platform/settings/lw-users/sso).
* To configure and manage Fusion integrations to Lucidworks Platform, Commerce Studio, and Analytics Studio, click **Fusion Integrations**. For more information, see
* [Lucidworks Platform integrations with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/overview)
* [Commerce Studio integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/commerce-studio-integration)
* [Configuration Promotion tool integration with Fusion](/docs/lw-platform/lw-platform/settings/fusion-integrations/configuration-promotion-integration)
For information about integrations between Lucidworks AI and Fusion, see [Lucidworks AI integrations](/docs/lw-platform/lw-ai/integrations).
# Button
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/button
Interactive or static button component for navigation or actions in UI Studio applications
The Button component provides buttons that users can click or view for UI Studio applications. Use buttons to enable navigation to other pages or trigger actions like CSV data exports. You can style buttons with custom text and colors.
## Basic usage
Add a button to your UI Studio page to create an interactive element for users.

Basic Button component
Enter descriptive label text for the button and apply formatting in the Button component Customize section.
## Best practices
Use descriptive labels that clearly indicate the action. For example, **View details** or **Submit form**. Avoid vague labels such as **Click here**.
## Configuration properties
**Label** `string` *required*
Text displayed on the button. Keep this concise and action-oriented.
**Action** `dropdown` *required*
The action performed when the user clicks the button.
**Action**
**Link** `option`
Navigation button with URL. The `Page Path` field contains the target URL.
**Export** `option`
Action button for CSV downloads.
**Page Path** `string`
URL path for navigation. Supports token syntax: `${TOKEN_NAME}` that is specified in the `Token Name` and `Field Name` fields.
Examples:
* `/home`
* `/users/${userId}`
* `/products/${productId}/details?tab=${activeTab}`
**Open in New Tab** `boolean` (default: false)
When enabled, the link specified in the `Page Path` field opens in a new browser tab.
**Tokens** `group`
Token settings for button navigation.
**Tokens**
**Token Name** `string`
Unique name for the navigation token.
**Field Name** `string`
The field that contains the token used when the user clicks the button.
**Font** `group`
Typography settings for the text.
**Properties**
**Family** `dropdown` (default: Public Sans)
Font typeface for the text.
**Weight** `dropdown` (default: Regular)
Font weight for the text. Options are Regular, Light, Bold, and Extra Bold.
**Size** `number` (default: 14)
Font size in pixels.
Recommended ranges:
* Body text: 14-16px.
* Headings: 18-32px.
* Small text: 12-13px.
**Colors** `group`
Color scheme for the button.
**Properties**
**Background** `color` (default: #ffffff)
Background color of the button.
**default** `#ffffff`
**Text** `color` (default: #2C3136)
Text color for the button label. Ensure sufficient contrast with background color.
**default** `#2C3136`
**Border** `color` (default: #D7DBDF)
Outline color of the button.
**default** `#D7DBDF`
**Border Radius** `number` (default: 0)
Border radius in pixels. Controls corner roundness.
* `0` = Square corners
* `4-8` = Subtle rounding
* `20+` = Pill-shaped button
# Facets
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/facets
Interactive filtering component for refining search results by categories and attributes in UI Studio applications
The Facets component in UI Studio provides interactive filters that allow users to refine search results by selecting categories, attributes, and values. Use facets to narrow down large datasets by criteria like manufacturer, category, price range, or any custom field from your data.
> **[UI Studio: Crafting the Discovery Experience](https://academy.lucidworks.com/training/019fecaa-3fd4-721e-8985-bf28d235dd76/overview)**
>
> Learn how to configure the Results List with Grid or Document layouts, set up facets with human-legible field names, and enable search-within-results refinement.
## Basic usage
Add a facets component to your UI Studio page to enable filtering capabilities. To build a minimal facets component, you must set a value for the Datastore field and a facet category to display.

Facets component in the canvas
If no facets are available for the provided datastore, the component displays an empty state message: "No facets found. Please try adjusting your search criteria."
To add a facet, click the **+** next to the **Facets** selector. Facets display in a vertical list.
## Searchable facet values
Enable search within facet values for categories with many options. When enabled, a search box appears within each facet category, allowing users to quickly find specific values. This is especially useful for facets with many values, for example, cities or product models.
Toggle the **Searchable Facet Values** switch to turn this feature on or off.
## Collapsible facets
Collapsible facets let users show or hide individual facet categories to reduce visual clutter.

Collapsible facet categories
When enabled, each facet category displays a chevron icon. Users can click to collapse categories they're not using, creating a cleaner interface. The collapsed state persists during the user's session.
Enabling collapsible facets is recommended when you have many facet categories. Users can focus on the filters they're actively using while hiding others.
Toggle the **Collapsible** switch to turn collapsible facet categories on or off.
## Inclusive and exclusive filtering
Enable advanced filtering with inclusion and exclusion operators. These filters let users include or exclude a facet from their search results and create complex filter combinations such as "show products from Sony or Samsung, but not refurbished items."
When enabled, each facet value displays plus and minus icons:
* **+ (Plus)**: Include results that match this facet value.
* **- (Minus)**: Exclude results that match this facet value.
Use inclusive and exclusive filtering for complex filtering through many facets. For simpler interfaces, turn this setting off to avoid overwhelming users with additional controls.
Toggle the **Inclusive/Exclusive** switch to turn this setting on or off.

Inclusive and exclusive filtering mode
## Selected facet pills
Use facet pills to display selected filters as removable pills before the facet categories. These facet pills provide a visual indicator to users about the facets they're actively filtering by.
Users can select individual facet pills to remove that filter from their current search results.
A **Clear All** link also appears, letting users remove all active filters at once.

Selected facet pills display
Toggle the **Selected Facet Pills** switch to turn this feature on or off.
## Configuration properties
**Datastore** `dropdown` *required*
Data source that provides facet categories and values. Must be configured in your UI Studio application.
**Facets Title** `string`
Optional text label displayed as the heading above the facets panel.
**Facets** `array`
Configure individual facet fields to display in the component.
**Properties**
**Field Name** `string`
The field name from your datastore to use as a facet.
**Display Name** `string`
The label shown to users for this facet category (for example, "Manufacturer", "Color").
**Multi Select** `boolean` (default: false)
When enabled, allows users to select multiple values within this facet category.
**Searchable Facet Values** `boolean` (default: false)
When enabled, adds a search box within each facet category for filtering values. This setting is recommended for facets with ten or more values.
**Collapsible** `boolean` (default: false)
When enabled, facet categories can be collapsed and expanded with chevron icons. The collapsed state persists in the user's session.
**Inclusive/Exclusive** `boolean` (default: false)
When enabled, displays **+** and **-** icons next to facet values for inclusive or exclusive filtering. This allows complex filter combinations like "include Sony or Samsung, but exclude refurbished".
**Selected Facet Pills** `boolean` (default: false)
When enabled, displays active filters as removable pills at the top with a **Clear All** option. Shows inclusive (+) or exclusive (-) indicators when Inclusive/Exclusive mode is enabled.
**Facets Title Font** `group`
Typography settings for the main facets heading or title.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for facets title.
**Font Weight** `dropdown` (default: Regular)
Font weight for facets title.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for facets title.
**Facet Field Font** `group`
Typography settings for facet category titles (for example, "Manufacturer", "Color").
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for facet category titles.
**Font Weight** `dropdown` (default: Bold)
Font weight for facet category titles.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for facet category titles.
**Facet Value Font** `group`
Typography settings for facet values (for example, "Sony", "Purple").
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for facet values.
**Font Weight** `dropdown` (default: Regular)
Font weight for facet values.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for facet values.
**Search Input** `group`
Typography settings for the search input field within facet categories. Used when **Searchable Facet Values** is enabled.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for search input text.
**Font Weight** `dropdown` (default: Regular)
Font weight for search input text.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for search input text.
**Selected Filters Header** `group`
Typography settings for the "Selected Filters:" header text when Selected Facet Pills is enabled.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for selected filters header.
**Font Weight** `dropdown` (default: Regular)
Font weight for selected filters header.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 12)
Font size in pixels for selected filters header.
**Selected Filter Pill** `group`
Typography settings for the filter pill text when Selected Facet Pills is enabled.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for filter pill text.
**Font Weight** `dropdown` (default: Regular)
Font weight for filter pill text.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for filter pill text.
**Colors** `group`
Color scheme for the facets component.
**Properties**
**Background** `color` (default: #ffffff)
Background color for the facets container.
**default** `#ffffff`
**Facets Title** `group`
Color properties for the facets title.
**Properties**
**Facets Title Font** `color` (default: #2C3136)
Text color for the main facets title.
**default** `#2C3136`
**Facets Title Background** `color` (default: #ffffff)
Background color for the facets title area.
**default** `#ffffff`
**Facets Title Border** `color` (default: #ffffff)
Border color for the facets title area.
**default** `#ffffff`
**Facet Field** `group`
Color properties for the facet field.
**Properties**
**Facet Field Font** `color` (default: #2C3136)
Text color for facet category titles. Ensure sufficient contrast with background.
**default** `#2C3136`
**Facet Field Background** `color` (default: #ffffff)
Background color for facet category title rows.
**default** `#ffffff`
**Facet Field Border** `color` (default: #ffffff)
Border color for facet category title rows.
**default** `#ffffff`
**Facet Value** `group`
Color properties for the facet value.
**Properties**
**Facet Value Font** `color` (default: #2C3136)
Text color for facet values. Ensure sufficient contrast with background.
**default** `#2C3136`
**Hover Over** `color` (default: #F9FAFB)
Background color when hovering over facet values.
**default** `#F9FAFB`
**Facet Search** `group`
Color properties for the facet search input.
**Properties**
**Facet Search Text** `color` (default: #2C3136)
Text color for the search input field within facet categories.
**default** `#2C3136`
**Facet Search Background** `color` (default: #ffffff)
Background color for the search input field within facet categories.
**default** `#ffffff`
**Selected Filters Header** `group`
Color properties for the selected filters header.
**Properties**
**Title** `color` (default: #2C3136)
Text color for the "Selected Filters:" header label.
**default** `#2C3136`
**Clear All** `color` (default: #0066cc)
Text color for the "Clear All" link.
**default** `#0066cc`
**Selected Filter Pill** `group`
Color properties for the selected filter pill.
**Properties**
**Pill Font** `color` (default: #2C3136)
Text color for filter pill labels.
**default** `#2C3136`
**Pill Background** `color` (default: #E8E8E8)
Background color for filter pills.
**default** `#E8E8E8`
**Pill Border** `color` (default: #d0d0d0)
Border color for filter pills.
**default** `#d0d0d0`
**Pill Icon** `color` (default: #2C3136)
Color for the remove icon (×) on filter pills.
**default** `#2C3136`
**Inclusive/Exclusive Buttons** `group`
Color properties for the inclusive/exclusive buttons.
**Properties**
**Background** `color` (default: #ffffff)
Background color for the + and - buttons when Inclusive/Exclusive mode is enabled.
**default** `#ffffff`
**Border** `color` (default: #ECEEF0)
Border color for the + and - buttons when Inclusive/Exclusive mode is enabled.
**default** `#ECEEF0`
**Active Background** `color` (default: #2C3136)
Background color for active + or - buttons when Inclusive/Exclusive mode is enabled.
**default** `#2C3136`
**Active Icon** `color` (default: #ffffff)
Icon color for active + or - buttons when Inclusive/Exclusive mode is enabled.
**default** `#ffffff`
# Image
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/image
Display images with optional links and views in UI Studio applications
The Image component displays static or dynamic images in your UI Studio pages. Use images to add visual content, branding, product photos, or clickable banners. The component supports clickthrough links, alternative text, and fallback images.
## Basic usage
Add an image component to your UI Studio page to display visual content.

Basic Image component
Provide an image URL to display it on your page. The component supports common image formats including JPG, PNG, GIF, and SVG.
If the primary image fails, the component automatically loads the fallback image if one is configured. If both images fail, the component does not display in order to avoid broken image icons. If there is no image URL, the component does not render.
## Best practices
* Optimize images to reduce file size without sacrificing quality. While Lucidworks does not make a specific recommendation, tools such as TinyPNG, ImageOptim, or your image editor's "Save for Web" feature are available. The recommended maximum file size is 2MB for web display.
* If possible, configure a fallback image that displays if the primary image fails to load.
* Use appropriate image formats for different content types:
* **JPG**: Photos and complex images
* **PNG**: Graphics with transparency or text
* **SVG**: Logos and icons to ensure correct scaling
* **WebP**: Modern format with better compression, if browser support allows
* Always provide meaningful Alt (alternative) text that conveys the purpose and content of the image. Screen readers rely on this to describe images to visually impaired users. Alt text also improves SEO and displays when images fail to load.
* Avoid using images of text for important content. Screen readers cannot read text embedded in images.
## Configuration properties
**Image URL** `string`
URL to the image file.
**Alt Text** `string`
Descriptive text for accessibility and SEO.
Describe the image content and purpose. Avoid generic phrases like "image" or "photo".
**Link** `string`
Clickthrough URL. When configured, clicking the image navigates to this URL.
Examples:
* `https://www.example.com`
* `/products`
* `https://example.com/offers`
Leave blank for non-clickable images.
**Fit Mode** `dropdown` (default: cover)
Controls how the image fits within its container dimensions.
**Options**
**Contain** `option`
Scales the image to fit within the container while maintaining aspect ratio. May show letterboxing or pillarboxing (empty space on sides/top/bottom).
**Cover** `option`
Scales the image to cover the entire container while maintaining aspect ratio. May crop portions of the image. This is the default.
**Border Radius (px)** `number` (default: 0)
Corner roundness in pixels.
* `0` = Square corners (default)
* `4-8` = Subtle rounded corners
* `12-16` = Noticeably rounded corners
* `50+` = Circular (when width equals height)
**Fallback Image URL** `string`
Optional backup image URL. Displays if the primary image fails to load.
# Results
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/results
Display search results with sorting, pagination, conditional row coloring, and dynamic row linking
The Results component displays search results from your datastore in a table format. Use this component to present search findings, product listings, data tables, or any collection of records. The component supports sorting, pagination, conditional row coloring, and dynamic page linking.
> **[UI Studio: Crafting the Discovery Experience](https://academy.lucidworks.com/training/019fecaa-3fd4-721e-8985-bf28d235dd76/overview)**
>
> Learn how to configure the Results List with Grid or Document layouts, set up facets with human-legible field names, and enable search-within-results refinement.
## Basic usage
Add a Results component to your UI Studio page to display search results. The component typically works alongside a [Search Bar component](/docs/lw-platform/lw-ui-studio/components/search-bar) and [Facets component](/docs/lw-platform/lw-ui-studio/components/facets) to display and filter query results, but can also work standalone.

Results component in the canvas
When no search query is active, the component displays all records by default. The Results component updates when users apply filters or perform searches.
The Results component supports a variety of content types and layouts. Common use cases include:
* **Product listings**: A catalog of items for sale, such as an ecommerce store. Create results listings with images, prices, and "Add to Cart" buttons.
* **Search results**: A display of documents or records matching a user query. Create results listings with titles, descriptions, and snippets.
* **Data tables**: A structured view for tabular data users need to compare or filter. Create results listings with sorting and conditional coloring for status.
* **User directory**: A browsable list of users or contacts with role information. Create results listings with profile links and role-based coloring.
* **Document library**: A collection of files organized for browsing and download. Create results listings with file types, dates, and download links.
## Display your results
The table view displays results as a structured data table with columns and rows. This layout is best for structured data and sortable datasets, as the table view is optimized for dense information display.
Click the **+** next to **Columns** to display a column in the results. Columns display in the order that they are added.
To keep column headers visible while you scroll through results, turn on the **Sticky Header** toggle.
## Sort options
Configure the sort criteria for users. Use these options so that users can sort the results by preset criteria, such as price, name, or quantity.
The sort options display in a dropdown menu above the search results. Sorting by relevance is included by default.
> [!NOTE]
>
> The sort options display in the order that you added them. The default Relevance option always appears first in the user-facing dropdown, even though it is listed last in the configuration panel.
## Pagination
Use pagination to configure the number of results per page and how many results the user can choose to display per page.
When pagination is turned off, only the first page of results displays.
When you enable pagination, you can set the default number of results to display per page in the **Default Results Count** field. The default value is 10 results.
You can also configure the number of results to display per page for users to select. Set these values in the **Results Count** fields, listed from lowest to highest.
## Conditional row coloring
Use conditional row coloring to apply background and text color to rows based on field values, making it easy to surface important information at a glance. Use this feature to flag inventory items with low stock, highlight tasks that are past due, distinguish active records from inactive ones, or draw attention to high-priority items without requiring users to sort or filter the table themselves.
Each rule evaluates a field against a condition and a value, then applies the configured colors to any matching row. When you configure multiple rules, the component evaluates them in the order listed and applies the first matching rule. Rows that match no rule use the default table styling.
> [!TIP]
>
> Because the component evaluates rules top to bottom and applies the first match, you can order rules from most critical to least critical status to ensure proper highlighting.
**Inventory alerts**
An ecommerce catalog uses a `stock_status` field to alert buyers and staff about inventory availability. The rule checks whether `stock_status` equals `Out of stock` and applies a red background to signal that the item is unavailable.

Conditional row formatting based on availability
That same approach extends to any number of statuses. A second rule can check whether `stock_status` equals `Low stock` and apply a yellow background to indicate limited availability, and a third can check whether `stock_status` equals `In Stock` and apply a green background to indicate healthy inventory levels. You can continue adding rules for any status value your catalog defines.
**In stock** `#f0fdf4`
**Limited** `#fefce8`
**Out of stock** `#fef2f2`
**Status highlighting**
A task management table uses a `status` field to communicate record state at a glance. One rule checks whether `status` equals `Active` and applies a green background. Another checks whether `status` equals `Inactive` and applies a gray background. A third checks whether `status` equals `Error` and applies a red background with white text.
Use subtle background tints rather than saturated colors so that text remains readable across all rows.
**Priority indicators**
A support queue uses a `priority` field to help agents triage incoming requests. One rule checks whether `priority` equals `High` and applies red text. Another checks whether `priority` equals `Medium` and applies orange text. A third checks whether `priority` equals `Low` and applies green text.
Text color changes alone work well when you want to signal priority without overwhelming the table with heavy background coloring.
## Dynamic page link
Use dynamic page links to navigate users directly from a table row to a detail page, connecting your results table to the rest of your application. Use this feature to build product catalog tables where rows link to product detail pages, user directories where names link to profile pages, or document lists where entries open document viewers.
When **Link Mode** is set to **Action**, the **Display Type** setting controls how the link appears in the table. Choose **Link** when the field value is a natural, recognizable label that users expect to click, such as a username or a document title. Choose **Button** when the field value is an internal ID or technical string you do not want to display, and the action should appear as a labeled button.
To use a redirect button, define the destination URL with the **Page** base path and a **URL Template** that combines the page path with a placeholder for the field value. Wrap the placeholder in curly braces to mark where the field value is injected. The template `/products/PRODUCT_ID` resolves to `/products/ABC123` when the `PRODUCT_ID` field contains `ABC123`. You can position the placeholder anywhere in the template path, such as `/users/{username}/profile` or `/documents/{doc_id}`.
You can configure multiple dynamic links on the same table, assigning one link configuration per column. This lets you create multi-action rows with a mix of link types, such as a "View" redirect button in one column alongside an "Edit" button in another.
**Product detail link**
A product catalog table links each row to its corresponding product detail page. Set **Column** to `PRODUCT_ID`, **Link Mode** to **Action**, **Display Type** to **Button**, **Button Label** to "View Product". Set the **URL Template** to `/products/PRODUCT_ID`. A row where `PRODUCT_ID` contains `ABC123` navigates the user to `/products/ABC123`.
**User profile link**
A user directory makes the username itself a clickable link to the user profile page. Set **Column** to `username`, **Link Mode** to **Inline**, and **URL Template** to `/users/{username}/profile`. The displayed username becomes a link without a separate button.
**Document with action button**
A document library hides the internal document ID and exposes only a labeled action button. Set **Column** to `doc_id`, **Link Mode** to **Action**, **Display Type** to **Button**, **Button Label** to "Open Document", and **URL Template** to `/documents/{doc_id}/view`. The document ID is not shown to users. Only the button is displayed.
> [!NOTE]
>
> When creating URL templates for Dynamic Page Links, test with sample data to ensure links resolve correctly. Invalid templates result in broken navigation.
## Configuration properties
### Basic configuration
**Datastore** `dropdown` *required*
Data source for results. Must be configured in your UI Studio application.
**Search Highlighting** `boolean` (default: false)
When enabled, highlights search terms within table cells to show matches visually.
**Row Striping** `boolean` (default: false)
When enabled, alternates row background colors for improved readability.
**Columns** `group`
Configure which data fields display as table columns. Add multiple columns using the **+** button.
**Properties**
**Field Name** `string`
Field name from your datastore to display as a column.
**Display Name** `string`
Label shown in the column header.
**Display Type** `dropdown` (default: text)
How the field content is rendered.
**Options**
**text** `option`
Plain text display.
**image** `option`
Image display.
**date** `option`
Formatted date display.
**price** `option`
Currency-formatted display.
**hyperlink** `option`
Clickable link display.
**Sticky Header** `boolean` (default: true)
When enabled, column headers remain visible while scrolling through table rows.
**Column Header Font** `group`
Typography settings for column headers.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for column header text.
**Font Weight** `dropdown` (default: Bold)
Font weight for column header text.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for column header text.
**Sort** `group`
Configure available sort criteria for users. The **Relevance** option is included by default and displays last in the sort dropdown.
**Properties**
**Sort Options** `array`
Available sort options. Add multiple options using the + button.
**Sort Option Properties**
**Field Name** `string`
Data field to sort by.
**Order** `dropdown` (default: Ascending)
Sort direction for this option.
**Options**
**Ascending** `option`
Sort from lowest to highest: A-Z, 0-9, oldest to newest.
**Descending** `option`
Sort from highest to lowest: Z-A, 9-0, newest to oldest.
**Display Name** `string`
Label shown to users in the sort dropdown.
Examples: "Price: Low to High", "Newest First", "Product Name: A-Z"
**Pagination** `group`
Configure pagination controls for navigating through result pages.
**Properties**
**Pagination Enabled** `boolean` (default: true)
When enabled, displays pagination controls for navigating through result pages. Otherwise, only the first page of results displays.
**Default Results Count** `number` (default: 10)
Number of results displayed per page by default.
**Results Count** `array` (default: \[10, 20, 50, 100])
Number of results to display per page.
**Count Properties**
**Count** `number`
Number of results per page.
Add or remove values using the **+** and **-** buttons to customize available page sizes.
**Table Styling & Layout** `group`
Visual appearance settings for the table.
**Properties**
**Cell Value Font** `group`
Typography settings for table cell content.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for cell value text.
**Font Weight** `dropdown` (default: Regular)
Font weight for cell value text.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for cell value text.
**Text Alignment** `radio` (default: Left)
Horizontal alignment for table cell content.
**Options**
**Left** `option`
Align text to the left edge of the column.
**Center** `option`
Align text to the center of the column.
**Right** `option`
Align text to the right edge of the column.
**Colors** `group`
Color scheme for the table.
**Properties**
**Table Background** `color` (default: #FFFFFF)
Background color for the entire table.
**default** `#FFFFFF`
### Advanced configuration
**Conditional Row Coloring** `group`
Apply styling to rows based on field values.
**Properties**
**If** `dropdown`
Column or field to evaluate.
**Condition** `dropdown`
Comparison operator.
**Options**
**Equals** `option`
Matches rows where the field equals the specified value.
**Not equals** `option`
Matches rows where the field does not equal the specified value.
**Contains** `option`
Matches rows where the field contains the specified value.
**Not contains** `option`
Matches rows where the field does not contain the specified value.
**Starts with** `option`
Matches rows where the field value begins with the specified text.
**Ends with** `option`
Matches rows where the field value ends with the specified text.
**Value** `string`
Value to compare against. The type depends on field and condition.
**Background Color** `color`
Row background color when condition is true.
**Text Color** `color`
Row text color when condition is true. Ensure sufficient contrast with background.
**Dynamic Page Link** `group`
Clickable links or buttons in table columns that navigate to detail pages.
**Properties**
**Column** `dropdown`
Field that provides the link data or navigation context.
**Link Mode** `dropdown` (default: Inline)
Determines how the link is integrated into the table.
**Options**
**Inline** `option`
Link embedded directly in the cell value.
**Action** `option`
Separate action link or button alongside the cell value.
**Display Type** `dropdown` (default: Link)
How the action appears when Link Mode is set to Action.
Appears only when **Link Mode** is set to **Action**.
**Options**
**Link** `option`
Displays as a text link.
**Button** `option`
Displays as a button.
**Link Text** `string`
Text displayed for the link.
Appears only when the **Display Type** is **Link** or when **Link Mode** is **Inline**.
**Button Label** `string`
Text displayed on the button.
Only shown when **Link Mode** is **Action** and **Display Type** is **Button**.
**URL Template** `string`
URL pattern with placeholders for dynamic values.
Format: Use curly braces `{field_name}` as placeholders for field values.
Examples:
* `/details/PRODUCT_ID`
* `/users/{username}/profile`
* `/documents/{doc_id}`
**Value is URL** `boolean` (default: false)
When enabled, treats the column value itself as a complete URL rather than injecting it into the URL Template.
**Open in New Tab** `boolean` (default: false)
When enabled, opens the link in a new browser tab instead of navigating in the current tab.
# Search Bar
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/search-bar
Interactive search input with typeahead autocomplete suggestions in UI Studio applications
The Search Bar component in UI Studio provides a text input field for users to search for content. Use search bars to enable keyword searching with optional typeahead autocomplete that suggests results as users type. The component supports customizable placeholder text, styling, and configurable typeahead suggestions.
Pair the search bar component with the [results component](/docs/lw-platform/lw-ui-studio/components/results) and the [facets component](/docs/lw-platform/lw-ui-studio/components/facets) to build a complete search experience.
> **[UI Studio: Building the Search Entry Point](https://academy.lucidworks.com/training/019fd941-8756-78d5-a40e-7d39048b4572/overview)**
>
> Learn how to configure the Search Bar component with Typeahead, map it to a Fusion query profile, and customize its placeholder text and styling.
## Basic usage
Add a search bar component to your UI Studio page to enable search capability. To build a minimal search component, you must set values for the Name and Datastore fields.

Search Bar component dropped into the header section
Users type queries and press Enter to search.
> **[UI Studio: Data Integration & Customization](https://academy.lucidworks.com/training/019fd952-23b7-7190-8343-71c7d3ea6850/overview)**
>
> Learn how to link UI Studio components to Fusion datastores for live data, then use preview mode to validate the experience.
## Typeahead
You can enable autocomplete suggestions that appear as users type. When typeahead is enabled, the search bar displays a dropdown of suggested queries as users type. Users can:
* Click a suggestion to search for it.
* Use arrow keys to navigate suggestions.
* Press Enter to search the highlighted suggestion.
* Press Escape to close the dropdown.
To configure typeahead, you must have a configured typeahead datasource. This datasource can be the same as your primary datasource for search. If the endpoint is missing or unreachable, UI Studio automatically deactivates typeahead to prevent errors.
> [!NOTE]
>
> Typeahead suggestions improve discoverability and reduce typos, but they also add complexity. Turn the typeahead setting off for simple search scenarios or when your dataset is small.
Expand the **Typeahead** section to configure autocomplete behavior and appearance.
### Suggestion count
Set the maximum number of typeahead suggestions to display in the **Suggestion Count** field.
Enter a number in the **Suggestion Count** field, for example, 5, 10, or 15.
The default value is 10 suggestions. Keep suggestion counts between 5 and 10 to balance performance and suggestion variety. Too few suggestions limit discovery, while too many suggestions can overwhelm users.
### Search character count
Set the minimum number of characters required before showing suggestions. Enter a number in the **Search Character Count** field, for example, 2, 3, or 4.
Setting a higher number prevents typeahead from triggering on very short queries that would return too many broad suggestions. If you have a dataset with distinct terms, use a lower value.
> [!NOTE]
>
> Higher character counts reduce the number of typeahead API calls, improving performance. However, higher character counts also delay when users see useful suggestions.
## Configuration properties
**Name** `string` *required*
Component identifier for organization and reference. The name does not display on your user-facing website.
**Datastore** `dropdown` *required*
Primary data source for search queries. Must be configured in your UI Studio application.
**Typeahead Datastore** `dropdown`
Data source for autocomplete suggestions. This datastore can be the same as the main datastore or a separate optimized source. If the endpoint is missing or unreachable, typeahead is automatically deactivated to prevent errors.
**Placeholder Text** `string` (default: Search anything...)
Hint text displayed when the search bar is empty. Should be concise and descriptive.
**Placeholder Text Style** `group`
Typography settings for placeholder text.
**Properties**
**Font Family** `dropdown` (default: Public Sans)
Font family for placeholder text.
**Font Weight** `dropdown` (default: Regular)
Font weight for placeholder text.
**Options**
**Regular** `option`
Standard weight.
**Bold** `option`
Heavy weight.
**Font Size** `number` (default: 14)
Font size in pixels for placeholder text.
**Colors** `group`
Color scheme for the search bar.
**Properties**
**Search Bar** `color` (default: #F5F8FA)
Background color for the search input field.
**default** `#F5F8FA`
**Placeholder Text** `color` (default: #999999)
Text color for placeholder text. Should be lighter than entered text for clear distinction.
**default** `#999999`
**Typeahead** `group`
Autocomplete suggestion settings.
**Properties**
**Enabled** `boolean` (default: true)
When enabled, displays autocomplete suggestions as users type. Typeahead is enabled by default but requires a configured Typeahead datastore. This datastore can be the same as your search datastore. If no datastore is configured, typeahead is automatically deactivated.
**Suggestion Count** `number` (default: 10)
Maximum number of autocomplete suggestions to display.
Recommended range: 5 to 10
**Search Character Count** `number` (default: 3)
Minimum number of characters required before showing typeahead suggestions.
Recommended range: 2 to 5
**Dropdown Background** `color` (default: #ffffff)
Background color for the suggestions dropdown.
**default** `#ffffff`
**Item Hover Background** `color` (default: #F5F8FA)
Background color when hovering over a suggestion.
**default** `#F5F8FA`
**Item Selected Background** `color` (default: #F5F8FA)
Background color for keyboard-selected suggestions.
**default** `#F5F8FA`
**Item Active Background** `color` (default: #F5F5F5)
Background color for actively selected items.
**default** `#F5F5F5`
**Item Text Color** `color` (default: #2C3136)
Text color for suggestion items.
**default** `#2C3136`
**Font Family** `dropdown` (default: Public Sans)
Font family for typeahead suggestion text.
**Font Weight** `dropdown` (default: Regular)
Font weight for typeahead suggestion text.
**Font Size** `number` (default: 14)
Font size in pixels for typeahead suggestion text.
# Text
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/components/text
Display and format text content with rich styling options in UI Studio applications
The Text component of UI Studio lets you create formatted text that displays on your UI Studio pages. Use text components to add headings, paragraphs, instructions, labels, or any textual content. The text in the component can be configured to display in various formats such as italic, underline, specific text alignment, and custom styling.
## Basic usage
Add a text component to your UI Studio page to display content.

Basic Text component
Enter your text content and apply formatting to create visually appealing, readable content.
## Best practices
* Format similar items consistently. For example, if you bold important terms in one text component, use the same format for all important terms.
* Limit the number of fonts and font sizes on a specific UI Studio page. Use a font type that reflects your organization's design. For font size, select one for all headings, another for body text, and another for footnotes and other small text.
* Avoid using multiple emphasis styles on the same text. For example, choose just bold, but do not underline or italicize the same text as well.
## Configuration properties
### Basic properties
**Text** `string`
The text content to display. Supports rich text formatting when Font options are applied. Text line length is 50-75 characters for optimal readability, but use 35-50 characters for mobile devices.
**Font** `group`
Typography settings for the text.
**Properties**
**Family** `dropdown` (default: Public Sans)
Font typeface for the text.
**Weight** `dropdown` (default: Regular)
Font weight for the text. Options are Regular, Light, Bold, and Extra Bold.
**Size** `number` (default: 14)
Font size in pixels.
Recommended ranges:
* Body text: 14-16px.
* Headings: 18-32px.
* Small text: 12-13px.
**Italic** `boolean`
When enabled, the text is italicized.
**Underline** `boolean`
When enabled, the text is underlined.
**Text Alignment** `option`
How the text is aligned in the text field. Options are Left, Center, or Right.
**Colors** `group`
Color settings for the text.
**Properties**
**Font Color** `color` (default: #2C3136)
Text color for the component.
**default** `#2C3136`
### Advanced properties
**Padding Top** `integer`
The amount of whitespace at the top of the text field in pixels.
**Padding Left** `integer`
The amount of whitespace on the left edge of the text field in pixels.
# Compositions
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/compositions
A composition is the top-level container you build, version, and publish in UI Studio.
A composition contains one or more pages, each with its own URL. You arrange components on each page's canvas, configure them, and publish when ready. UI Studio tracks every save as a new version so you can view the full history of your work.
> **[UI Studio: Navigating the Workspace](https://academy.lucidworks.com/training/019fd953-64f2-7595-a328-2bb17e404165/overview)**
>
> Learn how to access the UI Studio home page and manage your existing compositions.
## The compositions list
The Compositions screen shows all compositions in your environment. Each row displays the composition name and the date and time it was last edited. Click any row to open the composition in the editor.

The Compositions screen, where you create, manage, and publish your UI Studio compositions.
Use the search bar to filter compositions by name or description. Use the **Filters** button to filter by a date range for the Last Edited On column. Click the **Name** or **Last Edited On** column headers to sort the list.
> **Add a composition**
>
> Follow these steps to add a new composition.
>
> **1. Open the Compositions screen**
>
> Navigate to **UI Studio** in the left navigation panel and click **Builder**.
>
> **2. Click Create New UI**
>
> On the Compositions screen, click **Create New UI**, enter a name and description for the composition, and click **Create**.
>
> 
>
> Add a new composition.
>
> The new composition is listed on the Compositions screen. You can now select the composition and build it.
> **Build a composition**
>
> Follow these steps to add components to build a composition.
>
> **1. Open the Compositions screen**
>
> Navigate to **UI Studio** in the left navigation.
>
> **2. Select a composition**
>
> Select a composition from the list.
>
> **3. Start building**
>
> The new composition opens in the editor.
>
> **Composition**
>
> **Search Page**
>
> **Search Bar**
>
> **Results**
>
> **Facets**
>
> **Details Page**
>
> **Text**
>
> **Image**
>
> **Button**
>
> * Add pages, and then click the main canvas. Click the gear icon of the canvas to open the **Customize Section** panel and set the canvas color and size.
>
> * Drag components from the left panel onto the canvas to build your page layout.
>
> * Click any component to select it and configure it in the **Customize** panel.
>
> * Repeat across pages until your composition is ready, then save your work.
>
> The Quickstart walks through this process end to end, and the component documentation covers every configuration option.
>
> > **[Quickstart](/docs/lw-platform/lw-ui-studio/quickstart)**
> >
> > Get up and running with your first UI Studio page in minutes.
>
> > **[Components](/docs/lw-platform/lw-ui-studio/components/search-bar)**
> >
> > Browse available components and learn how to configure them.
> **Manage pages in a composition**
>
> A composition contains one or more pages. Each page has a name and a URL path. One page is designated as the home page, which loads when a user visits the root of your published composition. Pages can also contain subpages, each with a URL path nested under the parent page's path.
>
> 
>
> Page management in a composition.
>
> **Name** `string` *required*
>
> Display name for the page.
>
> **URL** `string` *required*
>
> URL path for the page, relative to the composition's root URL.
>
> **Home Page** `boolean`
>
> When true, this page loads when a user visits the root of the published composition. Only one page can be the home page.
>
> **Subpages** `array`
>
> Optional child pages nested under this page's URL path. Each subpage has the same configuration options as a top-level page.
> **Publish a composition**
>
> Publishing makes your composition available at a public URL in the format `YOUR_COMPANY.ui.lucidworks.cloud/COMPOSITION_NAME`.
>
> **1. Click Publish**
>
> In the composition's editor screen, click **Publish**.
>
> **2. Confirm publication details**
>
> Review and confirm the location to publish. It typically includes your company name, composition name, and page title. Click **Publish**.
>
> 
>
> Add a new composition.
>
> > [!NOTE]
> >
> > The published URL uses the composition name. To change the URL, update the composition name before publishing.
## End-user single sign-on for published compositions
UI Studio supports end-user Single Sign-On (SSO) using Okta OIDC and controls access for end users who visit published search sites.
When enabled, users must authenticate before accessing a published composition at `YOUR_COMPANY.ui.lucidworks.cloud/COMPOSITION_NAME`. When SSO is not enabled, the published URL is publicly accessible.
To enable UI Studio SSO for your published compositions, contact your Lucidworks representative.
> [!NOTE]
>
> UI Studio SSO is different from Lucidworks Platform SSO, which controls access for administrators who build and manage compositions in the Lucidworks Platform workspace.
## Composition settings
Settings apply at the composition level and affect all pages. Access settings from the editor toolbar.
### Branding
Upload a logo and favicon for your composition. These appear in the browser tab and any branded areas of your pages.
**Logo** `file`
Image file displayed in branded areas of your composition.
**Favicon** `file`
Icon file displayed in the browser tab.
### Localization
Configure the language, timezone, and date and time format for your composition. These settings affect how dates and times display across all pages.
**Language** `string`
Language code for the composition, for example, `en-US`.
**Timezone** `string`
Timezone for the composition, for example, `America/Los_Angeles`.
**Date and time format** `string`
Format string for displaying dates and times, for example, `MM/DD/YYYY h:mm A`.
### Authentication
Configure single sign-on (SSO) for your composition using OIDC.
**Enabled** `boolean`
When true, SSO is required to access the composition.
**Session duration** `number`
How long, in hours, a user session remains valid.
**Session extension threshold** `number`
How many minutes before session expiry a session is eligible for extension.
**OIDC** `group`
Identity provider configuration for the OIDC protocol.
**OIDC settings**
**Client ID** `string` *required*
Client identifier registered with your identity provider.
**Client secret** `string` *required*
Client secret registered with your identity provider.
**Issuer URI** `string` *required*
Base URI of your identity provider.
**Authorization URI** `string` *required*
URI where users are redirected to authenticate.
**Token URI** `string` *required*
URI used to exchange authorization codes for tokens.
**JWKS URI** `string` *required*
URI of your identity provider's JSON Web Key Set.
**Userinfo URI** `string`
URI used to retrieve user profile information.
**End session endpoint** `string`
URI used to log users out of the identity provider.
**Scopes** `string[]`
OAuth scopes to request from the identity provider, for example, `openid`, `profile`, `email`.
# UI Studio
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/overview
Build interactive search experience pages with drag-and-drop canvas sections, pre-built components, and no-code configuration.
UI Studio lets you create and publish search experience pages without writing code. Arrange pre-built components on visual canvas sections, connect them to your datastore, and deploy directly to your users.
**UI Studio compositions**

The Compositions screen, where you create, manage, and publish your UI Studio compositions.
**UI Studio drag-and-drop**

Drag components from the left panel onto canvas sections to arrange your page layout.
**UI Studio editor**

The UI Studio editor, with the component palette on the left and the Customize panel on the right.
## How UI Studio works
**Compositions are standalone web experiences.** A composition works like a self-contained website, made up of one or more pages, each with its own URL. Arrange components on each page's canvas sections, configure them independently, and publish when ready.
**Components reflect your data.** Components retrieve and display data from a configured datastore. Your datastore changes update automatically.
**Configuration is visual.** Use the Customize panel to adjust component settings, styling, and behavior without editing code.
**Your changes are backed up automatically.** UI Studio saves your composition history as you work. If you need to revert a critical change, contact your Lucidworks representative.
**Publishing generates a public URL.** When you publish, your composition is hosted and immediately available to your users.
## Get started
> **[Quickstart](/docs/lw-platform/lw-ui-studio/quickstart)**
>
> Get up and running with your first UI Studio page in minutes.
> **[UI Studio: Data Integration & Customization](https://academy.lucidworks.com/training/019fd952-23b7-7190-8343-71c7d3ea6850/overview)**
>
> Learn how to link UI Studio components to Fusion datastores for live data, then use preview mode to validate the experience.
## Build your app
> **[Compositions](/docs/lw-platform/lw-ui-studio/compositions)**
>
> Arrange and manage page layouts using composition canvas sections.
## Components
Use pre-built components to build interactive search experiences.
> **[Search Bar](/docs/lw-platform/lw-ui-studio/components/search-bar)**
>
> Accept user queries and trigger search across your datastore.
> **[Results](/docs/lw-platform/lw-ui-studio/components/results)**
>
> Display search results views with sorting and pagination.
> **[Facets](/docs/lw-platform/lw-ui-studio/components/facets)**
>
> Let users narrow results by filtering on field values.
> **[Button](/docs/lw-platform/lw-ui-studio/components/button)**
>
> Add navigation, export, or action buttons to your pages.
> **[Image](/docs/lw-platform/lw-ui-studio/components/image)**
>
> Display images with optional links, borders, and fallback support.
> **[Text](/docs/lw-platform/lw-ui-studio/components/text)**
>
> Add static or dynamic text content with rich styling options.
# Quickstart
Source: https://doc.lucidworks.com/docs/lw-platform/lw-ui-studio/quickstart
Build a basic search interface in UI Studio Builder with Search Bar, Results, and Facets components.
This guide walks you through building a basic but functional search interface in UI Studio Builder. By the end, you will have a composition with a Search Bar, Results, Facets, Text, Image, and Button component working together as a complete search experience.
> [!NOTE]
>
> For more information, see [Compositions](/docs/lw-platform/lw-ui-studio/compositions).
**1. Add a composition**
Navigate to **UI Studio** in the left navigation panel and click **Builder**.

The Compositions screen, where you create, manage, and publish your UI Studio compositions.
On the Compositions screen, click **Create New UI**.
Enter a name and description for the composition and click **Create**.

Add a new composition.
The new composition is listed on the Compositions screen. You can now select the composition and build it.
**2. Open your composition**
On the Compositions screen, click a composition to open it in the editor.

Composition Editor screen
**3. Set canvas properties**
Click the main canvas and then click the gear icon to open the **Customize** panel on the right. Set a background color to match your company's branding, or adjust the section dimensions. These settings can be refined at any time.

Customize canvas properties
**4. Add components**
In the left panel of the Editor screen, click **Components**. Available components are listed in the left sidebar, organized into two categories: **Search** and **Content**.

Composition components
> [!NOTE]
>
> To customize each component, click the component in the Editor screen and select values in the **Customize** panel on the right. Set a background color to match your company's branding, or adjust the section dimensions. These settings can be refined at any time.
**5. Add a Search Bar**
> **[Search Bar](/docs/lw-platform/lw-ui-studio/components/search-bar)**
>
> Accept user queries and trigger search across your datastore.
In the left sidebar, find the **Search Bar** under the **Search** category. Drag it from the sidebar and hover over the header section in the canvas. The interface indicates where the component will land as you hover. Drop it into position.

Search Bar component dropped into the header section
The **Customize** panel opens on the right with the Search Bar configuration options. Configure the following:
* **Datastore**: Select the datastore you want to use for search queries.
* **Typeahead Datastore**: Select the datastore for autocomplete suggestions. This can be the same datastore as the one above.
* **Placeholder Text**: Replace the default text with something descriptive for your users, such as `Search our site`.
* **Typeahead**: Expand this section and toggle **Typeahead Enabled** to turn autocomplete on or off.
> **[UI Studio: Data Integration & Customization](https://academy.lucidworks.com/training/019fd952-23b7-7190-8343-71c7d3ea6850/overview)**
>
> Learn how to link UI Studio components to Fusion datastores for live data, then use preview mode to validate the experience.
For details on all Search Bar settings, see the [Search Bar](/docs/lw-platform/lw-ui-studio/components/search-bar) component documentation.
**6. Add a Results component**
> **[Results](/docs/lw-platform/lw-ui-studio/components/results)**
>
> Display search results in a table view with sorting and pagination.
Drag the **Results** component from the **Search** category in the left sidebar and drop it into the body area of the canvas.

Results component in the canvas
In the **Customize** panel, set the **Datastore** to the same datastore you selected for the Search Bar. This ensures the Results component displays results from the same search. Adjust the **Pagination** setting from the default to control how many results appear per page.
> [!TIP]
>
> Advanced compositions may use multiple Search Bars and Results components to support separate search experiences on the same page. For example, a company intranet might have one for document search and another for people search. To accommodate this, add a new section to the canvas by hovering between existing sections, where the option to create a new section appears.
For details on all Results settings, see the [Results](/docs/lw-platform/lw-ui-studio/components/results) component documentation.
**7. Add a Facets component**
> **[Facets](/docs/lw-platform/lw-ui-studio/components/facets)**
>
> Let users narrow results by filtering on field values.
Drag the **Facets** component from the **Search** category and drop it onto the canvas alongside the Results.

Facets component in the canvas
In the **Customize** panel, set the **Datastore** to the same datastore as the Search Bar and Results. This ensures the facets filter the same set of results. Configure a few options to shape the filtering experience:
* **Searchable Facet Value**: Toggle this on to add a search box within each facet category. This is helpful when a category has many values.
* **Collapsible**: Toggle this on to let users collapse and expand individual facet categories to save space.
* **Selected Facet Pills**: Toggle this on to show active filters as removable pills at the top of the facets panel.
For details on all Facets settings, see the [Facets](/docs/lw-platform/lw-ui-studio/components/facets) component documentation.
**8. Add content components**
> **[Text](/docs/lw-platform/lw-ui-studio/components/text)**
>
> Add text content with rich styling options.
> **[Image](/docs/lw-platform/lw-ui-studio/components/image)**
>
> Display images with optional links, borders, and fallback support.
> **[Button](/docs/lw-platform/lw-ui-studio/components/button)**
>
> Add navigation, export, or action buttons to your pages.
With the core search components in place, add content components from the **Content** category in the left sidebar: **Text**, **Image**, and **Button**.
* **Text**: Drag a Text component onto the canvas. For example, place it above the Results component as a section heading. The canvas layout adapts flexibly as you place components.
* **Image**: Drag an Image component next to the Search Bar in the header section. In the **Customize** panel, upload your company logo and set an appropriate width and height.
* **Button**: Drag a Button component onto the canvas. In the **Customize** panel, set the **Type** to **Link**, enter a label such as `Visit our site`, and enter your company site URL in the **Page Path** field.
Explore the configuration options for each component. For details, see the [Text](/docs/lw-platform/lw-ui-studio/components/text), [Image](/docs/lw-platform/lw-ui-studio/components/image), and [Button](/docs/lw-platform/lw-ui-studio/components/button) component documentation.
**9. Save or publish your composition**
When you are satisfied with your composition, use the toolbar at the top of the builder to save or publish it.

Publish confirmation screen
After publishing, preview the composition to see the user experience. Test a search query, apply facet filters, and confirm that the results update as expected.
# Create bulk operation
Source: https://doc.lucidworks.com/api-reference/bulk-operations/create-bulk-operation
/api-reference/saas/cs-rules-rewrites.json post /bulk-operations
Create a new bulk operation to perform actions on multiple rules. Supports publish, unpublish, edit, delete, and migrate operation types. Operations execute asynchronously.
# Delete bulk operation
Source: https://doc.lucidworks.com/api-reference/bulk-operations/delete-bulk-operation
/api-reference/saas/cs-rules-rewrites.json delete /bulk-operations/{id}
Delete a bulk operation record. This removes the operation from the system but does not reverse changes already applied to rules.
# Get bulk operation
Source: https://doc.lucidworks.com/api-reference/bulk-operations/get-bulk-operation
/api-reference/saas/cs-rules-rewrites.json get /bulk-operations/{id}
Retrieve details of a specific bulk operation including current status, individual rule statuses, and error messages for failed rules.
# List bulk operations
Source: https://doc.lucidworks.com/api-reference/bulk-operations/list-bulk-operations
/api-reference/saas/cs-rules-rewrites.json get /bulk-operations
List all bulk operations with optional filtering and pagination. Returns operations of all types including publish, unpublish, edit, delete, and migrate.
# Update bulk operation
Source: https://doc.lucidworks.com/api-reference/bulk-operations/update-bulk-operation
/api-reference/saas/cs-rules-rewrites.json put /bulk-operations/{id}
Update an existing bulk operation. Used to modify operation parameters or retry failed rules.
# FAQ Enrichment use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/faq-enrichment-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/faq-enrichment/{MODEL_ID}
The FAQ enrichment use case uses a large language model (LLM) to ingest input text and return a JSON response that contains a list of question and answer pairs.
# Image metadata enrichment use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/image-metadata-enrichment-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/image-metadata-enrichment/{MODEL_ID}
In the image metadata enrichment use case, the LLM ingests a text containing either a base64-encoded image or a public HTTP/HTTPS or Google Cloud Storage (`gs://`) image link and routes the image to a multimodal model. A JSON response is returned that contains an `imageMetadata` dictionary with a list of keywords, subcategories, and keyword synonyms.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Keyword extraction use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/keyword-extraction-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/keyword-extraction/{MODEL_ID}
In the keyword-extraction use case, the LLM ingests text and returns a JSON response that contains a list of keywords extracted from the text. No options can be configured.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Model predictions by use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/model-predictions-by-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/{USE_CASE}/{MODEL_ID}
This is an all-purpose prediction endpoint you can use by specifying a `USE_CASE` and `MODEL_ID`. Upon submission, the API responds with a unique `predictionId` and a `status`. The `predictionId` can be used later in the GET request to retrieve the results.
IMPORTANT: The available use cases are detailed in their own section in this specification.
# Named Entity Recognition (NER) use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/named-entity-recognition-ner-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/ner/{MODEL_ID}
In the Named Entity Recognition (NER) use case, the LLM ingests text and entities to extract and return a JSON response that contains a list of entities extracted from the text. No options can be configured.
This use case can be used to extract nouns and proper nouns such as Brand, Date, Company, Places, and Category in order to guide and refine searches.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Passthrough use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/passthrough-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/passthrough/{MODEL_ID}
The passthrough use case lets you use the service as a proxy to the large language model (LLM). The service sends text (no additional prompts or other information) to the LLM.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# RAG use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/rag-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/rag/{MODEL_ID}
The rag use case uses candidate documents that are inserted into a LLM’s context to ground the generated response to those documents instead of generating an answer from details stored in the LLM’s trained weights. This type of search adds guardrails so the LLM can search private data collections.
The RAG search can perform queries against external documents passed in as part of the request.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Standalone query rewriter
Source: https://doc.lucidworks.com/api-reference/create-predictions/standalone-query-rewriter
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/standalone-query-rewriter/{MODEL_ID}
The standalone query rewriter use case rewrites the text in reference to the context based on the memoryUuid.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Summarization use case
Source: https://doc.lucidworks.com/api-reference/create-predictions/summarization-use-case
/api-reference/saas/machine-learning-platform-async-prediction.json post /ai/async-prediction/summarization/{MODEL_ID}
In the summarization use case, the LLM ingests text and returns a summary of the text as a response.
The context length is 2048 tokens. No options can be configured.
The POST request obtains and indexes prediction information related to the specified use case, and returns a unique `predictionId` and `status` of the request. The `predictionId` can be used later in the GET request to retrieve the results.
# Get prediction results
Source: https://doc.lucidworks.com/api-reference/fetch-predictions/get-prediction-results
/api-reference/saas/machine-learning-platform-async-prediction.json get /ai/async-prediction/{PREDICTION_ID}
Fetch the results of a prediction task by its ID.
# Classification use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/classification-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/classification/{MODEL_ID}
The classification use case lets you use embedding models to compute similarity scores between the incoming text and the labels. It returns the labels ranked in order of most similar to least similar.
The classification use case is compatible with all Lucidworks hosted pre-trained and custom embedding models. The default behavior of embedding models is to always have a score returned.
The `topK` and `similarityCutoff` parameters can be used to achieve behaviors where only the following are returned:
* The single most applicable label
* Labels with similarities that exceed a threshold
* A set number of items
* A set number if it exceeds the threshold
# Custom model prediction
Source: https://doc.lucidworks.com/api-reference/get-predictions/custom-model-prediction
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/embedding/{MODEL_ID}
The custom model prediction is an embedding use case. If a custom model is trained and deployed using the Lucidworks AI Models API, the `DEPLOYMENT_ID` in the Models API is the same value as the `MODEL_ID` you enter in the custom model to return a prediction.
# English language model text encoder
Source: https://doc.lucidworks.com/api-reference/get-predictions/english-language-model-text-encoder
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/embedding/text-encoder
The English language encoder is an embedding use that takes in plain English text and returns a 768-dimensional vector encoding of that text. This model powers this semantic search.
The API truncates incoming text to approximately 256 words before the model encodes it and returns a vector. An example usage pattern is to encode all the texts and descriptions in a website and then use this encoder on query text, supporting natural language queries such as "1990s children’s fiction".
Each API request includes one batch containing up to 32 text strings.
# FAQ Enrichment use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/faq-enrichment-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/faq-enrichment/{MODEL_ID}
The FAQ enrichment use case uses a large language model (LLM) to ingest input text and return a JSON response that contains a list of question and answer pairs.
# Image metadata enrichment use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/image-metadata-enrichment-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/image-metadata-enrichment/{MODEL_ID}
In the image metadata enrichment use case, the LLM ingests a text containing either a base64-encoded image or a public HTTP/HTTPS or Google Cloud Storage (`gs://`) image link and routes the image to a multimodal model. A JSON response is returned that contains an `imageMetadata` dictionary with a list of keywords, subcategories, and keyword synonyms. The metadata can be generated based on the image, the image title, and the categories.
# Keyword extraction use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/keyword-extraction-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/keyword-extraction/{MODEL_ID}
In the keyword-extraction use case, the LLM ingests text and returns a JSON response that contains a list of keywords extracted from the text. No options can be configured.
# Model predictions by use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/model-predictions-by-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/{USE_CASE}/{MODEL_ID}
This is an all-purpose prediction endpoint you can use by specifying a `USE_CASE` and `MODEL_ID`.
IMPORTANT: The available use cases are detailed in their own section in this specification.
# Named Entity Recognition (NER) use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/named-entity-recognition-ner-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/ner/{MODEL_ID}
In the Named Entity Recognition (NER) use case, the LLM ingests text and entities to extract and return a JSON response that contains a list of entities extracted from the text. No options can be configured.
This use case can be used to extract nouns and proper nouns such as Brand, Date, Company, Places, and Category in order to guide and refine searches.
# Part Number Detection use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/part-number-detection-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/part-number-detection/{CUSTOM_DEPLOYMENT_ID}
The Part Number Detection use case of the LWAI Prediction API detects part numbers in order to help with query routing and classification, and uses the embedding model to ingest text and return a JSON response of `true` if the input is a part number, or `false` if the input is not a part number.
# Passthrough use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/passthrough-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/passthrough/{MODEL_ID}
The passthrough use case lets you use the service as a proxy to the large language model (LLM). The service sends text (no additional prompts or other information) to the LLM and returns a response.
# RAG use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/rag-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/rag/{MODEL_ID}
The rag use case uses candidate documents that are inserted into a LLM’s context to ground the generated response to those documents instead of generating an answer from details stored in the LLM’s trained weights. This type of search adds guardrails so the LLM can search private data collections.
The RAG search can perform queries against external documents passed in as part of the request.
# Standalone query rewriter
Source: https://doc.lucidworks.com/api-reference/get-predictions/standalone-query-rewriter
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/standalone-query-rewriter/{MODEL_ID}
The standalone query rewriter use case rewrites the text in reference to the context based on the memoryUuid.
# Summarization use case
Source: https://doc.lucidworks.com/api-reference/get-predictions/summarization-use-case
/api-reference/saas/machine-learning-platform-predict.json post /ai/prediction/summarization/{MODEL_ID}
In the summarization use case, the LLM ingests text and returns a summary of the text as a response.
The context length is 2048 tokens. No options can be configured.
# Cartadd signals
Source: https://doc.lucidworks.com/api-reference/get-signals/cartadd-signals
/api-reference/saas/lw-platform-signals.json post /retail/signals/cartadd
When a user adds an item to the cart for a potential sale, the information is contained in the cartadd signal.
# Click signals
Source: https://doc.lucidworks.com/api-reference/get-signals/click-signals
/api-reference/saas/lw-platform-signals.json post /retail/signals/click
When a user clicks on an item displayed from your site, including results returned from a query, the information is contained in a click signal.
# Purchase complete signals
Source: https://doc.lucidworks.com/api-reference/get-signals/purchase-complete-signals
/api-reference/saas/lw-platform-signals.json post /retail/signals/purchase
When a user completes a purchase and is taken to the order confirmation page, a signal is recorded.
# Query signals
Source: https://doc.lucidworks.com/api-reference/get-signals/query-signals
/api-reference/saas/lw-platform-signals.json post /retail/signals/query
When a user enters text to search your site, a query request is generated and the information is contained in a query signal.
# Tokenization by MODEL_ID
Source: https://doc.lucidworks.com/api-reference/get-tokens/tokenization-by-model_id
/api-reference/saas/machine-learning-platform-tokenization.json post /ai/tokenization/{MODEL_ID}
The tokenization request for the pre-trained and custom embedding use cases and specified embedding `modelId` (model name) sends text to return results in formats supported by embedding models.
# Get typeahead suggestions
Source: https://doc.lucidworks.com/api-reference/get-typeahead-suggestions
/api-reference/saas/lw-platform-typeahead.json get /typeahead/suggestions
The `GET /typeahead/suggestions` request retrieves a list of typeahead suggestions.
A total of 5,000 suggestions are allowed in the following distribution:
1. Your organization can enter a maximum of 4,000 custom terms (included and excluded) in the Core Settings Typeahead user interface.
2. Every hour, a maximum of 1,000 of the terms entered most often in customer searches are added to the Included typeahead suggestions list.
Results are sorted alphabetically. Sort options are not currently available.
The optional `prefix` query parameter filters suggestions returned. For example, `GET /typeahead/suggestions?prefix=El` returns the suggestions that begin with the letters `El`.
The optional `limit` query parameter limits the maximum number of suggestions returned. For example, `GET /typeahead/suggestions?limit=10` returns a maximum of 10 suggestions.
# Passthrough prompt
Source: https://doc.lucidworks.com/api-reference/passthrough-prompt/passthrough-prompt
/api-reference/saas/machine-learning-platform-prompt-passthrough.json post /ai/prompt/passthrough/{MODEL_ID}
The prompt request for the passthrough use case and specified generative AI (GenAI) `modelId` (model name) sends text to return results in formats supported by generative AI (GenAI) models.
# Create a query rewrite
Source: https://doc.lucidworks.com/api-reference/query-rewrite-management/create-a-query-rewrite
/api-reference/saas/cs-rules-rewrites.json post /query-rewrites
Create a query rewrite in Commerce Studio.
# Delete a query rewrite
Source: https://doc.lucidworks.com/api-reference/query-rewrite-management/delete-a-query-rewrite
/api-reference/saas/cs-rules-rewrites.json delete /query-rewrites/{id}
Delete a query rewrite.
# Get a query rewrite
Source: https://doc.lucidworks.com/api-reference/query-rewrite-management/get-a-query-rewrite
/api-reference/saas/cs-rules-rewrites.json get /query-rewrites/{id}
Retrieve a query rewrite.
# List query rewrites
Source: https://doc.lucidworks.com/api-reference/query-rewrite-management/list-query-rewrites
/api-reference/saas/cs-rules-rewrites.json get /query-rewrites
Note that sorting applies to the rule's staging content only. Filtering applies OR logic, so it matches if either the staging or live content matches the filter. Use `textSearchRelevance` sort to sort by search relevance (cannot be combined with other sort parameters).
# Update a query rewrite
Source: https://doc.lucidworks.com/api-reference/query-rewrite-management/update-a-query-rewrite
/api-reference/saas/cs-rules-rewrites.json put /query-rewrites/{id}
Update a query rewrite.
# Request Access Token
Source: https://doc.lucidworks.com/api-reference/request-access-token/request-access-token
/api-reference/saas/authentication.json post /oauth2/{auth}/v1/token
Use this API to generate an access token.
# Get results by chunkingId
Source: https://doc.lucidworks.com/api-reference/request-chunked-content/get-results-by-chunkingid
/api-reference/saas/machine-learning-platform-async-chunking.json get /ai/async-chunking/{CHUNKING_ID}
Fetch chunked content by chunking ID. The ID is returned in the response of the `POST` operation you used to trigger the chunking operation.
# Create a rule
Source: https://doc.lucidworks.com/api-reference/rule-management/create-a-rule
/api-reference/saas/cs-rules-rewrites.json post /em-rules
Create a rule in Commerce Studio.
# Delete a rule
Source: https://doc.lucidworks.com/api-reference/rule-management/delete-a-rule
/api-reference/saas/cs-rules-rewrites.json delete /em-rules/{id}
Delete a rule.
# Get a rule
Source: https://doc.lucidworks.com/api-reference/rule-management/get-a-rule
/api-reference/saas/cs-rules-rewrites.json get /em-rules/{id}
Retrieve a rule.
# List rules
Source: https://doc.lucidworks.com/api-reference/rule-management/list-rules
/api-reference/saas/cs-rules-rewrites.json get /em-rules
List all rules with optional filtering and pagination. Note that sorting applies to the rule's staging content only.
Filtering applies OR logic, matching if either the staging or live content matches the filter.
Use `textSearchRelevance` sort to sort by search relevance (cannot be combined with other sort parameters).
# Update a rule
Source: https://doc.lucidworks.com/api-reference/rule-management/update-a-rule
/api-reference/saas/cs-rules-rewrites.json put /em-rules/{id}
Update a rule.
# Chunk text using the specified chunker
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/chunk-text-using-the-specified-chunker
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/{CHUNKER}/{MODEL_ID}
This is an all-purpose chunking endpoint you can use by specifying the `chunker` and `modelId` to use.
The `POST` request submits text to be split into chunks based on the `CHUNKER` (chunking strategy) and `MODEL_ID` sent in the request.
The API responds with the following information:
* `chunkingId` that is a unique UUID for the submitted chunking task, and can be used later to retrieve the results.
* `status` that indicates the current state of the chunking task.
IMPORTANT: The available use cases by `chunker` are detailed in their own section in this specification.
# Chunk using dynamic-sentence
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/chunk-using-dynamic-sentence
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/dynamic-sentence/{MODEL_ID}
The dynamic-sentence chunker (chunking strategy) splits the provided text into sentences. Sentences are joined until they reach the `maxChunkSize`. If `overlapSize` is provided, adjacent chunks will both have overlapping sentences on the sides.
# Chunk using semantic chunker
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/chunk-using-semantic-chunker
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/semantic/{MODEL_ID}
The semantic chunker (chunking strategy) creates chunks based on semantic similarity.
Using the model defined in the URL request, the semantic chunker splits text into sentences, encodes the sentences, and then compares the sentence to the building chunk to determine if they are similar enough to group together.
After merging two semantically-similar sentences into a pre-chunk, the semantic chunker needs to encode it to get its vector to compare with the next sentence vector.
This chunker is the slowest of all of the chunkers even if you set the `approximate` field to true.
# Split text on a regex
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/split-text-on-a-regex
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/regex-splitter/{MODEL_ID}
The regex-splitter chunker (chunking strategy) splits the submitted text based on the specified regex (regular expression), according to the conventions employed by the `re` python package. For more information about the `re` operations, see https://docs.python.org/3/library/re.html.
# Split text on newlines
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/split-text-on-newlines
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/dynamic-newline/{MODEL_ID}
The dynamic-newline chunker (chunking strategy) splits the provided text on all new line characters. Then all of the split chunks under the `maxChunkSize` limit will be merged.
# Split text on sentences
Source: https://doc.lucidworks.com/api-reference/split-content-into-chunks/split-text-on-sentences
/api-reference/saas/machine-learning-platform-async-chunking.json post /ai/async-chunking/sentence/{MODEL_ID}
The sentence chunker (chunking strategy) splits text on sentences.
# Get use cases
Source: https://doc.lucidworks.com/api-reference/use-cases/get-use-cases
/api-reference/saas/machine-learning-platform-use-case.json get /ai/usecase
Fetch the list of supported use cases with related models.
# Deprecations and Removals
Source: https://doc.lucidworks.com/docs/5/fusion/deprecations-and-removals
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/deprecations-and-removals
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/deprecations-and-removals
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/8855
This document provides a comprehensive list of deprecated and removed features in Fusion, organized by version. It includes details on the deprecation and expected removal of various features, along with notes on alternatives or replacements where applicable. The document also contains links to relevant documentation for further information.
The deprecations section lists features scheduled for removal in future releases, and the removals section lists features already removed in past releases. Each entry includes the feature name, the version in which it was deprecated or removed, and relevant notes or recommended replacements.
The deprecation schedule outlined in this document applies exclusively to Fusion 5. Other major versions of Fusion have separate deprecation schedules not covered by this document.
> [!TIP]
>
> Fusion Connectors deprecations and removals
>
> Deprecation and removal details for Fusion Connectors are found at [Fusion Connectors Deprecations and Removals](/docs/fusion-connectors/deprecations-and-removals).
## Deprecations
Deprecated features in Fusion 5 are scheduled for removal in a future release. The following table lists each deprecated feature with an expected removal value, either a version number or a date. When a version number is specified, the feature will be removed in that specific release. When a date is specified, it represents the earliest possible day the feature will remain available. Removal will not occur before that date.
> [!NOTE]
>
> **FAQ**
>
> When were these features originally deprecated?
>
> If a feature was originally deprecated in a prior version, the original deprecation version is noted in parentheses after the **Deprecated** version.
### Removing in Fusion 6.0
> **Apache Tika Parser**
>
> The [Apache Tika Parser](/docs/5/fusion/reference/config-ref/parser-stages/apache-tika-parser) is a versatile tool designed to support the parsing of numerous unstructured document formats.
>
> Use the [Tika Asynchronous Parser](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead. Asynchronous Tika parsing performs parsing in the background. This allows Fusion to continue indexing documents while the parser is processing others, resulting in improved indexing performance for large numbers of documents.
>
> Deprecated: All versions of 5.9.x (originally 5.8.0)Expected removal: 6.0.0
> **App Insights**
>
> [A tool within the Fusion workspace](/docs/5/fusion/getting-data-out/data-analytics/app-insights/overview) that provides real-time, searchable reports and visualizations from signals data.
>
> Deprecated: 5.9.13 (originally 5.12.0)Expected removal: 6.0.0
> **Banana Dashboards**
>
> [Banana](/docs/5/fusion/operations/monitoring-and-reporting/banana-dashboards/overview) serves as the underlying browser application for Fusion dashboards, enabling the creation of dynamic and interactive dashboards within Fusion. These dashboards support various data visualizations and user interactions.
>
> Deploy Banana Dashboards using a separate Docker deployment option, available in a future release. This approach provides continued support for users who rely on Banana Dashboards while allowing for independent management and updates outside of Fusion’s core deployment.
>
> Deprecated: 5.9.13 (originally 5.12.0)Expected removal: 6.0.0
> **Content-Based Recommender Job**
>
> The [Content-Based Recommender job](/docs/5/fusion/reference/config-ref/jobs/content-based-recommender) computes item-to-item similarities based on content fields, such as product descriptions.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Data Augmentation Job**
>
> The [Data Augmentation Job](/docs/5/fusion/reference/config-ref/jobs/data-augmentation) is designed to enhance training and testing data for machine learning models by increasing data quantity and introducing textual variations. It performs tasks such as backtranslation, synonym substitution, keystroke misspelling, and split word tasks.
>
> Deprecated: 5.9.13 (originally 5.12.0)Expected removal: 6.0.0
> **Domain-Specific Language (DSL)**
>
> The [Domain Specific Language (DSL)](/docs/5/fusion/getting-data-out/query-basics/domain-specific-language) in Fusion is designed to simplify the complexity of crafting search queries. It allows users to express complex search queries without needing to understand the intricate syntax required by the legacy Solr parameter format.
>
> Avoid using the Domain-Specific Language (DSL) feature, as it may cause performance degradation. Instead, use the [DSL to Legacy Parameters](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/dsl-to-legacy-query-stage) query pipeline stage to convert DSL requests to the legacy Solr format while maintaining compatibility.
>
> Deprecated: 5.9.4Expected removal: 6.0.0
> **Field Parser Index Stage**
>
> The [Field Parser index pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/field-parser-index-stage) in Fusion is designed to parse content embedded within fields of documents. This stage operates separately from the parsers that handle whole documents.
>
> Use the [Tika Asynchronous Parser](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead. Asynchronous Tika parsing performs parsing in the background. This allows Fusion to continue indexing documents while the parser is processing others, resulting in improved indexing performance for large numbers of documents.
>
> Deprecated: All versions of 5.9.x (originally 5.8.0)Expected removal: 6.0.0
> **fusion-classification service**
>
> The `fusion-classification` service runs classification models in the Fusion cluster.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **gRPC ml-model-service API**
>
> The gRPC API of the [ML Model service](/docs/5/fusion/dev-portal/api/ml-model-service/overview), which Fusion uses to call deployed machine learning models.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Head/Tail Analysis**
>
> Perform [head/tail analysis](/docs/5/fusion/reference/config-ref/jobs/head-tail-analysis) of queries from collections of raw or aggregated signals, to identify underperforming queries and the reasons.
>
> Instead, use [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview) for superior relevance compared to this legacy machine learning method.
>
> Deprecated: 5.9.15Expected removal: 6.0.0
> **Hybrid Query (5.9.9 and earlier)**
>
> A [stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/hybrid-search-query) to perform hybrid lexical-semantic search that combines BM25-type lexical search with KNN dense vector search via Solr.
>
> Use [Neural Hybrid Query Stage (5.9.10 and later)](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query) instead to benefit from updates and improvements to the search capabilities of the stage.
>
> Deprecated: 5.9.13Expected removal: 6.0.0
> **Legacy Admin UI**
>
> The legacy Admin UI is the previous interface for managing Fusion apps and objects.
>
> Use the [new Admin UI](/docs/5/fusion/new-fusion-ui) instead.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Logistic Regression Classifier Training Jobs**
>
> This [job](/docs/5/fusion/reference/config-ref/jobs/logistic-regression-classifier-training) trains a logistic regression model with regularization to classify text into different categories.
>
> Deprecated: All versions of 5.9.x (originally 5.2.0)Expected removal: 6.0.0
> **Milvus Ensemble Query Stage**
>
> The [Milvus Ensemble Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/milvus-ensemble-query-stage) is used to enhance search results by incorporating vector-based similarity scoring.
>
> Replace the Milvus Ensemble Query Stage with the [Ray/Seldon Vectorize Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) with a Ray model for custom models, or with the [Lucidworks AI vector query stages](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) for models hosted by Lucidworks AI. These alternatives improve vector search integration and support within Fusion’s evolving AI and machine learning capabilities.
>
> Deprecated: 5.9.5Expected removal: 6.0.0
> **Milvus Query Stage**
>
> The [Milvus Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/milvus-query-stage) performs vectors similarity search in Milvus, an open source vector similarity search engine integrated into Fusion to streamline its deep learning capabilities and reduce the workload on Solr.
>
> Replace the Milvus Query Stage with the [Ray/Seldon Vectorize Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) with a Ray model for custom models, or with the [Lucidworks AI vector query stages](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) for models hosted by Lucidworks AI. These options enhance query efficiency and provide broader support for machine learning-driven search.
>
> Deprecated: 5.9.5Expected removal: 6.0.0
> **Milvus Response Update Query Stage**
>
> The [Milvus Response Update stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/milvus-response-update-stage) is designed to update response documents with vectors similarity and ensemble scores.
>
> Replace the Milvus Response Update Query Stage with the [Ray/Seldon Vectorize Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) with a Ray model for custom models, or with the [Lucidworks AI vector query stages](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) for models hosted by Lucidworks AI. These alternatives improve performance when updating response documents with vector similarity data.
>
> Deprecated: 5.9.5Expected removal: 6.0.0
> **Parsers Indexing CRUD API**
>
> The [Parsers API](/api-reference/parsers-crud-api/list-all-parsers) provides CRUD operations for parsers, allowing users to create, read, update, and delete parsers.
>
> A new API introduced in Fusion 5.12.0, Async Parsing API, will replace the Parsers Indexing CRUD API and will be backported to Fusion 5.9.x. This API provides improved functionality and aligns with Fusion’s updated architecture, ensuring consistency across versions.
>
> Deprecated: 5.9.11 (originally 5.12.0)Expected removal: 6.0.0
> **Phrase Extraction**
>
> [Identify multi-word phrases in signals](/docs/5/fusion/reference/config-ref/jobs/phrase-extraction).
>
> Instead, use [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview) for superior relevance compared to this legacy machine learning method.
>
> Deprecated: 5.9.15Expected removal: 6.0.0
> **Query-to-Query Collaborative Similarity Job**
>
> This [job](/docs/5/fusion/reference/config-ref/jobs/query-to-query-collaborative-similarity) uses SparkML’s Alternating Least Squares (ALS) to analyze past queries and find similarities between them. It helps recommend related queries or suggest relevant items based on previous searches.
>
> Switch to [Query-to-Query Session-Based Similarity jobs](/docs/5/fusion/reference/config-ref/jobs/query-to-query-session-based-similarity) instead of the Query-to-Query Collaborative Similarity Job. The new method improves performance and increases the coverage of query similarity calculations.
>
> Deprecated: All versions of 5.9.x (originally 5.2.0)Expected removal: 6.0.0
> **Random Forest Classifier Training Jobs**
>
> This [job](/docs/5/fusion/reference/config-ref/jobs/random-forest-classifier-training) trains a machine learning model using a random forest algorithm to classify text into different categories.
>
> Deprecated: All versions of 5.9.x (originally 5.2.0)Expected removal: 6.0.0
> **Reverse Search**
>
> [Reverse Search](/docs/lucidworks-search/04-move-data-in/index-pipeline/reverse-search) matches incoming documents to saved monitoring queries, so you don't need to rerun a query to find new documents.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Security Trimming Query Stage**
>
> The [Security Trimming query pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/security-trimming-query-stage) in Fusion is designed to restrict query resultsby matching security ACL metadata, ensuring that users only see results they are authorized to access.
>
> Replace the Security Trimming Query Stage with the [Graph Security Trimming Query Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/security-trimming-graph-query-stage). The new method uses a single filter query across all data sources.
>
> Deprecated: 5.9.0Expected removal: 6.0.0
> **Seldon**
>
> Seldon Core serves machine learning models in the Fusion cluster. This includes the [Create Seldon Core Model Deployment job](/docs/5/fusion/reference/config-ref/jobs/create-seldon-core-model-deployment), the [Delete Seldon Core Model Deployment job](/docs/5/fusion/reference/config-ref/jobs/delete-seldon-core-model-deployment), and Seldon models in the [Ray/Seldon Vectorize Field](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/vectorize-field-via-seldon-index-stage) and [Ray/Seldon Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) stages.
>
> Use Ray to host custom models instead. Deploy models with the [Create Ray Model Deployment job](/docs/5/fusion/reference/config-ref/jobs/create-ray-model-deployment), then use them in the Ray/Seldon Vectorize Field and Ray/Seldon Vectorize Query stages.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Smart Answers Coldstart Training job**
>
> The [Smart Answers Coldstart Training job](/docs/5/fusion/reference/config-ref/jobs/smart-answers-coldstart-training) in Fusion is designed to help train models when there is no historical training data available.
>
> Use pre-trained models or the supervised training job instead of the Smart Answers Coldstart Training job. Pre-trained models eliminate the need for manual training when historical data is unavailable, while supervised training jobs offer greater flexibility in model customization.
>
> Deprecated: 5.9.13 (originally 5.12.0)Expected removal: 6.0.0
> **Smart Answers Evaluate Pipeline job**
>
> The [Smart Answers Evaluate Pipeline job](/docs/5/fusion/reference/config-ref/jobs/smart-answers-evaluate-pipeline) evaluates the performance of a Smart Answers pipeline.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Smart Answers Supervised Training job**
>
> The [Smart Answers Supervised Training job](/docs/5/fusion/reference/config-ref/jobs/smart-answers-supervised-training) trains a Smart Answers model on a supervised basis, with pre-trained or trained embeddings, and deploys the trained model to the ML Model Service.
>
> Deprecated: 5.19.0Expected removal: 6.0.0
> **Support for Nashorn Javascript engine**
>
> Fusion uses the [Nashorn engine](/docs/5/fusion/getting-data-in/indexing/index-pipelines/custom-javascript-index-stages#the-javascript-engine-used-by-fusion) JavaScript engine for the JavaScript index and query stages.
>
> Use the OpenJDK Nashorn JavaScript engine instead of the deprecated Nashorn JavaScript engine in Fusion. This ensures continued JavaScript execution compatibility in pipeline configurations. You can select the engine from a dropdown in the pipeline views or in the workbenches.
>
> Deprecated: 5.9.8Expected removal: 6.0.0
> **Synonym Detection**
>
> Used to [generate pairs of synonyms](/docs/5/fusion/reference/config-ref/jobs/synonym-detection) and pairs of similar queries. Two words are considered potential synonyms when they are used in a similar context in similar queries.
>
> Instead, use [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview) for superior relevance compared to this legacy machine learning method.
>
> Deprecated: 5.9.15Expected removal: 6.0.0
> **Token and Phrase Spell Correction**
>
> [Detect misspellings](/docs/5/fusion/reference/config-ref/jobs/token-and-phrase-spell-correction) in queries or documents using the numbers of occurrences of words and phrases.
>
> Instead, use [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview) for superior relevance compared to this legacy machine learning method.
>
> Deprecated: 5.9.15Expected removal: 6.0.0
> **Connectors fetcher property AccessControlFetcher**
>
> Connectors that support security filtering previously used separate fetchers for content and access control. One fetcher type is now used for both content and security fetching. `AccessControlFetcher` has been deprecated.
>
> Fetcher implementations that use `AccessControlFetcher` should instead use `ContentFetcher`.
>
> Deprecated: All versions of 5.9.x (originally 5.1.2)Expected removal: 6.0.0
> **Messaging Stage Configs**
>
> Deprecated: All versions of 5.9.x (originally 5.1.2)Expected removal: 6.0.0
> **MLeap deployments of SpaCy and SparkNLP**
>
> Use **Develop and Deploy a Machine Learning Model** instead.
>
> Deprecated: 5.9.10 (originally 5.2.0)Expected removal: 6.0.0
> **Webapps Service**
>
> The Webapps service provides an embedded instance of App Studio within each Fusion instance, simplifying the deployment process.
>
> Deploy App Studio Enterprise using the **Deploy App Studio Enterprise to a Fusion 5 Cluster (GKE)** instead of relying on the Webapps service. This method improves scalability and provides a more robust deployment approach for enterprise environments.
>
> Deprecated: 5.9.10 (originally 5.11.0)Expected removal: 6.0.0
> **Word2Vec Model Training Jobs**
>
> The [Word2Vec model training job](/docs/5/fusion/reference/config-ref/jobs/word2vec-model-training) trains a shallow neural model to generate vector embeddings for text data and stores the results in a specified output collection. It supports configurable parameters for input data, model tuning, featurization, and output settings.
>
> Deprecated: 5.9.11 (originally 5.2.0)Expected removal: 6.0.0
### To be determined
> **ALS Recommender Job**
>
> The [ALS Recommender job](/docs/5/fusion/reference/config-ref/jobs/als-recommender/overview) in Fusion AI is used to compute user recommendations or item similarities using a collaborative filtering recommender.
>
> Use the [BPR Recommender job](/docs/5/fusion/reference/config-ref/jobs/bpr-recommender) instead of the ALS Recommender job. The BPR Recommender job delivers better recommendation accuracy with a shorter runtime.
>
> Deprecated: All versions of 5.9.x (originally 5.2.0)Expected removal: Version TBD
> **Time-based partitioning**
>
> [Time-based partitioning](/api-reference/collections/get-collection-partitions-status) in Fusion collections allows mapping to multiple Solr collections or partitions based on specific time ranges.
>
> Deprecated: All versions of 5.9.x (originally 5.2.0)Expected removal: Version TBD
## Removals
This section lists features that have been removed in past releases of Fusion. Each entry includes the feature name, the version in which it was removed, and any relevant notes or replacement recommendations.
### Fusion 5.19
> **Static and dynamic security trimming**
>
> Static and dynamic security trimming was removed in 5.19.0.
>
> V2 connectors now support only graph-based security trimming. Custom connectors built on the static or dynamic security-trimming APIs must move to graph-based security trimming.
> **Connectors ConfigsApi endpoints**
>
> Connectors `ConfigsApi` endpoints were removed in 5.19.0.
>
> Use the `DataSourcesApi` endpoints instead.
### Fusion 5.11
> **MLeap**
>
> MLeap was removed in 5.11.0.
>
> Use **Develop and Deploy a Machine Learning Model** instead. This method provides a more flexible and modern approach to deploying machine learning models.
> **Subscriptions UI**
>
> Subscriptions UI was removed in 5.11.0.
### Fusion 5.10
> **Forked Apache Tika Parser**
>
> Forked Apache Tika Parser was removed in 5.10.0.
>
> The Forked Apache Tika Parser was replaced by the [Tika Asynchronous Parser](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing). The asynchronous parser improves performance by handling document parsing more efficiently and scaling better for enterprise workloads.
### Fusion 5.9
> **Analytics Catalog Query Stage**
>
> Analytics Catalog Query Stage was removed in 5.9.15.
> **Tika Server Parser**
>
> [Tika Server Parser](/docs/5/fusion/reference/config-ref/parser-stages/apache-tika-server) was removed in 5.9.12.
>
> Use the [Tika Asynchronous Parser](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead. Asynchronous Tika parsing performs parsing in the background. This allows Fusion to continue indexing documents while the parser is processing others, resulting in improved indexing performance for large numbers of documents.
> **MLeap in Machine Learning models**
>
> MLeap in Machine Learning models was removed in 5.9.12.
### Fusion 5.7
> **NLP Annotator Index Stage**
>
> NLP Annotator Index Stage was removed in 5.7.0.
>
> To implement similar functionality, see the **Develop and Deploy a Machine Learning Model** guide, which provides an adaptable example.
> **NLP Annotator Query Stage**
>
> NLP Annotator Query Stage was removed in 5.7.0.
>
> To implement similar functionality, see the **Develop and Deploy a Machine Learning Model** guide, which provides an adaptable example.
> **OpenNLP NER Extraction Index Stage**
>
> OpenNLP NER Extraction Index Stage was removed in 5.7.0.
>
> To implement similar functionality, see the **Develop and Deploy a Machine Learning Model** guide, which provides an adaptable example.
### Fusion 5.6
> **Fusion SQL**
>
> Fusion SQL was removed in 5.6.1.
> **Apache Pulsar**
>
> Apache Pulsar was removed in 5.6.0.
>
> Apache Pulsar was removed in Fusion 5.6.0 and replaced with Kafka. Kafka offers better scalability, reliability, and industry support for message streaming.
> **Log Viewer & DevOps Center UI panel**
>
> Log Viewer & DevOps Center UI panel were removed in 5.6.0.
>
> These features were removed in Fusion 5.6.0 as they depended on Apache Pulsar, which has been replaced by Kafka. Users should transition to Kafka-based logging and monitoring solutions.
> **Subscriptions API**
>
> Subscriptions API was removed in 5.6.0.
> **Send to Message Bus Index Stage**
>
> Send to Message Bus Index Stage was removed in 5.6.0.
### Fusion 5.5
> **Jupyter**
>
> Jupyter was removed in 5.5.2.
> **Superset**
>
> Superset was removed in 5.5.2.
# Introduction to Fusion
Source: https://doc.lucidworks.com/docs/5/fusion/intro/overview
[localhost link]: http://localhost:3000/docs/5/fusion/intro/overview
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/intro/overview
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/3210
Fusion combines the Apache Solr open source search engine with the distributed power of Apache Spark for artificial intelligence. Highly scalable, Fusion indexes and stores data for real-time discovery.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
> **[Fusion Basics](https://academy.lucidworks.com/paths/019a5b69-2d6e-7f7b-8ffa-f18163f1ffda)**
>
> The learning path for **Fusion Basics** focuses on the basic structure, essential components, and foundational concepts you’ll need to understand Fusion.
# Fusion Apps
Source: https://doc.lucidworks.com/docs/5/fusion/intro/ui-tour/fusion-apps
[localhost link]: http://localhost:3000/docs/5/fusion/intro/ui-tour/fusion-apps
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/intro/ui-tour/fusion-apps
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/179
*Fusion apps* provide tailored search functionality to specific groups of users.
An app is a named set of linked *objects*, including collections, datasources, index and query pipelines, index and query profiles, parsers, and more.
You can define security on a per-app basis using [roles](/docs/5/fusion/operations/security/access-control/roles) and
[security realms](/docs/5/fusion/operations/security/access-control/security-realms).
The **Create App** modal can be accessed by clicking Create App. When naming an app, the name must start with a letter and can include letters, numbers, dashes (`-`), or underscores (`_`), with a maximum length of 128 characters.
**To edit an app, access the **Edit App** modal by clicking on the settings cog icon on the app tile. Click on the pencil icon by the app name in the modal to edit the app name.**
Generally, you will create multiple apps for different purposes. You can view all of your apps in the launcher when you log in to the Fusion UI:

To enter the Fusion workspace for any app, click the app name.
In the Fusion workspace, you can hover over  to switch to another app, create a new app, or return to the launcher:

> **[Fusion Applications and Collections](https://academy.lucidworks.com/fusion-applications-and-collections)**
>
> The course for **Fusion Applications and Collections** focuses on the features of Fusion apps and collections and best practices when working with them.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Learn more
> **Create and manage Fusion apps**
>
> You can create, modify, and delete apps in the Fusion UI or with the Apps API.
>
> ## Manage apps in the Fusion UI
>
> ### Create an app
>
> Fusion prompts you to create an app the first time you log in. You can create additional apps at anytime from Fusion’s home page.
>
> 1. Log into Fusion and navigate to the home screen.
> 2. Click **Create new app**.
>
> 
> 3. Enter a **Name**, **Description**, and select an **App tile color**.
>
> 
> 4. Click **Create App**.
>
> ### Modify or delete an app
>
> 1. Log into Fusion and navigate to the home screen.
> 2. Click the **Configure** icon on the app you want to modify or delete.
>
> 
> 3. To modify the app, click the edit icon .
>
> 
>
> 1. Edit the **Name** or **Description**.
> 2. Click **OK**.
> 4. To delete the app, click **Delete app**.
> 1. A dialog box appears where you can choose which associated objects to delete or retain. Only objects not associated with other objects are displayed. All objects are selected by default.
> 2. Click **Confirm**.
>
> 
>
> ## Manage apps with the Apps API
>
> ### Create an app
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD -X POST -H 'Content-type: application/json' -d '{"id": "MyNewApp", "name":"My new app", "description":"A really really great new app"}' https://FUSION_HOST/api/apps
> ```
>
> ### Delete an app
>
> Run the following command, replacing `{id}` with the name of your app. This operation take about a minute to complete.
>
> ```bash theme={"dark"}
> curl -u USERNAME:PASSWORD -X DELETE https://FUSION_HOST/api/apps/{id}
> ```
> **Export a Fusion App**
>
> To export a Fusion app, you can use either the Fusion UI or the [Objects API](/api-reference/objects/get-objects-service-status).
>
> > [!TIP]
> >
> > To upgrade from one Fusion version to a 5.x version, see [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) to migrate objects.
>
> ## Export an app with the Fusion UI
>
> 1. Navigate to the launcher.
> 2. Hover over the app you want to export and click the Configure icon:
>
> 
> 3. In the app config window, click **Export app to zip**:
>
> 
>
> To import the downloaded zip file into other instances of Fusion 5.x, see [Import a Fusion App](#import-a-fusion-app).
>
> ## Export an app with the Objects API
>
> The examples below show how to export one or more apps:
>
> **Export all apps**
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD http://localhost:6764/api/objects/export?type=app > all-apps.zip
> ```
>
> **Get all app IDs, then export one app by ID**
>
> ```bash expandable theme={"dark"}
> > curl -u USERNAME:PASSWORD http://localhost:6764/api/apps
>
> [ {
> "id" : "movies",
> "name" : "Movies",
> "description" : "Search the movielens database.",
> "dataUri" : "/App-Tile-01-460x160.png",
> "properties" : {
> "headerImageName" : "headerImage1",
> "tileColor" : "apps-darkblue",
> "previousCollectionId" : "movies"
> }
> }, {
> "id" : "tech-pubs",
> "name" : "TechPubs",
> "description" : "Search the documentation.",
> "dataUri" : "/App-Tile-02-460x160.png",
> "properties" : {
> "headerImageName" : "headerImage2",
> "tileColor" : "apps-darkblue",
> "previousCollectionId" : "tech-pubs"
> }
> } ]
>
> > curl -u USERNAME:PASSWORD http://localhost:6764/api/objects/export?app.ids=tech-pubs > techpubs.zip
> ```
>
> > [!NOTE]
> >
> > When you export an app that includes objects that are shared with other apps, then all apps linked to that object are also exported.
>
> **Export two apps by ID**
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD http://localhost:6764/api/objects/export?app.ids=tech-pubs,movies > two-apps.zip
> ```
>
> > [!TIP]
> >
> > For the `app` object type, the `deep` parameter is not used. Linked objects are always included when exporting apps.
> **Import a Fusion App**
>
> To import an app, you can use either the Fusion UI or the [Objects API](/api-reference/objects/import-objects).
>
> ## Import an app with the Fusion UI
>
> 1. Navigate to the launcher.
> 2. Click **Import app**.
>
> 
> 3. Under **Data File**, click **Choose File** and select the zip file containing the app you want to import.
> 4. If your app has usernames and passwords in a separate file, select it under **Variables File**.
> If the Variables File is needed, it *must* be a separate file that is not in a .zip file. It is a .json map of variables to values. The following is an example:
> ```json theme={"dark"}
> {
> "secret.dataSources.Inventory_BR_S3_DS.password":"SOMETHING",
> "secret.dataSources.LLM_A_BR_S3_DS.password":"FmJSaDE9Tj5REDACTED",
> "secret.dataSources.LLM_BR_Inventory_S3_DS.password":"FmJSaDE9Tj5GzIVvethAC4Huh",
> "secret.dataSources.LLM_BR_Load_S3_DS.password":"FmJSaDE9Tj5GzIVvethAC4"
> }
> ```
> 5. You can sometimes edit parameter values to use the new values in the imported app. If this is the case, Fusion displays a dialog box that lets you edit the parameter values.
>
> 
>
> Make desired changes, and then click **Import**.
>
> ## Import an app with the Objects API
>
> Like any other Fusion object, an exported app is contained in a zip file which Fusion can consume upon import. The zip file does not need to be expanded first.
>
> **Import objects from a file and stop if there are conflicts**
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD -H "Content-Type:multipart/form-data" -X POST -F 'importData=@/Users/admin/Fusion/export.zip' http://localhost:6764/api/objects/import?importPolicy=abort
> ```
>
> **Import objects, substitute the password variables, and merge any conflicts**
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD -H "Content-Type:multipart/form-data" -X POST -F 'importData=@/Users/admin/Fusion/export.zip' -F 'variableValues=@password_file.json' http://localhost:6764/api/objects/import?importPolicy=merge
> ```
>
> > [!NOTE]
> >
> > `password_file.json` must contain plaintext passwords.
>
> **Import a zip file of Fusion objects and merge any conflicts**
>
> ```bash wrap theme={"dark"}
> curl -u USERNAME:PASSWORD -H "Content-Type:multipart/form-data" -X POST -F 'importData=@/Users/admin/Fusion/techpubs.zip' http://localhost:6764/api/objects/import?importPolicy=merge
> ```
> **Import objects into an app**
>
> You can import exported Fusion objects into the currently open app.
>
> 1. In the Fusion launcher, click the app into which you want to import objects.
> The Fusion workspace appears.
> 2. Click **System > Import Fusion Objects**.
> The Import Fusion Objects window opens.
>
> 
> 3. Select the data file from your local filesystem.
> If you are importing [usernames and passwords](/api-reference/objects/import-objects) in a separate file, select it under **Variables File**.
> 4. Click **Import**.
> If there are conflicts, Fusion prompts you to specify an import policy:
>
> 
>
> * Click **Overwrite** to overwrite the objects on the target system with the ones in the import file.
> * Click **Merge** to skip all conflicting objects and import only the non-conflicting objects.
> * Click **Start Over** to abort the import.
> Fusion confirms that the import was successful:
>
> 
> 5. Click **Close** to close the Import Fusion Objects window.
> **Add an object to an app**
>
> You can add objects present in other apps (or in no apps) to the open app. Some objects are linked to other apps. You can also add those directly to an app.
>
> * **Add an object to an app** – While in the Fusion workspace for the app to which you want to add an object, open Object Explorer and click **In Any App**. Search for or browse to the object you want to add. Hover over the object, click the App  icon, and then click **Add to this app**.
>
> 
> * **Add an object to an app directly** – In cases when an object is linked to an app, but is not linked directly to the app (it is linked via some dependency), you can add the object to an app directly.
>
> While in the Fusion workspace for the app to which you want to add an object directly, open Object Explorer and click **In Any App**. Search for or browse to the object you want to add. Hover over the object, click the App  icon, and then click **Add to this app directly**.
>
> 
# Fusion UI Tour
Source: https://doc.lucidworks.com/docs/5/fusion/intro/ui-tour/overview
[localhost link]: http://localhost:3000/docs/5/fusion/intro/ui-tour/overview
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/intro/ui-tour/overview
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/116
The Fusion UI gives you easy access to all Fusion features.
The UI service utilizes the API service, so each UI feature has an API equivalent. For programmatic access to the features you see in the UI, see the [API Reference Guide](/docs/5/fusion/dev-portal/rest-apis).
> **[Navigating the Fusion UI](https://academy.lucidworks.com/navigating-the-fusion-admin-ui)**
>
> The course for **Navigating the Fusion UI** focuses on navigating through the Fusion application.
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Logging in
The Proxy service runs on port 6764 by default. Access the Fusion UI through the Proxy service. To log in, point your browser to this port on the Fusion host, for example, `http://FUSION_HOST:FUSION_PORT/`.
When you are the *first user* to log in:
Fusion prompts you to set the password for the "admin" account and agree to the license terms. All other accounts must be created by an admin.

The first time you log in:
Fusion opens the **Quickstart**, to give you a demonstration of Fusion’s most basic features. You can click **Exit the Quickstart** to close it and go to the Fusion launcher.
> **Quickstart**
>
> The Quickstart is a wizard that lets you explore some of Fusion’s core capabilities:
>
> * Creating or selecting an app
>
> * Selecting a collection (where data is stored)
>
> * Indexing data
>
> * Searching
>
> > **[Using The Quickstart Wizard](https://academy.lucidworks.com/using-the-quickstart-guide)**
> >
> > The course for **Using The Quickstart Wizard** focuses on using the wizard to practice using the key functions of Fusion.
>
> ## Step through the Quickstart wizard
>
> If it is not already open, open the Quickstart wizard. In the Fusion launcher, click **New here? Get started...**.
>
> 
>
> 1. Click **Continue**.
>
> On the **Select an App** screen, you can select or create an [app](/docs/4/fusion-server/concepts/overview) for your quickstart data.
>
> 
>
> If you click **Create new app**, Fusion prompts you to enter an app name (and optionally a description), then click **Create App** to return to the Quickstart. Your new app is selected by default.
> 2. After selecting an app, click **Continue**.
>
> On the **Select a Collection** screen, you can select or create a [collection](/docs/4/fusion-server/concepts/overview) for your quickstart data. A collection with the same name as your app is created automatically:
>
> 
> 3. Click **Continue**.\
> On the **Index Data** screen, you can either select one of the built-in sample datasets or click **Use my data** to upload your own:
>
> 
> 4. Click **Continue**.\
> On the **Query Data** screen, you can see all search results and enter your own search queries to test the indexed dataset. You can also select the display fields or view the parsed documents:
>
> 
> 5. Click **Continue**.
>
> 
>
> From here, you can do the following:
>
> * Open the Index Workbench to change the index pipeline.
> * [Fusion 4.x Index Workbench](/docs/4/fusion-server/concepts/indexing/datasources/index-workbench)
> * [Fusion 5.x Index Workbench](/docs/5/fusion/intro/ui-tour/index-workbench)
> * Open the Query Workbench to change the query pipeline.
> * [Fusion 4.x Query Workbench](/docs/4/fusion-server/concepts/querying/query-workbench)
> * [Fusion 5.x Query Workbench](/docs/5/fusion/getting-data-out/query-basics/query-workbench)
>
> The workbenches are essentials tools in the Fusion workflow.
> * Open [App Studio](/docs/4/app-studio/overview) to create a user interface for searching this collection.
>
> > [!NOTE]
> >
> > App Studio is only available in Fusion 4.1 and 4.2.
You can open the Quickstart at any time by navigating to the Fusion launcher and clicking **New here? Get started…**.

The brief tour below shows you how to find your way around the interface. For a more detailed tour, try the **Getting Started with Fusion Server** tutorial.
> **Getting Started with Fusion Server**
>
> This tutorial takes you from installation to application-ready search data in four easy parts, using a [MovieLens](https://grouplens.org/datasets/movielens/) dataset.
>
> * Part 1: Run Fusion and Create an App
>
> Download, install Fusion, and run Fusion, then create a Movie Search app.
> * Part 2: Get Data In
>
> Use the Index Workbench to configure an index pipeline, preview the results, and get data into the Movie Search app in a format that is useful for search.
> * Part 3: Get Data Out
>
> Use Query Workbench to get data out of the Movie Search app, explore the role of query pipeline stages, configure faceting, and preview search results.
> * Part 4: Improve Relevancy
>
> Use signals and boosting to make search results more relevant.
## A brief tour
* The *launcher* is where you can view all apps in your Fusion environment and create new ones.
* The *Fusion workspace* is where you configure how an app ingests, indexes, queries, and analyzes data.
### The Fusion launcher
When you log in to Fusion, the first page is the Fusion launcher. This is where you create and launch apps:

To return to the Fusion workspace, hover over , and then click **Return to launcher**.
See details about **Create an App**.
> **Create an App**
>
> To create an app in App Studio:
>
> 1. Navigate to the launcher and click **Create new app**.
>
> 
> 2. Enter an app name.
>
> Optionally, you can also enter a description and select the app tile color.
>
> If you want to choose the name of the first collection in the app, then deselect **Create new app default collection**. When you do this and click **Create app** (in the next step), Fusion Server prompts you to enter a name for the first collection. Otherwise, Fusion Server creates a default collection whose name is the same as the app name.
> 3. Click **Create App**.
>
> The Fusion workspace appears, and you are ready to work with your app’s first collection.
### The Fusion workspace
You can reach the Fusion workspace by clicking on any app in the launcher. When you enter the Fusion workspace, you find all the tools you need to configure the selected app:
* On the left side are the [app tool menus](#app-tool-menus), where you can find tools for working with your app.
* [System-wide tools](#system-wide) are at the top of the UI. With the exception of the **Collections** tool, which allows you to switch between collections for your app, these tools do not concern your app specifically.
#### App tool menus

On the left side of the screen are six menus where you can find tools for working with your app:
1.  **Indexing** (getting data in)\
The [Index Workbench](/docs/5/fusion/intro/ui-tour/index-workbench) is the primary tool for getting data into your app through the Fusion UI. It provides an all-in-one view of the components of a datasource. You can also access those components individually through this menu.
2.  **Querying** (getting data out)\
For getting data out, the [Query Workbench](/docs/5/fusion/intro/ui-tour/query-workbench) is the main tool. It shows you a live preview of search results while you configure and fine tune your query pipelines.\
See also [Getting Data Out](/docs/5/fusion/getting-data-out/query-basics/overview).
3.  **Collections**\
Manage your data collections and configure their features.\
See also [Collection Management](/docs/5/fusion/getting-data-in/indexing/collections/overview).
4.  **Relevance**\
Add or edit rules, recommendations, and signals.
5.  **Analytics Hub**\
View App Insights, run Experiments, or view your Dashboard.
6.  **System**\
Manage your system, including access control and logs.
#### System-wide

On the right are menus for system-wide actions:
1.  **Apps**\
Switch between apps or return to the app launcher.
2.  **Collections**\
View and navigate to other collections.
3.  **Microservices**\
View the status of all Fusion microservices.
4.  **Search**\
Click the search icon and enter a query to find areas of the Fusion UI, objects, and related documentation. Clicking an object opens the [Object Explorer](/docs/5/fusion/intro/ui-tour/object-explorer).
5.  **Help**\
Access the documentation.
6.  **Alerts**\
New alerts are briefly displayed in the foreground. Open this menu to see past alerts, or to clear the alert history.
7.  **Account Settings**\
Edit your profile, log out, or manage your Fusion license.
# Try the New Admin UI
Source: https://doc.lucidworks.com/docs/5/fusion/new-fusion-ui
Fusion 5.19 introduces a redesigned Admin UI, rebuilt on React to replace the legacy AngularJS interface. It brings updated navigation and a modern visual style.
[Try the New Fusion Admin UI](https://app.supademo.com/embed/cmunbiv6h002a000jchu13ohd?embed_v=2\&utm_source=embed)
> [!NOTE]
>
> The new Admin UI is a preview.
> Some capabilities may not be available yet, and screen locations may change before general availability.
## What's changing
The new UI uses the screen more efficiently and helps you see where you are and what matters.
A labeled sidebar groups screens by area, replacing the icon menus and their flyouts, and a breadcrumb in the header shows your location.
Every screen is one click away and opens in place, instead of stacking up as tabs along the bottom of the window.
Content fills the page in clearly separated panels, and size, color, and grouping draw your eye to what's important, such as summary figures with trend lines and color-coded object types.

New UI

Legacy UI
Drag to compare the legacy and new Admin UI
In addition to the overall new look and feel throughout the Admin UI, several screens offer an improved experience.
### Clearer Object Explorer
Object Explorer now groups objects by type and color-codes each type, so you can tell datasources, pipelines, and collections apart at a glance.
Select an object to see its linked objects in a panel next to the list, instead of switching between the list and a separate links view.

New UI

Legacy UI
Drag to compare the legacy and new Object Explorer
### Status and details at a glance
Lists such as datasources, jobs, and pipelines are now tables that show key information for every object, so you don't have to open each one.
Status labels show which datasources are running and which jobs succeeded or failed, so you can see what needs attention.
Select a row to see its details and actions, such as **Stop**, **Edit**, or **Delete**, in a panel next to the table.
A notifications panel collects events such as failed queries, stopped jobs, and finished datasource runs.

New UI

Legacy UI
Drag to compare the legacy and new Datasources screen
### Visual stage explanations
When you select a stage in Index Workbench, Query Workbench, or a parser, a diagram at the top of its configuration panel shows what the stage does.
It traces a sample input through the stage to the result, such as the boost that the Boost with Signals stage adds from click signals.
Each stage in the pipeline list also shows a short description, so you can see what a stage does without opening it.

### More detailed jobs catalog
Browse all available job types in a more detailed catalog with full descriptions to help you find the right job type.
### Faster Quickstart
Quickstart walks you through creating an app and a collection, then indexing sample data or your own.
As soon as Fusion indexes the first few documents, you can search them and inspect what the index pipeline parsed, without leaving Quickstart.
Open Quickstart from the app launcher.

## Access the new UI
> **Switch to the new Admin UI**
>
> To switch to the new Admin UI, click the toggle at the top of the screen:
>
> 
> **Switch back to the legacy Admin UI**
>
> To switch back to the legacy Admin UI, click the toggle at the top of the screen again:
>
> 
>
> You can also switch back when you log out or your session expires, because Fusion offers the option to open the original UI:
>
> 
>
> Click **Open the legacy admin UI**, then log in again.
## Where did it go?
Most menu items are in the same group with the same name.
These items have moved or changed:
| Legacy UI location | New UI location |
| - | - |
| Collections > Jobs | System > Jobs |
| Relevance > Rules | Relevance > Rules, opens in a new tab |
A few items aren't in the new UI yet:
| Legacy UI location | Status |
| - | - |
| Analytics Hub > App Insights | Removed. App Insights is [deprecated](/docs/5/fusion/deprecations-and-removals). You can still open it from the [legacy Admin UI](#switch-back-to-the-legacy-admin-ui), but it will be removed in a future release. |
| Analytics Hub > Dashboard | Removed. Banana Dashboards are [deprecated](/docs/5/fusion/deprecations-and-removals). You can still open them from the [legacy Admin UI](#switch-back-to-the-legacy-admin-ui), but they will be removed in a future release. |
| System > Import Fusion Objects | Removed. Import objects with the [Objects API](/api-reference/objects/import-objects) or the [legacy Admin UI](#switch-back-to-the-legacy-admin-ui) instead. |
| Relevance > Recommendations | No longer a dedicated screen. |
| Relevance > Signals | No longer a dedicated screen. |
# Self-hosted Fusion
Source: https://doc.lucidworks.com/docs/5/fusion/overview
[localhost link]: http://localhost:3000/docs/5/fusion/overview
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/overview
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/6764
Lucidworks Fusion 5 lets customers easily deploy AI-powered data discovery and search applications in a modern, containerized, cloud-native architecture. Data scientists interact with those applications by:
* Leveraging existing machine learning models and workflows
* Using popular tools (Python ML, TensorFlow, scikit-learn, and spaCy) to quickly create and deploy new models
Fusion combines the Apache Solr open source search engine with the distributed power of Apache Spark for artificial intelligence. Highly scalable, Fusion indexes and stores data for real-time discovery.
* Index billions of records of any type, from any data source
* Process thousands of queries per second from thousands of concurrent users
* Conduct full-text search using standard SQL capabilities and powerful analytics
> **Key questions to get you started**
>
> Powered by Lucidworks Agent Studio
## Key concepts
Fusion’s ecosystem allows you to manage and access your data in an intuitive fashion.
### Apache Solr
Solr is the fast open source search platform built on Apache Lucene™ that provides scalable indexing and search, as well as faceting, hit highlighting, and advanced analysis/tokenization capabilities. Solr and Lucene are managed by the [Apache Software Foundation](http://www.apache.org/).
For more information, see the [Solr Reference Guide](/docs/5/fusion/reference/solr-reference-guide) for your Fusion release.
### Apache Spark
[Apache Spark](http://spark.apache.org/) is an open source cluster-computing framework that serves as a fast and general execution engine for large-scale data processing jobs that can be decomposed into stepwise tasks, which are distributed across a cluster of networked computers.
Spark improves on previous MapReduce implementations by using resilient distributed datasets (RDDs), a distributed memory abstraction that lets programmers perform in-memory computations on large clusters in a fault-tolerant manner.
See [Spark Operations](/docs/5/fusion/intro/fusion-stack/spark/overview) for more information.
### Connectors
Connectors are the out-of-the-box components for pulling your data into Fusion. Lucidworks provides a wide variety of connectors, each specialized for a particular data type. When you add a [datasource](/docs/fusion-connectors/concepts/datasources) to a [collection](/docs/5/fusion/getting-data-in/indexing/collections/overview), you specify the connector to use for ingesting data.
Connectors are distributed separately from Fusion. For complete information, see [Fusion Connectors](/docs/fusion-connectors/overview).
Fusion offers dozens of connectors so you can access your data from a large variety of sources.
To learn more about Fusion connectors, see [connectors concepts](/docs/5/fusion/getting-data-in/indexing/connectors) or the [connectors section](/docs/fusion-connectors/overview).
### Pipelines
Pipelines dictate how data flows through Fusion and becomes accessible by a search application. Fusion has two types of pipelines: index pipelines and query pipelines.
[Index pipelines](/docs/5/fusion/getting-data-in/indexing/overview) ingest data, indexes it, and stores it in a format that is optimized for searching.
[Query pipelines](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/overview) filter, transform, and augment Solr queries and responses to return all and only the most relevant search results.
## How-to information
Want to start right away? See our 4-part **Getting Started with Fusion** tutorial below for detailed instructions.
> **Part 1: Run Fusion and Create an App**
>
> ## Create an app
>
> Create a Movie Search app. An app is a set of Fusion objects that performs a specific searching task (such as searching for movies).
>
> 1. In the Fusion launcher, click **Create new app**.
> 2. In the **App Name** field, enter `Movie Search`.
> 3. In the **App Description** field, enter `App to search for movies`.
> 4. Click **Create App**.
>
> 
>
> The Movie Search app now appears in the Fusion launcher:
>
> 
>
> ## Next steps
>
> You now have the MovieLens dataset from which you will use a CSV file that contains data about movies. And you have a Fusion app that you will transform into a movie search app.
>
> In Part 2, you will use Index Workbench to get the MovieLens dataset into Fusion.
> **Part 2: Get Data In**
>
> Fusion’s Index Workbench provides the tools to configure datasources, parsers, and index pipelines. It lets you *preview* the results of indexing before you load your data into the actual index.
>
> Index Workbench first sets up the necessary data extraction configuration, and then retrieves a small number of documents as sample data. You can use the sample documents to test and refine your index pipeline. All processing is *simulated* processing of the test data. No actual data ingestion takes place.
>
> After you have a complete configuration, Index Workbench saves this as a Fusion datasource.
> To load your data into Fusion, use the Fusion Datasource tool to run the resulting configuration.
>
> Part 2 takes you through configuring a datasource using Index Workbench. In Part 3, you will load the data into Fusion and view it using Query Workbench.
>
> ## Before you begin
>
> To proceed with this part of the tutorial, you must first complete Part 1, which gives you a Fusion app.
>
> ## Download the MovieLens dataset
>
> 1. [Download the dataset](https://files.grouplens.org/datasets/movielens/ml-latest-small.zip).
>
> This is a MovieLens dataset created by the [Grouplens](https://grouplens.org/) research lab.
> 2. Unpack the `ml-latest-small.zip` file.
>
> Fusion can parse `.zip` files, but for simplicity we will index just one file from the archive (`movies.csv`).
>
> The `movies.csv` file contains a list of 9,125 movie titles, plus a header row. Here is a truncated listing:
>
> ```csv theme={"dark"}
> movieId,title,genres
> 1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
> 2,Jumanji (1995),Adventure|Children|Fantasy
> 3,Grumpier Old Men (1995),Comedy|Romance
> 4,Waiting to Exhale (1995),Comedy|Drama|Romance
> 5,Father of the Bride Part II (1995),Comedy
> 6,Heat (1995),Action|Crime|Thriller
> 7,Sabrina (1995),Comedy|Romance
> 8,Tom and Huck (1995),Adventure|Children
> 9,Sudden Death (1995),Action
> 10,GoldenEye (1995),Action|Adventure|Thriller
> ```
>
> ## Open the Movie Search app
>
> 1. If the Fusion UI is not already open, then open it.
> 2. Enter the password for the user `admin`, and then click **Log in**.
>
> 
>
> The Fusion launcher appears. You see the Movie Search app you created in Part 1:
>
> 
> 3. In the Fusion launcher, click the **Movie Search** app.
>
> The Fusion workspace appears. It has controls along the left and top sides.
>
> 
> 4. In the upper left, hover over Apps . You can see that Movie Search is the currently selected app.
>
> Also, the user collection `Movie_Search` is selected in the collection picker. This is the default collection for the Movie Search app, and where Fusion will place index data.
>
> ## Configure the datasource
>
> A collection includes one or more datasources. A datasource is a configuration that manages the import, parsing, and indexing of data into a collection. You will use Index Workbench to configure a datasource for the movie data.
>
> 1. In the collection picker, verify that the collection **Movie\_Search** is selected.
>
> 
>
> 2. Open Index Workbench. Navigate to **Indexing**  > **Index Workbench**.
>
> Initially, no data preview appears because no datasource has been configured. When you configure a datasource, Fusion samples the data and displays a preview of how it would be formatted in the index using the default parsing and index pipeline configurations.
>
> 3. In the upper right, click **New**.
>
> 4. Select **Or, upload a file**.
>
> 5. Click **Choose File**.
>
> 6. Navigate to the `movies.csv` file, select it, and then click **Open**.
>
> 
>
> 7. Click **Add New Datasource**.
>
> The Datasource (File Upload) configuration panel appears, with the default datasource ID `movies_csv-Movie_Search` and the default file ID `movies.csv`. These default values are fine.
>
> 8. Enter the **Description** `Movies CSV file`.
>
> 
>
> 9. Click **Apply**.
>
> Index Workbench reads up to 20 documents into memory from the `movies.csv` file, and then displays a preview of how they would be indexed.
>
> You have finished configuring the datasource. At the bottom of the page, click **Cancel**.
>
> 
>
> In the lower right, you can select the number of documents to preview.
>
> ## Analyze the default output
>
> 1. Notice that Fusion made some assumptions about your original fields:
>
> * `genres` became `genres_t` (the `text_general` field type) and `genres_s` (the `string` field type). String fields are useful for faceting and sorting, while text fields are for full-text search. At this point, Fusion does not know whether you intend to use this field for faceting and sorting, for full-text search, or for both.
> * `title` became `title_t` and `title_s` for the same reason.
> * `movieId` became `movieId_t` and `movieId_s` for the same reason. This might seem odd, because the original field contains numbers. But, at this stage, Fusion creates `text_general` and `string` fields. To use the contents of this field as an integer, you would map the field to an integer field.
>
> You also see fields that begin with `_lw`. These fields contain data that Fusion creates for its own housekeeping. You can ignore them.
>
> These fields are created by the [Solr Dynamic Field Name Mapping stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/solr-dynamic-field-name-mapping-index-stage) in the default index pipeline. This stage attempts to automatically detect field types, and renames fields accordingly. For this tutorial, you will manually configure the fields instead.
> 2. Turn off the **Solr Dynamic Field Name Mapping** stage by clicking the green circle next to it.
>
> Your data’s original fields reappear: `genres`, `movieId`, and `title`.
>
> 
>
> ## Configure the index pipeline
>
> First you will configure the field mappings in the index pipeline so each field has the correct data type. Then you will split the `genres` field into multiple values so each value can be used as a facet in Part 3 of this tutorial.
>
> ### Configure field mappings
>
> Configure field mappings to control the field types of Fusion documents. Fusion uses field name suffixes to determine field types. When a field name has no suffix, Fusion stores it as a string field and treats it as an unanalyzed whole. For precise analysis and search, most fields need suffixes to indicate their specific types. You will see how this relates to the fields in the dataset.
>
> 1. In the list of index pipeline stages on the left, click **Field Mapping** to open the Field Mapping stage configuration panel.
>
> 2. In **Field Translations**, click **Add**  to create a new field mapping rule.
>
> 3. Under **Source Field**, enter `genres`.
>
> 4. Under **Target Field**, enter `genres_ss`.
>
> The field suffix `_ss` means that this field is a multi-valued string field.
>
> > [!NOTE]
> >
> > Fusion currently interprets this field as having a single value. You can see that the field actually contains a pipe-delimited array of values. You will fix this after you finish configuring field mappings.
>
> 5. Under **Operation**, select **move**.
>
> The move operation means that the resulting document no longer has a `genres` field; it only has `genres_ss`.
>
> 
>
> 6. Click **Apply**.
>
> Applying the new configuration re-runs the simulation and updates the contents of the preview panel. Notice the change in the field name from `genres` to `genres_ss`:
>
> | | |
> | - | - |
> | Before | After |
> |  |  |
>
> 7. Click **Add**  to add more field mapping rules as follows:
>
> * The `movieId` field is a unique document identifier. It should be *copied* into the document’s `id` field.
> * The `title` should be searchable as a text field, so you *move* it to the field `title_txt`.
>
> Your field mappings should look like this:
>
> 
>
> 8. Click **Apply**.
>
> After you have specified these explicit field mapping rules, you can browse the resulting documents
> in the preview panel to check your work.
>
> | | |
> | - | - |
> | Before | After |
> |  |  |
>
> 9. In the upper right, click **Save**. This saves your modified index pipeline. Get in the habit of saving your work as you work.
>
> Now your document ID is more useful, and your movie titles are full-text searchable.
>
> > [!TIP]
> >
> > Because the input documents in this tutorial are simple documents with a fixed number of known fields, it is easy to configure the Field Mapping stage to ensure the correct document structure for Fusion. When documents have large numbers of fields, the [Solr Dynamic Field Mapping stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/solr-dynamic-field-name-mapping-index-stage) can reduce the work required to configure the index pipeline.
>
> ### Split a multi-value field
>
> The `genres_ss` field has been parsed as a single-value field, but you can see that it is really a pipe-delimited array of values. To split this field into its constituent values, you will add a [Regex Field Extraction stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/solr-dynamic-field-name-mapping-index-stage) to your index pipeline. This stage uses regular expressions to extract data from specific fields. It can append or overwrite existing fields with the extracted data, or use the data to populate new fields.
>
> 1. Click **Add a stage**.
> 2. Scroll down and select **Regex Field Extraction** (under Field Transformation).
>
> The Regex Field Extraction stage configuration panel appears.
>
> 
> 3. Under **Regex Rules**, click **Add** .
> 4. On the new line, hover over the `[...]` under **Source Fields**, and then click **Edit** .
>
> The Source Fields window opens.
> 5. Click **Add** .
> 6. Enter `genres_ss`, and then click **Apply**.
> 7. Under **Target Field**, enter `genres_ss`.
> 8. In the **Write Mode** field, select **overwrite**.
> 9. In the **Regex Pattern** field, enter this expression:
>
> ```
> [^|\s][^\|]*[^|\s]*
> ```
>
> > [!TIP]
> >
> > You might need to scroll horizontally to see this field.
>
> The first bracketed term in the regex matches any character that is not a vertical bar or a space.
> The second term matches any character that is not a vertical bar, zero or more times.
> The last term matches any character that is not a vertical bar, zero or more times.
> 10. In the **Return If No Match** field, select `input_string`.
> 11. Click **Apply**.
>
> Initially, your data does not change.
> 12. In the list of index pipeline stages, drag the **Regex Field Extraction** stage down so that it comes after the Field Mapping stage:
>
> 
>
> Now the preview shows multiple values for the `genres_ss` field:
>
> | | |
> | - | - |
> | Before | After |
> |  |  |
>
> > [!TIP]
> >
> > If the preview panel does not update automatically, select a different number of documents to view using the dropdown in the bottom right of the screen. This forces the preview to update.
> 13. To view the values of the `genres_ss` field, expand it and `values` under it by clicking the right triangle :
>
> 
>
> These field values are useful for faceting, which you will explore in Part 3 of this tutorial.
> 14. In the upper right, click **Save**. This saves your modified index pipeline.
>
> ### Create a new field from part of an existing one
>
> Notice that the `title_txt` field also contains the year in which the movie was released. Instead of including the year in your full-text search field, it would be more useful as a separate field that you can use for faceting. This is another job for the [Regex Field Extraction stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/solr-dynamic-field-name-mapping-index-stage).
>
> 1. In the list of index pipeline stages, click **Regex Field Extraction**.
> 2. In the Regex Field Extraction configuration panel, under Regex Rules, click **Add** .
> 3. On the new line, hover over the `[...]` under **Source Fields**, and then click **Edit** .
>
> The Source Fields window appears.
> 4. Click **Add** .
> 5. Enter `title_txt`, and then click **Apply**.
> 6. Under Target Field, enter `year_i`.
>
> The `_i` suffix indicates an integer point field (specifically, that the field is a dynamic field with a `pint` field type). Fusion will create this new field whenever the regular expression matches the contents of the source field.
>
> > [!TIP]
> >
> > When you use the Regex Field Extraction stage to create a new field, the value of **Write Mode** makes no difference.
> 7. In the **Regex Pattern** field, enter this expression to match the digits inside the parentheses at the end of the `title_txt` value:
>
> ```
> \(([0-9]+)\)$
> ```
> 8. In the **Regex Capture Group** field, enter `1`. This lets the index pipeline stage transfer the year into the `year_i` field.
>
> > [!TIP]
> >
> > Scroll all the way to the right to see this field.
> 9. Click **Apply**.
>
> Now the preview includes the new `year_i` field:
>
> | | |
> | - | - |
> | Before | After |
> |  |  |
> 10. In the upper right, click **Save**. This saves your modified index pipeline.
>
> ### Trim a field's value
>
> The `title_txt` field still includes the year of the film’s release, which you have extracted into its own field, `year_i`. Let us trim that information from the `title_txt` values so that only the title text remains.
>
> 1. In the list of index pipeline stages, click **Regex Field Extraction**.
> 2. In the Regex Field Extraction configuration panel, under Regex Rules, click Add .
> 3. On the new line, hover over **Source Fields**, and then click Edit .
>
> The Source Fields window appears.
> 4. Click **Add** .
> 5. Enter `title_txt`, and then click **Apply**.
> 6. Under Target Field, enter `title_txt`.
> 7. In the **Write Mode** field, select `overwrite`.
> 8. In the **Regex Pattern** field, enter this expression to match the digits inside the parentheses at the end of the `title_txt` value:
>
> ```
> ^(.+)\s\(([0-9]+)\)$
> ```
> 9. In the **Regex Capture Group** field, enter `1`.
> 10. Click **Apply**.
>
> Now the preview pane shows the `title_txt` field with only the title string:
>
> | | |
> | - | - |
> | Before | After |
> |  |  |
> 11. In the upper right, click **Save**. This saves your modified index pipeline.
>
> ## Run the datasource job
>
> Now you have a correctly-configured index pipeline appropriate to your data. You are ready to index the data.
>
> 1. In the upper left, click **Start job**.
>
> 
>
> This launches a datasource job that imports and indexes the complete contents of your `movies.csv` file, using the configuration you just saved.
>
> Your datasource job is finished when the Index Workbench displays `Status: success` in the upper left. If the status does not change, go back to the launcher and relaunch your app.
>
> ## Close panels you no longer need open
>
> Fusion opens panels beside already open panels. Close all of the panels that are open by clicking **Close** .
>
> ## Reindexing
>
> Documents are associated with a collection through the name of the datasource. The datasource name is stored as a value in the `_lw_data_source_s` field. For various reasons, you may wish to remove all documents associated with a datasource from a collection before using CrawlDB to add relevant documents back to the collection. This process is known as **reindexing**.
>
> To accomplish this, navigate to **Indexing**  > **Datasources**, select the datasource name, and then click **Clear Datasource**. This will remove all documents with the selected datasource name in the `_lw_data_source_s` field. After the documents are removed from the collection, you can repeat \[the steps above"/> to reindex the data.
>
> > [!WARNING]
> >
> > Use caution when creating or changing a datasource name. If you create a new datasource name that is identical to an existing datasource name, all document associations will be shared between the datasource names. Changing the name to match an existing name will have the same result.
>
> ## What is next
>
> Now you have 9,125 movie listings from the MovieLens database in Fusion’s index, customized to indicate the data type for each field. You also split a multi-valued field so that its values can be treated individually, created a new field to contain partial contents of a different field, and trimmed that content from the original field.
>
> Let us compare the initial indexing of your data with the indexing after field mappings and extractions:
>
> | Before | After |
> | - | - |
> |  |  |
>
> In Part 3, you will use Query Workbench to get search results from your collection and configure the query pipeline that customizes those results. You will add faceting using the `genres_ss` and `year_i` fields so that users can easily filter their search results.
> **Part 3: Get Data Out**
>
> In Part 2, you used Index Workbench to get data into Fusion by previewing the dataset, configuring the index pipeline, and then indexing the data.
>
> In Part 3 (this part), you will explore Query Workbench and learn how to configure Fusion’s output (search results), including faceting. Facets are the ubiquitous, dynamic lists of categories or features offered as filters within a search results page.
>
> ## Before you begin
>
> To proceed with this part of the tutorial, you must first complete Part 1 and Part 2, which give you an indexed dataset for Query Workbench to read.
>
> The dataset has three fields that users of your search application might find relevant:
>
> * `genres_ss`. A list of one or more genre labels
> * `title_txt`. The name of the movie
> * `year_i`. The movie’s year of release
>
> The field suffixes indicate the type of data stored in each field:
>
> * Fields with the suffix `_ss` (multi-valued string fields) contain one or more strings values.
>
> String fields require an exact match between the query string and the
> string value stored in that field.
> * Fields with the suffix `_txt` (text fields) contain text.
>
> Text fields allow for free text search over the field contents.\
> For example, because the movie titles are stored in a text field, a search on
> the word "Star" will match movies titled "Star", "A Star is Born", all movies in the
> Star Wars and Star Trek franchises, as well as "Dark Star", "Lone Star", and "Star Kid".
> * Fields with the suffix `_i` (point integer fields) contain integer values.
>
> Numeric fields allow range matches as well as exact matches, and point integer fields allow efficient comparisons between the field’s values and the search criteria.
>
> The different field types allow for different kinds of searches. Configuration of the query pipeline determines how fields are searched.
>
> ## Explore search results
>
> Query Workbench lets you interactively configure a query pipeline while previewing the search results it produces. A query pipeline converts a free text query submitted to your search application into a structured query for Solr.
>
> 1. Log in to Fusion.
> 2. Click the **Movie Search** app.
>
> The Fusion workspace appears.
> 3. Open Query Workbench. Navigate to **Querying**  > **Query Workbench**.
>
> 
>
> ### Perform a search
>
> The default search is the wildcard search (`\*:*`), which returns all documents in the collection. You will enter a different [search query](/docs/5/fusion/getting-data-out/query-basics/query-language-cheat-sheet) to get started with facet configuration.
>
> 1. In the search box, enter the query string `star`, and then press Enter or click **Search** .
>
> This search returns all movies that have the word "star" in the title.
>
> 
>
> The output is configured by the default query pipeline, which has the same name as the collection (4.x) or app (5.x). In this case, the name is `movie-search`.
> To see more of the default output, you can perform other searches if you like.
>
> 1. In the search box, enter the query string `\*:*` to return all documents, and then press Enter or click **Search** .
>
> > [!TIP]
> >
> > If you wish to refine your results, you can change your index pipeline configuration and reindex your data.
>
> ### Explore the role of query pipeline stages
>
> A default query pipeline consists of the stages below.
>
> Some of these support Fusion AI features for advanced relevancy tuning, which you can read about separately.
>
> In this tutorial, we will configure a couple of the basic stages:
>
> * **Boost with Signals.** Use signals data to boost relevant documents.
>
> * **Query Fields.** Specify the set of fields over which to search.
>
> We will configure this stage later in this tutorial.
>
> * **Field Facet.** Specify the fields to use for faceting.
>
> We will configure this stage, too, for basic faceting and range faceting.
>
> * **Text Tagger.** Look for known phrases, synonyms, misspellings, and so on, that can be used to improve the query with [query rewriting](/docs/5/fusion/getting-data-out/query-enhancement/query-rewriting).
>
> * **Apply Rules.** Modify the query using [business rules](/docs/5/fusion/getting-data-out/query-enhancement/business-rules/overview), if any are triggered.
>
> * **Solr Query.** Perform the query and return the results.
>
> This is the only stage that is *always required* to perform a query and receive results.
>
> * **Modify Response.** Modify Solr’s response using business rules, if any are triggered.
>
> 1. Turn off the Solr Query stage by clicking on the green circle on the left. The circle will change to white and Solr Query will dim to indicate the Solr Query stage is off.
>
> 
>
> All search results disappear from the preview pane because Fusion does not send a query to Solr.
> 2. Turn on the Solr Query stage and turn all other stages off.
>
> 
>
> Now the search results look much like they did before. At this point, the disabled stages do not affect the output because they are not yet configured.
> 3. Turn all stages on.
>
> ## Configure faceting
>
> Facets are the ubiquitous, dynamic lists of categories or features offered as filters within a search results page. Facets provide a simple way for users to explore and filter their search results without having to construct complicated queries. You configure facets as a part of configuring a query pipeline.
>
> The data you indexed in Part 1 has two fields that are natural choices for faceting: `genres_ss` and `year_i`. For example, a user could search for science fiction of the 1950s in just a few clicks.
>
> 
>
> ### Configure basic faceting for genres
>
> The `genres_ss` field is ready for faceting as-is.
>
> 1. Click **Add a field facet** and select the `genres_ss` field.
>
> 
> 2. Click **Sci-Fi** to select movies that have the value `Sci-Fi` for `genres_ss`:
>
> 
>
> > [!TIP]
> >
> > Genres are not in any specific order. In configuration for the Field Facet stage, you can choose a value of Sort for the facet field - `index` (alphabetical ascending order) or `count` (number of documents). Or you can add field facets by configuring the Field Facet stage.
> 3. Under the field facet **genres\_ss**, click **Clear all**.
>
> ### Configure range faceting for years
>
> If you were to just configure faceting for the `year_i` field as you did above for the `genres_ss` field, you would get one facet per year, which is not very useful.
>
> But the `year_i` field will be more usable if you configure *range faceting*. Range faceting is a way of grouping values together so that the user can select a value range instead of one specific value. For example, range facets are commonly used with pricing ($50-$100) or ratings (4 stars or higher). Here, we group years by decade.
>
> Range faceting requires sending an additional query parameter to Fusion’s Solr core. You can configure this with the [Additional Query Parameters stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/set-query-params-stage). In this case, you will use several of [Solr’s range facet query parameters](https://cwiki.apache.org/confluence/display/solr/Faceting#Faceting-RangeFaceting).
>
> Use the Additional Query Parameters stage to configure range faceting for the `year_i` field:
>
> 1. Click **Add a stage**.
> 2. Scroll down under Advanced and select **Additional Query Parameters**.
>
> 
>
> The Additional Query Parameters configuration panel appears.
> 3. Under **Parameters and Values**, add the following parameter names and values:
>
> | | |
> | - | - |
> | Parameter Name | Parameter Value |
> | `facet.range` | `year_i` |
> | `facet.range.start` | `1900` |
> | `facet.range.end` | `2020` |
> | `facet.range.gap` | `10` |
> | `facet.range.include` | `outer` |
>
> In this case, you do not need to modify the **Update Policy** field; the default value of `append` is fine.
> 4. Click **Apply**, and then **Cancel** (which just closes the configuration panel for the Additional Query Parameters stage).
>
> The year facets are now grouped by decade:
>
> 
>
> > [!TIP]
> >
> > Facets are not the only way for users to find items by year. In your user application, you can let users search for specific values in the `year_i` field, for example, by using a text field or dropdown list.
>
> ## Configure query fields
>
> In this section, you will see why it is useful to specify which fields Fusion should use to match a query.
>
> 1. Search for "2001".
>
> The results are not what an end user might expect:
>
> 
>
> "2001: A Space Odyssey" is not the top search result.
> 2. Under one of the movies listed, click **show fields**.
>
> 
>
> Here is the reason: your search query matches the `id` field, but users do not care about this field.
>
> You will use the [Query Fields](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/search-fields-query-stage) stage to specify the fields that users really care about.
> 3. Below the name for the movie you selected, click **hide fields**.
> 4. Click the **Query Fields** stage of the query pipeline.
>
> The Query Fields configuration panel appears.
> 5. Under **Search Fields**, click **Add** .
> 6. Enter `title_txt`.
> 7. Click **Add**  again.
> 8. Enter `year_i`.
> 9. Click **Apply**, and then **Cancel** (which just closes the configuration panel for the Query Fields stage).
>
> Now movies with '2001' in their title rise to the top of your search results, followed by films made in the year 2001:
>
> 
>
> ## Save the query pipeline configuration
>
> 1. In the upper right, click **Save**.
>
> The **Save Pipeline** window appears. By default, you will overwrite the default query pipeline for this datasource.
> 2. Click **Save pipeline**.
>
> ## What is next
>
> With just two facet fields combined with keyword search, this prototype is already beginning to feel like a real search application.
>
> In Part 4, you will enable signals, generate some signal data, aggregate it, and search it to see what it looks like. Signals can be used for recommendations or boosting.
> **Part 4: Improve Relevancy**
>
> Signals are events that can be aggregated and used for automatic boosting or recommendations, which are ways of making search results more relevant.
>
> As an example of boosting, the most popular search results for certain queries can be boosted so that they appear first (or at least nearer the top) when other users make similar queries.
>
> Similarly for recommendations, click events or purchase events can be collected as signals and used to display "Customers who viewed this also viewed" or "Best-selling holiday items".
>
> In a production environment, users' actions generate signals. For the purposes of this tutorial, you will use Query Workbench to generate click signals.
>
> > **[Refining Search Results](https://academy.lucidworks.com/path/refining-search-results)**
> >
> > The learning path for **Refining Search Results** focuses on the Fusion features that help you maximize the relevancy of your search results.
>
> ## Before you begin
>
> To proceed with this part of the tutorial, you must first complete Part 1, Part 2, and Part 3, which give you an indexed dataset that is configured for faceted search.
>
> If the Fusion UI is not already open, then open it.
>
> 1. In a browser window, open `localhost:8764`.
> 2. Enter the password for the user `admin`, and then click **Login**.
>
> The Fusion launcher appears.
> 3. Click the **Movie Search** app.
>
> The Fusion workspace appears.
>
> ## Format display fields
>
> To help you understand the continuity in the next steps, first make sure that some relevant fields are displayed.
>
> 1. Open Query Workbench.
> Navigate to **Querying**  > **Query Workbench**.
> 2. At the top right of the page, select **Display Fields**.
> 3. In the **Name** field, click the row to reveal a dropdown of possible values.
> 4. Select `title_txt`. You can filter the list of possible values to help you.
> 5. In the **Description** field, select `id`.
> 6. Close the Display Fields window.
>
> 1. Click **Display Fields** to close the Display Fields window.
>
> 
>
> ## Enable synthetic signals
>
> You need some signal data beyond the few signals you generated while completing Part 3. Because this is a prototype app, users are not generating signals. Instead, you will enable synthetic signals in Query Workbench.
>
> 1. At the bottom of the Query Workbench page, click **Format Results**.
> 2. Select **Show signal generators** *and* **Send click signals**.
>
> 
> 3. Click **Save**.
> 4. Hover over one of the search results.
>
> Now when you hover over a search result, Query Workbench displays controls that include a **Simulate** button next to a field that lets you specify the number of signals to simulate:
>
> 
>
> ## Generate signals
>
> With synthetic signals enabled, you will generate a simple set of signal data that you can use to generate meaningful recommendations.
>
> For this tutorial, you will generate signals that you can use to boost your favorite sci-fi titles so that they appear first.
>
> 1. Search for `star wars`.
>
> The top results are not your favorite titles:
>
> 
>
> 2. In **Format Results**, **Set results per page** to 20. This should allow you to scroll for this next part instead of explicitly searching for the titles.
>
> Next you will generate signals that you can use to boost certain titles. Signals are tied to the search query, so your boosted titles will appear first in the search results only when users search for `star wars`.
>
> 3. Hover over "Star Wars: Episode IV - A New Hope".
>
> 4. Set the number of signals to 4000 and click **Simulate**.
>
> 5. Hover over "Star Wars: Episode V - The Empire Strikes Back".
>
> 6. Set the number of signals to 3000 and click **Simulate**.
>
> 7. Hover over "Star Wars: Episode VI - Return of the Jedi".
>
> 8. Set the number of signals to 2000 and click **Simulate**.
>
> > [!TIP]
> >
> > With synthetic signals enabled, you can also send a single signal by clicking the underlined movie title.
>
> 9. In the upper right, click **Save**.
>
> The **Save Pipeline** window appears. By default, you will overwrite the existing query pipeline for the selected collection (in this case, `Movie_Search_signals`).
>
> 10. Click **Save pipeline**.
>
> ## Explore the raw signals
>
> Whenever you create a collection, two corresponding collections are also created automatically: `COLLECTION_NAME_signals` for raw signals and `COLLECTION_NAME_signals_aggr` for aggregated signals (in this case, `Movie_Search_signals` and `Movie_Search_signals_aggr`). Just as you did with your primary collection, you can use Query Workbench to explore the data in the `_signals` collection.
>
> 1. In the collection picker in the upper left, select **Movie\_Search\_signals**.
>
> 2. Open Query Workbench. Navigate to **Querying**  > **Query Workbench**.
>
> Your signal data appears.
>
> 
>
> Your signals collection contains several types of signals, such as click signals and search result signals. Let us investigate the click signals.
>
> 3. Search for `type:click`.
>
> 4. For any of the results, click **show fields**.
>
> * The `count_i` field shows the number of click signals you generated for this event. For example, given the corresponding `doc_id` for Star Wars: Episode IV - A New Hope, the `count_i` equals 4000.
>
> 
>
> In Fusion 4.0:
> \*\*\* The contents of the `doc_id_s` field in the `Movie_Search_signals` collection is the same as the contents of the `id` field in your `Movies_Search` collection, that is, the ID of the document that you clicked in Query Workbench, or for which you specified a number of clicks, and then clicked *Simulate*\*.
> \*\* The `query_orig_s` field in the `Movie_Search_signals` collection contains the original query string that produced this search result.
>
> 5. Click **hide fields**.
>
> ### Optional: Format signals fields
>
> You can configure your search view to display fields that are meaningful for your investigation.
> For example, you can display the document ID and the number of click signals.
>
> 1. Click **Display Fields**.
> 2. For the **Name** field, select `doc_id`.
> 3. For the **Description** field, select `count_i`.
>
> 
>
> ## Explore the aggregated signal data
>
> Aggregation jobs are created automatically when you create an app. However, you need to run the aggregation job manually:
>
> 1. Navigate to Collections  > **Jobs**.
> 2. Select `Movie_Search_click_signals_aggregation` from the job list.
> 3. Click **Run**.
> 4. Click **Start**.
>
> After you run your job (it might take a minute or two), open the Query Workbench and check whether the aggregated data has arrived in the `Movie_Search_signals_aggr` collection.
>
> 1. In the collections picker in the upper left, select **Movie\_Search\_signals\_aggr**.
> 2. Open Query Workbench. Navigate to **Querying**  > **Query Workbench**.
>
> Your aggregated signal data should appear. If not, wait a minute and then reload your browser, or click **Search**  in Query Workbench.
>
> 
> 3. Click **Display Fields**.
> 4. For the **Name** field, select `doc_id`.
> 5. For the **Description** field, select `aggr_count_i`.
> 6. For the result 1210, click **show fields**.
>
> 
>
> The fields for aggregated signals are very similar to the fields for raw signals, with additional fields to describe the aggregation:
>
> * `aggr_count_i`. Number of signals that have been aggregated (in this case, 3000)
> * `aggr_id_s`. Name of the aggregation job
> * `aggr_job_id_s`. Job ID
> * `aggr_type_s`. Aggregation type
> 7. In the upper right, click **Save**.
>
> The **Save Pipeline** window appears. By default, you will overwrite the existing query pipeline for the selected collection (in this case, `Movie_Search`).
> 8. Click **Save pipeline**.
>
> ## View the search results with and without default boosting
>
> 1. In the collections picker in the upper left, select **Movie\_Search**.
> 2. Open Query Workbench. Navigate to **Querying**  > **Query Workbench**.
> 3. Search for `star wars`.
>
> Now, "Star Wars: Episode IV - A New Hope" is the first search result, followed by Episode V and then VI. These search results are automatically boosted by the default configuration of the
> [Boost with Signals query pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/recommendation-boosting-query-stage),
> which boosts on the `id` field.
>
> 
>
> > [!NOTE]
> >
> > The Boost with Signals stage requires a Fusion AI license. Your Fusion trial license enables Fusion AI features.
> 4. Click **Compare**. Another preview panel opens. Now the working pipeline is on the right and a static snapshot of that same pipeline is on the left.
>
> 
>
> In this view, you can compare results from one query pipeline side by side with another query pipeline.
> In this case, you will compare results for the same pipeline (`Movie_Search`) with and without the Boost with Signals stage enabled.
> 5. Turn off the Boost with Signals stage.
>
> 
>
> Now the search results on the right appear as they did before you generated synthetic click signals. Rank-change indicators indicate which results moved up or down as a result of turning off boosting.
> 6. Turn on the Boost with Signals stage again to restore the boosted results.
> 7. Close the comparison preview panel by clicking the close  icon.
Interested in using Fusion 5 with Kubernetes? See [Kubernetes concepts](/docs/5/fusion/intro/kubernetes) and **Deploy Fusion 5 on Azure Kubernetes Service (AKS)**. We also have guides for deploying Fusion on **Deploy Fusion 5 on Amazon Elastic Kubernetes Service (EKS)** and **Deploy Fusion 5 on Google Kubernetes Engine (GKE)**.
> **Deploy Fusion 5 on Azure Kubernetes Service (AKS)**
>
> Fusion supports deployment on Azure Kubernetes Service (AKS). This topic explains how to deploy a Fusion cluster on AKS using the [`setup_f5_aks.sh` script](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_aks.sh) in the [`fusion-cloud-native`](https://github.com/lucidworks/fusion-cloud-native) repository.
>
> > [!TIP]
> >
> > The `setup_f5_aks.sh` script is the basic foundation for getting started and proof-of-concept purposes. For information about custom values in a production-ready environment, see Custom values YAML file.
>
> ## Prerequisites
>
> This section covers prerequisites and background knowledge needed to help you understand the structure of this document and how the Fusion installation process works with Kubernetes.
>
> ### Release Name and Namespace
>
> Before installing Fusion, you need to choose a [https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) namespace to install Fusion into.
> Think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster *in separate namespaces*.
> However, please *do not* install more than one Fusion release in the same namespace.
>
> > [!NOTE]
> >
> > All Fusion services must run in the same namespace, i.e. you should not try to split a Fusion cluster across multiple namespaces.\_\_
>
> Use a short name for the namespace, containing only letters, digits, or dashes (no dots or underscores). The setup scripts in this repo use the namespace for the Helm release name by default.
>
> ### Install Helm
>
> Helm is a package manager for Kubernetes that helps you install and manage applications on your Kubernetes cluster.
> Regardless of which Kubernetes platform you're using, you need to install *`helm`* as it is required to install Fusion for any K8s platform.
> On MacOS, you can do:
>
> ```bash theme={"dark"}
> brew install kubernetes-helm
> ```
>
> If you already have helm installed, make sure you're using the latest version:
>
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
>
> For other OS, please refer to the Helm installation docs: [https://helm.sh/docs/using\_helm/](https://helm.sh/docs/using_helm/)
>
> The Fusion helm chart requires that helm is greater than version `3.0.0`; check your Helm version by running `helm version --short`.
>
> #### Helm User Permissions
>
> If you require that fusion is installed by a user with minimal permissions, instead of an admin user, then the role and cluster role that will have to be assigned to the user within the namespace that you wish to install fusion in are documented in the `install-roles` directory.
>
> > [!NOTE]
> >
> > When working with Kubernetes on the command-line, it's useful to create a shell alias for `kubectl`, e.g.:
> >
> > ```bash theme={"dark"}
> > alias k=kubectl
> > ```
>
> To use these role in a cluster, as an admin user first create the namespace that you wish to install fusion into:
>
> ```bash theme={"dark"}
> k create namespace fusion-namespace
> ```
>
> Apply the `role.yaml` and `cluster-role.yaml` files to that namespace
>
> ```bash theme={"dark"}
> k apply -f cluster-role.yaml
> k config set-context --current --namespace=$NAMESPACE
> k apply -f role.yaml
> ```
>
> Then bind the rolebinding and clusterolebinding to the install user:
>
> ```bash wrap theme={"dark"}
> k create --namespace fusion-namespace rolebinding fusion-install-rolebinding --role fusion-installer --user
> k create clusterrolebinding fusion-install-rolebinding --clusterrole fusion-installer --user
> ```
>
> You will then be able to run the `helm install` command as the ``
>
> ### Clone fusion-cloud-native from GitHub
>
> You should clone this repo from github as you'll need to run the scripts on your local workstation:
>
> ```bash theme={"dark"}
> git clone https://github.com/lucidworks/fusion-cloud-native.git
> ```
>
> You should get into the habit of pulling this repo for the latest changes before performing any maintenance operations on your Fusion cluster to ensure you have the latest updates to the scripts.
>
> ```bash theme={"dark"}
> cd fusion-cloud-native
> git pull
> ```
>
> Cloning the github repo is preferred so that you can pull in updates to the scripts, but if you are not a git user, then you can download the project: [https://github.com/lucidworks/fusion-cloud-native/archive/master.zip](https://github.com/lucidworks/fusion-cloud-native/archive/master.zip).
> Once downloaded, extract the zip and cd into the `fusion-cloud-native-master` directory.
>
> The [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_aks.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_aks.sh) script provided in this repo is strictly optional.
> The script is mainly to help those new to Kubernetes and/or Fusion get started quickly.
> If you're already familiar with K8s, Helm, and AKS, then you use Helm directly to install Fusion into an existing cluster or one you create yourself using the process described `<>`.
>
> If you're new to Azure, then please visit [https://azure.microsoft.com/en-us/free/search/](https://azure.microsoft.com/en-us/free/search/) to set up an account.
>
> ### Set up the AKS CLI tools
>
> Before launching an AKS cluster, you need to install and configure `kubectl` and `az` using the links provided below:
>
> Required AKS Command-line Tools:
>
> * `kubectl`: [https://kubernetes.io/docs/tasks/tools/install-kubectl/](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
> * `az`: [https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)
>
> To confirm your account access and command-line tools are set up correctly, run the `az login` command (`az login –help` to see available options).
>
> ### Azure Prerequisites
>
> To launch a cluster in AKS (or pretty much do anything with Azure) you need to setup a Resource Group. Resource Groups are a way of organizing and managing related resources in Azure.
> For more information about resource groups, see [https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview#resource-groups](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview#resource-groups).
>
> You also need to choose a location where you want to spin up your AKS cluster, such as `westus2`. For a list of locations you can choose, see [https://azure.microsoft.com/en-us/global-infrastructure/locations/](https://azure.microsoft.com/en-us/global-infrastructure/locations/).
>
> Use the Azure console in your browser to create a resource group, or simply do:
>
> ```bash theme={"dark"}
> az group create -g $AZURE_RESOURCE_GROUP -l $AZURE_LOCATION
> ```
>
> To recap, you should have the following requirements in place:
>
> * Azure Account set up.
> * `azure-cli` (`az`) command-line tools installed.
> * `az` login working.
> * Created an Azure Resource Group and selected a location to launch the cluster.
>
> ### Set up Fusion on AKS
>
> Download and run the [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_aks.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_aks.sh) to install Fusion 5.x in a AKS cluster. To create a new cluster and install Fusion, simply do:
>
> ```bash theme={"dark"}
> ./setup_f5_aks.sh -c -p
> ```
>
> If you don't want the script to create a cluster, then you need to create a cluster before running the script and simply pass the name of the existing cluster using the `-c` parameter.
>
> Use the `--help` option to see full script usage.
>
> By default, our script installs Fusion into the default namespace; think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster in separate namespaces. However, please do not install more than one Fusion release in the same namespace.
>
> You can override the namespace using the `-n` option. In addition, our script uses f5 for the Helm release name; you can customize this using the `-r` option. Helm uses the release name you provide to track a specific instance of an installation, allowing you to perform updates and rollback changes for that specific release only.
>
> You can also pass the `--preview` option to the script, which enables soon-to-be-released features for AKS, such as deploying a multi-zone cluster across 3 availability zones for higher availability guarantees. For more information about the Availability Zone feature, see [https://docs.microsoft.com/en-us/azure/aks/availability-zones](https://docs.microsoft.com/en-us/azure/aks/availability-zones).
>
> It takes a while for AKS to spin up the new cluster. The cluster will have three Standard\_D4\_v3 nodes which have 4 CPU cores and 16 GB of memory. Behind the scenes, our script calls the `az aks create` command.
>
> > [!WARNING]
> >
> > If using Helm V2, the `setup_f5_aks.sh` script installs Helm's `tiller` component into your AKS cluster with the cluster admin role. If you don't want this, then please upgrade to Helm v3.
>
> After running the `setup_f5_aks.sh` script, proceed to `<>`.
>
> #### AKS Ingress
>
> The `setup_f5_aks.sh` script exposes the Fusion proxy service on an external IP over HTTP. This is done for demo or getting started purposes. However, you're strongly encouraged to configure a K8s Ingress with TLS termination in front of the proxy service.
>
> Use the `-t` and `-h ` options to have our script create an Ingress with a TLS certificate issued by Let's Encrypt.
>
> #### Upgrades and Ingress
>
> IMPORTANT: If you used the `-t -h ` options when installing your cluster, our script created an additional values yaml file named `tls-values.yaml`.
>
> To make things easier for you when upgrading, you should add the settings from this file into your main custom values yaml file. For example:
>
> ```yaml theme={"dark"}
> api-gateway:
> service:
> type: "NodePort"
> ingress:
> enabled: true
> host: ""
> tls:
> enabled: true
> annotations:
> "networking.gke.io/managed-certificates": "-managed-certificate"
> "kubernetes.io/ingress.class": "gce"
> ```
>
> This way, you don't have to remember to pass the additional `tls-values.yaml` file when upgrading.
>
> ## Verifying the Fusion Installation
>
> In this section, we provide some tips on how to verify the Fusion installation.
>
> > [!TIP]
> >
> > Check if the Fusion Admin UI is available at `\https://:6764/admin/`.
>
> Let's review some useful kubectl commands.
>
> ### Enhance the K8s Command-line Experience
>
> Here is a list of tools we found useful for improving your command-line experience with Kubernetes:
>
> * krew (kubectl plugin mgr): [https://github.com/kubernetes-sigs/krew/](https://github.com/kubernetes-sigs/krew/)
> * kube-ps1 (show current context on command line prompt): [https://github.com/jonmosco/kube-ps1](https://github.com/jonmosco/kube-ps1)
> * kubectx / kubens (switch between clusters / namespaces): [https://github.com/ahmetb/kubectx](https://github.com/ahmetb/kubectx)
>
> ### Useful kubectl commands
>
> kubectl reference: [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)
>
> Set the namespace for `kubectl` if not using the default:
>
> ```bash theme={"dark"}
> kubectl config set-context --current --namespace=
> ```
>
> **This saves you from having to pass `-n` with every command.**
>
> Get a list of running pods: `k get pods`
>
> Get logs for a pod using a label: `k logs –l app.kubernetes.io/component=query-pipeline`
>
> Get pod deployment spec and details: `k get pods -o yaml`
>
> Get details about a pod events: `k describe po `
>
> Port forward to a specific pod: `k port-forward 8983:8983`
>
> SSH into a pod: `k exec -it -- /bin/bash`
>
> CPU/Memory usage report for pods: `k top pods`
>
> Forcefully kill a pod: `k delete po --force --grace-period 0`
>
> Scale up (or down) a deployment: `k scale deployment.v1.apps/ --replicas=N`
>
> Get a list of pod versions: `k get po -o jsonpath='{..image}' | tr -s '[[:space:]]' '\n' | sort | uniq`
>
> ### Check Fusion Pods and Services
>
> Once the install script completes, you can check that all pods and services are available using:
>
> ```bash theme={"dark"}
> kubectl get pods
> ```
>
> If all goes well, you should see a list of pods similar to:
>
> ```bash wrap theme={"dark"}
> NAME READY STATUS RESTARTS AGE
> seldon-controller-manager-6675874894-qxwrv 1/1 Running 0 8m45s
> f5-admin-ui-74d794f4f8-m5jms 1/1 Running 0 8m45s
> f5-ambassador-fd6b9b5dc-7ghf6 1/1 Running 0 8m43s
> f5-api-gateway-6b9998b9c-tmchk 1/1 Running 0 8m45s
> f5-auth-ui-7565564b4c-rdc74 1/1 Running 0 8m42s
> f5-classic-rest-service-0 1/1 Running 3 8m44s
> f5-devops-ui-77bb867ffb-fbzxd 1/1 Running 0 8m42s
> f5-fusion-admin-78b8f8fc7f-4d7l8 1/1 Running 0 8m42s
> f5-fusion-indexing-599c8d448-xzsvm 1/1 Running 0 8m44s
> f5-insights-665fd9f6fc-g5psw 1/1 Running 0 8m43s
> f5-job-launcher-84dd4c5c96-p8528 1/1 Running 0 8m44s
> f5-job-rest-server-6d44d964b8-xtnxw 1/1 Running 0 8m45s
> f5-logstash-0 1/1 Running 0 8m45s
> f5-ml-model-service-6987dc94c9-9ppp8 2/2 Running 1 8m45s
> f5-monitoring-grafana-5d499dbb58-pzw72 1/1 Running 0 10m
> f5-monitoring-prometheus-kube-state-metrics-54d6678dv9h7h 1/1 Running 0 10m
> f5-monitoring-prometheus-pushgateway-7d65c65b85-vwrwf 1/1 Running 0 10m
> f5-monitoring-prometheus-server-0 2/2 Running 0 10m
> f5-pm-ui-86cbc5bb65-nd2n8 1/1 Running 0 8m44s
> f5-pulsar-bookkeeper-0 1/1 Running 0 8m45s
> f5-pulsar-broker-b56cc776f-56msx 1/1 Running 0 8m45s
> f5-query-pipeline-5d75d7d5f4-l2mdf 1/1 Running 0 8m43s
> f5-connectors-7bb6cfc65f-7wfs2 1/1 Running 0 8m42s
> f5-connectors-backend-987fdc648-dldwv 1/1 Running 0 8m45s
> f5-rules-ui-6b9d55b78f-9hzzj 1/1 Running 0 8m43s
> f5-solr-0 1/1 Running 0 8m44s
> f5-solr-exporter-c4687c785-jsm7x 1/1 Running 0 8m45s
> f5-ui-6cdbcc68c6-rj9cq 1/1 Running 0 8m45s
> f5-webapps-6d6bb9bfd-hm4qx 1/1 Running 0 8m45s
> f5-workflow-controller-7b66679fb7-sjbvp 1/1 Running 0 8m44s
> f5-zookeeper-0 1/1 Running 0 8m45s
> ```
>
> The number of pods per deployment / statefulset will vary based on your cluster size and replicaCount settings in your custom values YAML file.
> Also, don't worry if you see some pods having been restarted as that just means they were too slow to come up and Kubernetes killed and restarted them.
> You do want to see at least one pod running for every service. If a pod is not running after waiting a sufficient amount of time,
> use `kubectl logs ` to see the logs for that pod; to see the logs for previous versions of a pod, use: `kubectl logs -p`.
> You can also look at the actions Kubernetes performed on the pod using `kubectl describe po `.
>
> To see a list of Fusion services, do:
>
> ```bash theme={"dark"}
> kubectl get svc
> ```
>
> For an overview of the various Fusion 5 microservices, see: [Fusion microservices](/docs/5/fusion/reference/microservices).
>
> Once you're ready to build a Fusion cluster for production, please see see more information at [Fusion 5 Survival Guide](/docs/5/fusion/operations/survival-guide/overview).
>
> ### Upgrading with Zero Downtime
>
> One of the most powerful features provided by Kubernetes and a cloud-native microservices architecture is the ability to do a rolling update on a live cluster. Fusion 5 allows customers to upgrade from Fusion 5.x.y to a later 5.x.z version on a live cluster with zero downtime or disruption of service.
>
> When Kubernetes performs a rolling update to an individual microservice, there will be a mix of old and new services in the cluster concurrently (only briefly in most cases) and requests from other services will be routed to both versions. Consequently, Lucidworks ensures all changes we make to our service do not break the API interface exposed to other services in the same 5.x line of releases. We also ensure stored configuration remains compatible in the same 5.x release line.
>
> Lucidworks releases minor updates to individual services frequently, so our customers can pull in those upgrades using Helm at their discretion.
>
> To upgrade your cluster at any time, use the `--upgrade` option with our setup scripts in this repo.
>
> The scripts in this repo automatically pull in the latest chart updates from our Helm repository and deploy any updates needed by doing a diff of your current installation and the latest release from Lucidworks.
> To see what would be upgraded, you can pass the `--dry-run` option to the script.
>
> ### Grafana Dashboards
>
> Get the initial Grafana password from a K8s secret by doing:
>
> ```bash wrap theme={"dark"}
> kubectl get secret --namespace "${NAMESPACE}" ${RELEASE}-monitoring-grafana \
> -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
> ```
>
> With Grafana, you can either setup a temporary port-forward to a Grafana pod or expose Grafana on an external IP using a K8s LoadBalancer.
> To define a LoadBalancer, do (replace \$ with your Helm release label):
>
> ```bash wrap theme={"dark"}
> kubectl expose deployment ${RELEASE}-monitoring-grafana --type=LoadBalancer --name=grafana --port=3000 --target-port=3000
> ```
>
> You can use `kubectl get services --namespace ` to determine when the load balancer is setup and its IP address. Direct your browser to `http://:3000` and enter the username `admin@localhost` and the password that was returned in the previous step.
>
> This will log you into the application. It is recommended that you create another administrative user with a more desirable password.
>
> The dashboards and datasoure will be setup for you in grafana, simply navigate to `Dashboards` -> `Manage` to view the available dashboards
>
> ## More deployment options
>
> * How to deploy Fusion 5 in Google Kubernetes Engine
> * How to deploy Fusion 5 in Amazon Elastic Kubernetes Service
> * How to deploy Fusion on 5 other Kubernetes platforms
>
> ## Frequently Asked Questions
>
> **Can the stateful database services, for example, MySQL, be supported by an Azure PaaS service?**
>
> This option is not supported. In theory, it may be possible to implement this function.
>
> **Is it possible to use cross-zone storage solutions rather than volumes, such as Microsoft Azure file storage, for stateful services?**
>
> While in theory it may be possible to implement this functionality, the configuration has not been tested by Lucidworks and is not supported.
>
> ## Learn more
>
> > **[Deploying Fusion 5](https://academy.lucidworks.com/deploying-fusion-5)**
> >
> > The course for **Deploying Fusion 5** focuses on the prerequisite software needed to deploy Fusion, the necessary setup steps, and the physical act of deployment.
> **Deploy Fusion 5 on Amazon Elastic Kubernetes Service (EKS)**
>
> Fusion supports deployment on Amazon Elastic Kubernetes Service (EKS). This topic explains how to deploy a Fusion cluster on EKS using the [`setup_f5_eks.sh` script](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_eks.sh) in the [`fusion-cloud-native`](https://github.com/lucidworks/fusion-cloud-native) repository.
>
> In addition, this topic provides information about how to [configure IAM roles for the service account](#configure-iam-roles-for-the-service-account).
>
> ## Prerequisites
>
> This section covers prerequisites and background knowledge needed to help you understand the structure of this document and how the Fusion installation process works with Kubernetes.
>
> ### Release Name and Namespace
>
> Before installing Fusion, you need to choose a [https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) Kubernetes namespace to install Fusion into.
> Think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster *in separate namespaces*.
> However, please *do not* install more than one Fusion release in the same namespace.
>
> > [!NOTE]
> >
> > All Fusion services must run in the same namespace, i.e. you should not try to split a Fusion cluster across multiple namespaces.\_\_
>
> Use a short name for the namespace, containing only letters, digits, or dashes (no dots or underscores). The setup scripts in this repo use the namespace for the Helm release name by default.
>
> ### Install Helm
>
> Helm is a package manager for Kubernetes that helps you install and manage applications on your Kubernetes cluster.
> Regardless of which Kubernetes platform you're using, you need to install *`helm`* as it is required to install Fusion for any K8s platform.
> On MacOS, you can do:
>
> ```bash theme={"dark"}
> brew install kubernetes-helm
> ```
>
> If you already have helm installed, make sure you're using the latest version:
>
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
>
> For other OS, please refer to the Helm installation docs: [https://helm.sh/docs/using\_helm/](https://helm.sh/docs/using_helm/)
>
> The Fusion helm chart requires that helm is greater than version `3.0.0`; check your Helm version by running `helm version --short`.
>
> #### Helm User Permissions
>
> If you require that fusion is installed by a user with minimal permissions, instead of an admin user, then the role and cluster role that will have to be assigned to the user within the namespace that you wish to install fusion in are documented in the `install-roles` directory.
>
> > [!NOTE]
> >
> > When working with Kubernetes on the command-line, it's useful to create a shell alias for `kubectl`, e.g.:
> >
> > ```bash theme={"dark"}
> > alias k=kubectl
> > ```
>
> To use these role in a cluster, as an admin user first create the namespace that you wish to install fusion into:
>
> ```bash theme={"dark"}
> k create namespace fusion-namespace
> ```
>
> Apply the `role.yaml` and `cluster-role.yaml` files to that namespace
>
> ```bash theme={"dark"}
> k apply -f cluster-role.yaml
> k config set-context --current --namespace=$NAMESPACE
> k apply -f role.yaml
> ```
>
> Then bind the rolebinding and clusterolebinding to the install user:
>
> ```bash wrap theme={"dark"}
> k create --namespace fusion-namespace rolebinding fusion-install-rolebinding --role fusion-installer --user
> k create clusterrolebinding fusion-install-rolebinding --clusterrole fusion-installer --user
> ```
>
> You will then be able to run the `helm install` command as the ``
>
> ### Clone fusion-cloud-native from GitHub
>
> You should clone this repo from github as you'll need to run the scripts on your local workstation:
>
> ```bash theme={"dark"}
> git clone https://github.com/lucidworks/fusion-cloud-native.git
> ```
>
> You should get into the habit of pulling this repo for the latest changes before performing any maintenance operations on your Fusion cluster to ensure you have the latest updates to the scripts.
>
> ```bash theme={"dark"}
> cd fusion-cloud-native
> git pull
> ```
>
> Cloning the github repo is preferred so that you can pull in updates to the scripts, but if you are not a git user, then you can download the project: [https://github.com/lucidworks/fusion-cloud-native/archive/master.zip](https://github.com/lucidworks/fusion-cloud-native/archive/master.zip).
> Once downloaded, extract the zip and cd into the `fusion-cloud-native-master` directory.
>
> The [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_eks.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_eks.sh) `setup_f5_eks.sh` script provided in this repo is strictly optional.
> The script is mainly to help those new to Kubernetes and/or Fusion get started quickly.
> If you're already familiar with K8s, Helm, and EKS, then you use Helm directly to install Fusion into an existing cluster or one you create yourself using the process described `<>`.
>
> If you're new to Amazon Web Services (AWS), then please visit the Amazon Web Services [https://aws.amazon.com/getting-started/](https://aws.amazon.com/getting-started/) to set up an account.
>
> If you're new to Kubernetes and EKS, then we recommend going through Amazon's [https://eksworkshop.com/introduction/](https://eksworkshop.com/introduction/) before proceeding with Fusion.
>
> ### Set up the AWS CLI tools
>
> Before launching an EKS cluster, you need to install and configure `kubectl`, `aws`, `eksctl`, `aws-iam-authenticator` using the links provided below:
>
> Required AWS Command-line Tools:
>
> * kubectl: [https://kubernetes.io/docs/tasks/tools/install-kubectl/](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
> * aws: [https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)
> * eksctl: [https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)
> * aws-iam-authenticator: [https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html)
>
> Run `aws configure` to configure a profile for authenticating to AWS. You'll use the profile name you configure in this step, which defaults to `default`, as the `-p` argument to the `setup_f5_eks.sh` script in the next section.
>
> > [!NOTE]
> >
> > When working in Ubuntu, avoid using the eksctl snap version. Alternative sources can have different versions that could cause command failures. Also, always make sure you are using the latest version for each one of the required tools.
>
> ### Set up Fusion on EKS
>
> To create a cluster in EKS the following IAM policies are required:
>
> * AmazonEC2FullAccess
> * AWSCloudFormationFullAccess
>
> EKS Permissions:
>
> ```bash theme={"dark"}
> eks:CreateCluster
> eks:DeleteCluster
> eks:DescribeCluster
> eks:DescribeUpdate
> eks:ListClusters
> eks:ListUpdates
> eks:UpdateClusterVersion
> ```
>
> VPC Permissions:
>
> ```bash theme={"dark"}
> ec2:AssociateSubnetCidrBlock
> ec2:AssociateVpcCidrBlock
> ec2:AttachInternetGateway
> ec2:CreateInternetGateway
> ec2:CreateSubnet
> ec2:CreateVpc
> ec2:CreateVpcEndpoint
> ec2:DeleteInternetGateway
> ec2:DeleteSubnet
> ec2:DeleteVpc
> ec2:DeleteVpcEndpoints
> ec2:DescribeSubnets
> ec2:DescribeVpcAttribute
> ec2:DescribeVpcs
> ec2:DetachInternetGateway
> ec2:DisassociateSubnetCidrBlock
> ec2:DisassociateVpcCidrBlock
> ec2:ModifySubnetAttribute
> ec2:ModifyVpcAttribute
> ec2:ModifyVpcEndpoint
> ```
>
> .IAM Permissions
>
> ```bash theme={"dark"}
> iam:AddRoleToInstanceProfile
> iam:AttachRolePolicy
> iam:CreateInstanceProfile
> iam:CreatePolicy
> iam:CreatePolicyVersion
> iam:CreateRole
> iam:DeleteInstanceProfile
> iam:DeletePolicy
> iam:DeletePolicyVersion
> iam:DeleteRole
> iam:DeleteRolePolicy
> iam:DetachRolePolicy
> iam:GetInstanceProfile
> iam:GetPolicy
> iam:GetPolicyVersion
> iam:GetRole
> iam:GetRolePolicy
> iam:ListInstanceProfiles
> iam:ListInstanceProfilesForRole
> iam:PassRole
> iam:PutRolePolicy
> iam:RemoveRoleFromInstanceProfile
> iam:TagRole
> iam:UntagRole
> ```
>
> Download and run the [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_eks.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_eks.sh) `setup_f5_eks.sh` script to install Fusion 5.x in an EKS cluster.
>
> > [!NOTE]
> >
> > This script does not support multiple node pools and should not be used for production clusters.
>
> * To create a new cluster and install Fusion, run the following command:
> ```
> ./setup_f5_eks.sh -c my-eks-cluster -p profile-name -n fusion-namespace --create demo
> ```
> * Replace `my-eks-cluster`, `profile-name`, and `fusion-namespace` with your cluster, profile, and namespace values.
> * Pass the `--create` option with either `demo` or `multi_az`.
> * To use an existing cluster and install Fusion, run the following command:
> ```
> ./setup_f5_eks.sh -c cluster-name -p profile-name
> ```
> * Replace `cluster-name` with the name of the cluster you already created.
> * Replace `profile-name` with the name of your profile.
>
> The profile is automatically set to `default` if you ran the AWS configure command without giving the profile a name.
>
> Use the `--help` option to see full script usage.
>
> > [!WARNING]
> >
> > If using Helm V2, the `setup_f5_eks.sh` script installs Helm's `tiller` component into your EKS cluster with the cluster admin role. If you don't want this, then please upgrade to Helm v3.
>
> > [!WARNING]
> >
> > The `setup_f5_eks.sh` script creates a service account that provides S3 read-only permissions to the created pods.
>
> After running the `setup_f5_eks.sh` script, proceed to the `<>` section below.
>
> #### EKS cluster overview
>
> The EKS cluster is created using `eksctl` ([https://eksctl.io/](https://eksctl.io/)). By default it will setup the following resources in your AWS account:
>
> * A dedicated VPC for the EKS cluster in the specified region with CIDR: `192.168.0.0/16`
> * 3 Public and 3 Private subnets within the created VPC, each with a `/19` CIDR range, along with the corresponding route tables.
> * A NAT gateway in each Public subnet
> * An Auto Scaling Group of the instance type specified by the script, which defaults to `m5.2xlarge`, with 3 instances spanning the public subnets.
>
> See [https://eksctl.io/usage/vpc-networking/](https://eksctl.io/usage/vpc-networking/) for more information on the networking setup.
>
> #### EKS Ingress
>
> The `setup_f5_eks.sh` script exposes the Fusion proxy service on an external DNS name provided by an ELB over HTTP. This is done for demo or getting started purposes. However, you're strongly encouraged to configure a K8s Ingress with TLS termination in front of the proxy service.
> See: [https://aws.amazon.com/premiumsupport/knowledge-center/terminate-https-traffic-eks-acm/](https://aws.amazon.com/premiumsupport/knowledge-center/terminate-https-traffic-eks-acm/)
>
> Our EKS script creates a classic ELB for exposing fusion proxy service. In case you need to change this behavior and use [https://github.com/kubernetes-sigs/aws-load-balancer-controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller) instead you can use the following parameters when running the `setup_f5_eks.sh` script:
>
> ```bash theme={"dark"}
> --deploy-alb # Tells the script to deploy an ALB
> ```
>
> By default the `kube-system` namespace is being used for installing the `aws-load-balancer-controller` because pods `priorityClassName` is set to `system-cluster-critical`.
>
> In case you need to deploy an internal ALB you can use the `--internal-alb` option. This will create the nodes in the internal subnets. Fusion will be reachable from an AWS instance located in any of the external subnets on the same VPC. To use an ALB also an ingress with a DNS name is required, you can use the `-h` option to create an ingress with the required DNS name.
>
> Finally, use Route 53 or your DNS provider for creating an A ALIAS DNS record for your DNS name pointing to the ingress ADRESS. You can get the address listing the ingress using the command `kubectl get ing`.
>
> ## Verifying the Fusion Installation
>
> In this section, we provide some tips on how to verify the Fusion installation.
>
> > [!TIP]
> >
> > Check if the Fusion Admin UI is available at `\https://:6764/admin/`.
>
> Let's review some useful kubectl commands.
>
> ### Enhance the K8s Command-line Experience
>
> Here is a list of tools we found useful for improving your command-line experience with Kubernetes:
>
> * krew (kubectl plugin mgr): [https://github.com/kubernetes-sigs/krew/](https://github.com/kubernetes-sigs/krew/)
> * kube-ps1 (show current context on command line prompt): [https://github.com/jonmosco/kube-ps1](https://github.com/jonmosco/kube-ps1)
> * kubectx / kubens (switch between clusters / namespaces): [https://github.com/ahmetb/kubectx](https://github.com/ahmetb/kubectx)
>
> ### Useful kubectl commands
>
> kubectl reference: [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)
>
> Set the namespace for `kubectl` if not using the default:
>
> ```bash theme={"dark"}
> kubectl config set-context --current --namespace=
> ```
>
> **This saves you from having to pass `-n` with every command.**
>
> Get a list of running pods: `k get pods`
>
> Get logs for a pod using a label: `k logs –l app.kubernetes.io/component=query-pipeline`
>
> Get pod deployment spec and details: `k get pods -o yaml`
>
> Get details about a pod events: `k describe po `
>
> Port forward to a specific pod: `k port-forward 8983:8983`
>
> SSH into a pod: `k exec -it -- /bin/bash`
>
> CPU/Memory usage report for pods: `k top pods`
>
> Forcefully kill a pod: `k delete po --force --grace-period 0`
>
> Scale up (or down) a deployment: `k scale deployment.v1.apps/ --replicas=N`
>
> Get a list of pod versions: `k get po -o jsonpath='{..image}'
> tr -s '[[:space:]]' '\n'
> sort
> uniq`
>
> ### Check Fusion Pods and Services
>
> Once the install script completes, you can check that all pods and services are available using:
>
> ```bash theme={"dark"}
> kubectl get pods
> ```
>
> If all goes well, you should see a list of pods similar to:
>
> ```bash wrap theme={"dark"}
> NAME READY STATUS RESTARTS AGE
> seldon-controller-manager-6675874894-qxwrv 1/1 Running 0 8m45s
> f5-admin-ui-74d794f4f8-m5jms 1/1 Running 0 8m45s
> f5-ambassador-fd6b9b5dc-7ghf6 1/1 Running 0 8m43s
> f5-api-gateway-6b9998b9c-tmchk 1/1 Running 0 8m45s
> f5-auth-ui-7565564b4c-rdc74 1/1 Running 0 8m42s
> f5-classic-rest-service-0 1/1 Running 3 8m44s
> f5-devops-ui-77bb867ffb-fbzxd 1/1 Running 0 8m42s
> f5-fusion-admin-78b8f8fc7f-4d7l8 1/1 Running 0 8m42s
> f5-fusion-indexing-599c8d448-xzsvm 1/1 Running 0 8m44s
> f5-insights-665fd9f6fc-g5psw 1/1 Running 0 8m43s
> f5-job-launcher-84dd4c5c96-p8528 1/1 Running 0 8m44s
> f5-job-rest-server-6d44d964b8-xtnxw 1/1 Running 0 8m45s
> f5-logstash-0 1/1 Running 0 8m45s
> f5-ml-model-service-6987dc94c9-9ppp8 2/2 Running 1 8m45s
> f5-monitoring-grafana-5d499dbb58-pzw72 1/1 Running 0 10m
> f5-monitoring-prometheus-kube-state-metrics-54d6678dv9h7h 1/1 Running 0 10m
> f5-monitoring-prometheus-pushgateway-7d65c65b85-vwrwf 1/1 Running 0 10m
> f5-monitoring-prometheus-server-0 2/2 Running 0 10m
> f5-pm-ui-86cbc5bb65-nd2n8 1/1 Running 0 8m44s
> f5-pulsar-bookkeeper-0 1/1 Running 0 8m45s
> f5-pulsar-broker-b56cc776f-56msx 1/1 Running 0 8m45s
> f5-query-pipeline-5d75d7d5f4-l2mdf 1/1 Running 0 8m43s
> f5-connectors-7bb6cfc65f-7wfs2 1/1 Running 0 8m42s
> f5-connectors-backend-987fdc648-dldwv 1/1 Running 0 8m45s
> f5-rules-ui-6b9d55b78f-9hzzj 1/1 Running 0 8m43s
> f5-solr-0 1/1 Running 0 8m44s
> f5-solr-exporter-c4687c785-jsm7x 1/1 Running 0 8m45s
> f5-ui-6cdbcc68c6-rj9cq 1/1 Running 0 8m45s
> f5-webapps-6d6bb9bfd-hm4qx 1/1 Running 0 8m45s
> f5-workflow-controller-7b66679fb7-sjbvp 1/1 Running 0 8m44s
> f5-zookeeper-0 1/1 Running 0 8m45s
> ```
>
> The number of pods per deployment / statefulset will vary based on your cluster size and replicaCount settings in your custom values YAML file.
> Also, don't worry if you see some pods having been restarted as that just means they were too slow to come up and Kubernetes killed and restarted them.
> You do want to see at least one pod running for every service. If a pod is not running after waiting a sufficient amount of time,
> use `kubectl logs ` to see the logs for that pod; to see the logs for previous versions of a pod, use: `kubectl logs -p`.
> You can also look at the actions Kubernetes performed on the pod using `kubectl describe po `.
>
> To see a list of Fusion services, do:
>
> ```bash theme={"dark"}
> kubectl get svc
> ```
>
> For an overview of the various Fusion 5 microservices, see: [Fusion microservices](/docs/5/fusion/reference/microservices).
>
> Once you're ready to build a Fusion cluster for production, please see see more information at [Fusion 5 Survival Guide](/docs/5/fusion/operations/survival-guide/overview).
>
> ### Upgrading with Zero Downtime
>
> One of the most powerful features provided by Kubernetes and a cloud-native microservices architecture is the ability to do a rolling update on a live cluster. Fusion 5 allows customers to upgrade from Fusion 5.x.y to a later 5.x.z version on a live cluster with zero downtime or disruption of service.
>
> When Kubernetes performs a rolling update to an individual microservice, there will be a mix of old and new services in the cluster concurrently (only briefly in most cases) and requests from other services will be routed to both versions. Consequently, Lucidworks ensures all changes we make to our service do not break the API interface exposed to other services in the same 5.x line of releases. We also ensure stored configuration remains compatible in the same 5.x release line.
>
> Lucidworks releases minor updates to individual services frequently, so our customers can pull in those upgrades using Helm at their discretion.
>
> To upgrade your cluster at any time, use the `--upgrade` option with our setup scripts in this repo.
>
> The scripts in this repo automatically pull in the latest chart updates from our Helm repository and deploy any updates needed by doing a diff of your current installation and the latest release from Lucidworks.
> To see what would be upgraded, you can pass the `--dry-run` option to the script.
>
> ### Grafana Dashboards
>
> Get the initial Grafana password from a K8s secret by doing:
>
> ```bash wrap theme={"dark"}
> kubectl get secret --namespace "${NAMESPACE}" ${RELEASE}-monitoring-grafana \
> -o jsonpath="{.data.admin-password}"
> base64 --decode ; echo
> ```
>
> With Grafana, you can either setup a temporary port-forward to a Grafana pod or expose Grafana on an external IP using a K8s LoadBalancer.
> To define a LoadBalancer, do (replace \$ with your Helm release label):
>
> ```bash wrap theme={"dark"}
> kubectl expose deployment ${RELEASE}-monitoring-grafana --type=LoadBalancer --name=grafana --port=3000 --target-port=3000
> ```
>
> You can use `kubectl get services --namespace ` to determine when the load balancer is setup and its IP address. Direct your browser to `http://:3000` and enter the username `admin@localhost` and the password that was returned in the previous step.
>
> This will log you into the application. It is recommended that you create another administrative user with a more desirable password.
>
> The dashboards and datasoure will be setup for you in grafana, simply navigate to `Dashboards` -> `Manage` to view the available dashboards
>
> ## Configure IAM roles for the service account
>
> Configuring IAM roles lets you utilize the Amazon Web Services Security Token Service (AWS STS) for short-term authentication credentials to access services like the Amazon S3 simple storage service.
>
> To configure IAM roles, your user account must be granted `admin` permissions or `IAM:FullAccess`. Complete the following steps:
>
> 1. To create the OpenID Connect (OIDC) provider, run the following command:
> ```bash wrap theme={"dark"}
> eksctl utils associate-iam-oidc-provider --cluster cluster_name --approve
> ```
> 2. To create an IAM role for the service account associated with the plugin-pod, run the following command:
> ```bash wrap theme={"dark"}
> eksctl create iamserviceaccount --name f5-connector-plugin --namespace default --cluster cluster_name --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess --approve --override-existing-serviceaccounts
> ```
> This command:
> * Creates an IAM role and attaches the target policy.
> * Updates the existing Kubernetes `f5-connector-plugin` service account and annotates it with the IAM role.
> * Uses the existing `policy/AmazonS3ReadOnlyAccess` policy.
>
> If the IAM role was already created without the command, and you want to associate the service account, run the following command:
>
> ```bash wrap theme={"dark"}
> kubectl annotate serviceaccount -n default f5-connector-plugin eks.amazonaws.com/role-arn=arn:aws:iam::411271863668:role/FUS_ROLE --overwrite=true
> ```
>
> > [!NOTE]
> >
> > To utilize this feature, create a data source with the settings in **S3 Authentication Settings > AWS Instance Credentials Authentication Settings**. For detailed installation information, see [AWS S3 Pro connector](/docs/fusion-connectors/connectors/amazon-aws-s3-pro).
>
> For more information, see:
>
> * [Welcome to the AWS Security Token Service API Reference](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)
> * [Temporary security credentials in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)
> * [IAM roles for service accounts](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html)
> * [What is Amazon EKS?](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html)
> * [Fine-grained IAM roles for service accounts](https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts)
>
> ## More deployment options
>
> * How to deploy Fusion 5 in Google Kubernetes Engine
> * How to deploy Fusion 5 in Azure Kubernetes Service
> * How to deploy Fusion 5 on other Kubernetes platforms
>
> ## Learn more
>
> > **[Deploying Fusion 5](https://academy.lucidworks.com/deploying-fusion-5)**
> >
> > The course for **Deploying Fusion 5** focuses on the prerequisite software needed to deploy Fusion, the necessary setup steps, and the physical act of deployment.
> **Deploy Fusion 5 on Google Kubernetes Engine (GKE)**
>
> Fusion supports deployment on Google Kubernetes Engine (GKE). This topic explains how to deploy a Fusion cluster on GKE using the [`setup_f5_gke.sh` script](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_gke.sh) in the [`fusion-cloud-native`](https://github.com/lucidworks/fusion-cloud-native) repository.
>
> ## Prerequisites
>
> This section covers prerequisites and background knowledge needed to help you understand the structure of this document and how the Fusion installation process works with Kubernetes.
>
> ### Release Name and Namespace
>
> Before installing Fusion, you need to choose a [https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) Kubernetes namespace to install Fusion into.
> Think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster *in separate namespaces*.
> However, please *do not* install more than one Fusion release in the same namespace.
>
> > [!NOTE]
> >
> > All Fusion services must run in the same namespace, i.e. you should not try to split a Fusion cluster across multiple namespaces.\_\_
>
> Use a short name for the namespace, containing only letters, digits, or dashes (no dots or underscores). The setup scripts in this repo use the namespace for the Helm release name by default.
>
> ### Install Helm
>
> Helm is a package manager for Kubernetes that helps you install and manage applications on your Kubernetes cluster.
> Regardless of which Kubernetes platform you're using, you need to install *`helm`* as it is required to install Fusion for any K8s platform.
> On MacOS, you can do:
>
> ```bash theme={"dark"}
> brew install kubernetes-helm
> ```
>
> If you already have helm installed, make sure you're using the latest version:
>
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
>
> For other OS, please refer to the Helm installation docs: [https://helm.sh/docs/using\_helm/](https://helm.sh/docs/using_helm/)
>
> The Fusion helm chart requires that helm is greater than version `3.0.0`; check your Helm version by running `helm version --short`.
>
> #### Helm User Permissions
>
> If you require that fusion is installed by a user with minimal permissions, instead of an admin user, then the role and cluster role that will have to be assigned to the user within the namespace that you wish to install fusion in are documented in the `install-roles` directory.
>
> > [!NOTE]
> >
> > When working with Kubernetes on the command-line, it's useful to create a shell alias for `kubectl`, e.g.:
> >
> > ```bash theme={"dark"}
> > alias k=kubectl
> > ```
>
> To use these role in a cluster, as an admin user first create the namespace that you wish to install fusion into:
>
> ```bash theme={"dark"}
> k create namespace fusion-namespace
> ```
>
> Apply the `role.yaml` and `cluster-role.yaml` files to that namespace
>
> ```bash theme={"dark"}
> k apply -f cluster-role.yaml
> k config set-context --current --namespace=$NAMESPACE
> k apply -f role.yaml
> ```
>
> Then bind the rolebinding and clusterolebinding to the install user:
>
> ```bash wrap theme={"dark"}
> k create --namespace fusion-namespace rolebinding fusion-install-rolebinding --role fusion-installer --user
> k create clusterrolebinding fusion-install-rolebinding --clusterrole fusion-installer --user
> ```
>
> You will then be able to run the `helm install` command as the ``
>
> ### Clone fusion-cloud-native from GitHub
>
> You should clone this repo from github as you'll need to run the scripts on your local workstation:
>
> ```bash theme={"dark"}
> git clone https://github.com/lucidworks/fusion-cloud-native.git
> ```
>
> You should get into the habit of pulling this repo for the latest changes before performing any maintenance operations on your Fusion cluster to ensure you have the latest updates to the scripts.
>
> ```bash theme={"dark"}
> cd fusion-cloud-native
> git pull
> ```
>
> Cloning the github repo is preferred so that you can pull in updates to the scripts, but if you are not a git user, then you can download the project: [https://github.com/lucidworks/fusion-cloud-native/archive/master.zip](https://github.com/lucidworks/fusion-cloud-native/archive/master.zip).
> Once downloaded, extract the zip and cd into the `fusion-cloud-native-master` directory.
>
> ## Prerequisites
>
> This section covers prerequisites and background knowledge needed to help you understand the structure of this document and how the Fusion installation process works with Kubernetes.
>
> ### Release Name and Namespace
>
> Before installing Fusion, you need to choose a [https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) Kubernetes namespace to install Fusion into.
> Think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster *in separate namespaces*.
> However, please *do not* install more than one Fusion release in the same namespace.
>
> > [!NOTE]
> >
> > All Fusion services must run in the same namespace, i.e. you should not try to split a Fusion cluster across multiple namespaces.\_\_
>
> Use a short name for the namespace, containing only letters, digits, or dashes (no dots or underscores). The setup scripts in this repo use the namespace for the Helm release name by default.
>
> ### Install Helm
>
> Helm is a package manager for Kubernetes that helps you install and manage applications on your Kubernetes cluster.
> Regardless of which Kubernetes platform you're using, you need to install *`helm`* as it is required to install Fusion for any K8s platform.
> On MacOS, you can do:
>
> ```bash theme={"dark"}
> brew install kubernetes-helm
> ```
>
> If you already have helm installed, make sure you're using the latest version:
>
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
>
> For other OS, please refer to the Helm installation docs: [https://helm.sh/docs/using\_helm/](https://helm.sh/docs/using_helm/)
>
> The Fusion helm chart requires that helm is greater than version `3.0.0`; check your Helm version by running `helm version --short`.
>
> #### Helm User Permissions
>
> If you require that fusion is installed by a user with minimal permissions, instead of an admin user, then the role and cluster role that will have to be assigned to the user within the namespace that you wish to install fusion in are documented in the `install-roles` directory.
>
> > [!NOTE]
> >
> > When working with Kubernetes on the command-line, it's useful to create a shell alias for `kubectl`, e.g.:
> >
> > ```bash theme={"dark"}
> > alias k=kubectl
> > ```
>
> To use these role in a cluster, as an admin user first create the namespace that you wish to install fusion into:
>
> ```bash theme={"dark"}
> k create namespace fusion-namespace
> ```
>
> Apply the `role.yaml` and `cluster-role.yaml` files to that namespace
>
> ```bash theme={"dark"}
> k apply -f cluster-role.yaml
> k config set-context --current --namespace=$NAMESPACE
> k apply -f role.yaml
> ```
>
> Then bind the rolebinding and clusterolebinding to the install user:
>
> ```bash wrap theme={"dark"}
> k create --namespace fusion-namespace rolebinding fusion-install-rolebinding --role fusion-installer --user
> k create clusterrolebinding fusion-install-rolebinding --clusterrole fusion-installer --user
> ```
>
> You will then be able to run the `helm install` command as the ``
>
> ### Clone fusion-cloud-native from GitHub
>
> You should clone this repo from github as you'll need to run the scripts on your local workstation:
>
> ```bash theme={"dark"}
> git clone https://github.com/lucidworks/fusion-cloud-native.git
> ```
>
> You should get into the habit of pulling this repo for the latest changes before performing any maintenance operations on your Fusion cluster to ensure you have the latest updates to the scripts.
>
> ```bash theme={"dark"}
> cd fusion-cloud-native
> git pull
> ```
>
> Cloning the github repo is preferred so that you can pull in updates to the scripts, but if you are not a git user, then you can download the project: [https://github.com/lucidworks/fusion-cloud-native/archive/master.zip](https://github.com/lucidworks/fusion-cloud-native/archive/master.zip).
> Once downloaded, extract the zip and cd into the `fusion-cloud-native-master` directory.
>
> The [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_gke.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_gke.sh) `setup_f5_gke.sh` script provided in this repo is strictly optional.
> The script is mainly to help those new to Kubernetes and/or Fusion get started quickly.
> If you're already familiar with K8s, Helm, and GKE, then you can skip the script and just use Helm directly to install Fusion into an existing cluster or one you create yourself using the process described `<>`.
>
> ### Set up the Google Cloud SDK (one time only)
>
> If you've already installed the `gcloud` command-line tools, you can skip to `<>`.
>
> These steps set up your local Google Cloud SDK environment so that you're ready to use the command-line tools to manage your Fusion deployment.
>
> Usually, you only need to perform these setup steps once. After that, you're ready to create a cluster.
>
> For a nice getting started tutorial for GKE, see: [https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster](https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster)
>
> How to set up the Google Cloud SDK:
>
> 1. [https://console.cloud.google.com/apis/library/container.googleapis.com?q=kubernetes%20engine](https://console.cloud.google.com/apis/library/container.googleapis.com?q=kubernetes%20engine)
> 2. Log in to Google Cloud: `gcloud auth login`
> 3. Set up the Google Cloud SDK:
> 1. `gcloud config set compute/zone `
> If you are working with regional clusters instead of zone clusters, use `gcloud config set compute/region ` instead.
> 2. `gcloud config set core/account `
> 3. *New GKE projects only:* `gcloud projects create `
> If you have already created a project, for example in [https://console.cloud.google.com/](https://console.cloud.google.com/), then skip to the next step.
> 4. `gcloud config set project `
>
> Make sure you install the Kubernetes command-line tool `kubectl` using:
>
> ```bash theme={"dark"}
> gcloud components install kubectl
> gcloud components update
> ```
>
> ### Create a single-node demo cluster
>
> Run the [https://github.com/lucidworks/fusion-cloud-native/blob/master/setup\_f5\_gke.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_gke.sh) `setup_f5_gke.sh` script to install Fusion 5.x in a GKE cluster. To create a new, single-node *demo* cluster and install Fusion, simply do:
>
> ```bash theme={"dark"}
> ./setup_f5_gke.sh -c -p --create demo
> ```
>
> Use the `--help` option to see script usage. If you want the script to create a cluster for you, then you need to pass the `--create` option with either `demo` or `multi_az`. If you don't want the script to create a cluster, then you need to create a cluster before running the script and simply pass the name of the existing cluster using the `-c` parameter.
>
> If you pass `--create demo` to the script, then we create a single node GKE cluster (defaults to using `n1-standard-8` node type). The minimum node type you'll need for a 1 node cluster is an `n1-standard-8` (on GKE) which has 8 CPU and 30 GB of memory. This is cutting it very close in terms of resources as you also need to host all of the Kubernetes system pods on this same node. Obviously, this works for kicking the tires on Fusion 5.1 but is not sufficient for production workloads.
>
> You can change the instance type using the `-i` parameter; see: [https://cloud.google.com/compute/docs/regions-zones/#available](https://cloud.google.com/compute/docs/regions-zones/#available) for a list of which machine types are available in your desired region.
>
> > [!NOTE]
> >
> > If not provided the script generates a custom values file named `gke___fusion_values.yaml` which you can use to customize the Fusion chart.\_\_
>
> \#WARNING# If using Helm V2, the `setup_f5_gke.sh` script installs Helm's `tiller` component into your GKE cluster with the cluster admin role. If you don't want this, then please upgrade to Helm v3.
>
> If you see an error similar to the following, then wait a few seconds and try running the `setup_f5_gke.sh` script again with the same arguments as this is usually a transient issue:
>
> ```bash wrap theme={"dark"}
> Error: could not get apiVersions from Kubernetes: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
> ```
>
> After running the `setup_f5_gke.sh` script, proceed to the `<>` section below.
>
> When you're ready to deploy Fusion to a production-like environment, see more information at [Fusion 5 Survival Guide](/docs/5/fusion/operations/survival-guide/overview).
>
> ### Create a three-node regional cluster to withstand a zone outage
>
> With a three-node regional cluster, nodes are deployed across three separate availability zones.
>
> ```bash wrap theme={"dark"}
> ./setup_f5_gke.sh -c -p -n --region --create multi_az
> ```
>
> * `` value should be the name of a non-existent cluster; the script will create the new cluster.
> * `` must match the name of an existing project in GKE. Run `gcloud config get-value project` to get this value.
> * `` Kubernetes namespace to install Fusion into, defaults to `default` with release `f5`
> * `` value should be the name of a GKE region, defaults to `us-west1`. Run `gcloud config get-value compute/zone` to get this value.
>
> In this configuration, Kubernetes deploys a ZooKeeper and Solr pod on each of the three nodes, which allows the cluster to retain ZK quorum and remain operational after losing one node, such as during an outage in one availability zone.
>
> When running in a multi-zone cluster, each Solr node has the `solr_zone` system property set to the zone it is running in, such as `-Dsolr_zone=us-west1-a`.
>
> After running the `setup_f5_gke.sh` script, proceed to the `<>` section below.
>
> When you're ready to deploy Fusion to a production-like environment, see more information at [Fusion 5 Survival Guide](/docs/5/fusion/operations/survival-guide/overview).
>
> #### GKE Ingress and TLS
>
> The Fusion proxy service provides authentication and serves as an API gateway for accessing all other Fusion services.
> It's typical to use an Ingress for TLS termination in front of the proxy service.
>
> The `setup_f5_gke.sh` supports creating an Ingress with a TLS cert for a domain you own by passing: `-t -h `
>
> After the script runs, you need to create an A record in GCP's DNS service to map your domain name to the Ingress IP. Once this occurs, our script setup uses [https://letsencrypt.org/](https://letsencrypt.org/) to issue a TLS cert for your Ingress.
>
> To see the status of the Let's Encrypt issued certificate, do:
>
> ```bash theme={"dark"}
> kubectl get managedcertificates -n -o yaml
> ```
>
> Please refer to the Kubernetes documentation on configuring an Ingress for GKE: [https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer](https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer)
>
> > [!NOTE]
> >
> > The GCP Ingress defaults to a 30 second timeout, which can lead to false negatives for long running requests such as importing apps. To configure the timeout for the backend in kubernetes:
>
> Create a BackendConfig object in your namespace:
>
> ```yaml theme={"dark"}
> ---
> apiVersion: cloud.google.com/v1beta1
> kind: BackendConfig
> metadata:
> name: backend_config_name
> spec:
> timeoutSec: 120
> connectionDraining:
> drainingTimeoutSec: 60
> ```
>
> Then make sure that the following entries are in the right place in your values.yaml file:
>
> ```yaml theme={"dark"}
> api-gateway:
> service:
> annotations:
> beta.cloud.google.com/backend-config: '{"ports": {"6764":"backend_config_name"}}'
> ```
>
> and upgrade your release to apply the configuration changes
>
> #### Ingresses and externalTrafficPolicy
>
> When running a fusion cluster behind an externally controlled LoadBalancer it can be advantageous
> to configure the `externalTrafficPolicy` of the `proxy` service to `Local`. This preserves the client
> source IP and avoids a second hop for LoadBalancer and NodePort type services, but risks potentially
> imbalanced traffic spreading. Although when running in a cluster with a dedicated pool for spark jobs
> that can scale up and down freely it can prevent unwanted request failures. This behaviour can be
> altered with the `api-gateway.service.externalTrafficPolicy` value, which is set to `Local` if the example values
> file is used.
>
> **You must use `externalTrafficPolicy`=`Local` for the Trusted HTTP Realm to work correctly.**
>
> If you are already using a custom 'values.yaml' file, create an entry for `externalTrafficPolicy` under `api-gateway` service.
>
> ```yaml theme={"dark"}
> api-gateway:
> service:
> externalTrafficPolicy: Local
> ```
>
> #### Considerations when using the nginx ingress controller
>
> If you are using the `nginx` ingress controller to fulfil your ingress definitions there are a couple
> of options that are recommended to be set in the configmap:
>
> ```bash wrap theme={"dark"}
> enable-underscores-in-headers: "true" # Fusion can return some headers that have underscores, these have to be explicitly enabled in nginx
> proxy-body-size: "0" # By default nginx places a maximum size on request bodies, either increase as needed or disable by setting to 0
> proxy-read-timeout: "300" # Increases the timeout for potential slow queries.
> ```
>
> #### Custom values
>
> There are some example values files that can be used as a starting point for
> resources, affinity and replica count configuration in the `example-values` folder.
> These can be passed to the install script using the `--values` option, for example:
>
> ```bash wrap theme={"dark"}
> ./setup_f5_gke.sh -c -p -r -n \
> --values example-values/affinity.yaml --values example-values/resources.yaml --values example-values/replicas.yaml
> ```
>
> The `--values` option can be passed multiple times, if the same configuration property is contained within multiple `values` files then the values from the latest file passed as a `--values` option are used.
>
> ##### Connectors custom values
>
> If you are using Fusion 5.9 or later, you can specify resources and replica count per connector. This allows you to set different resource limits for each connector. If you do not set custom values for a connector, that connector uses the default values.
>
> Set each connector's resource values in the `connector-plugin` section under `pluginValues`. The `pluginValues` section is a list of plugins and its resources. The following sample shows an example.
>
> ```yaml theme={"dark"}
> pluginValues:
> - id: "plugin-id" <1>
> resources: <2>
> limits:
> cpu: "2"
> memory: "3Gi"
> requests:
> cpu: "250m"
> memory: "2Gi"
> replicaCount: 1 <3>
> ```
>
> * `<1>` The plugin ID. The plugin ID must match the plugin ID on the plugin ZIP file. without the `lucidworks.` prefix. For example, if the plugin ID on the plugin ZIP file is `lucidworks.sharepoint-optimized`, the plugin ID is `sharepoint-optimized`.
>
> * `<2>` The resources settings. You may specify the limits, the requests, and the CPU and memory for each.
>
> * `<3>` The number of replicas per connector. This value is 1 by default.
>
> > [!NOTE]
> >
> > After editing the `connector-plugin` section, you must reinstall the affected connector.
>
> #### Upgrades and Ingress
>
> > [!NOTE]
> >
> > If you used the `-t -h ` options when installing your cluster, our script created an additional values yaml file named `tls-values.yaml`.
>
> To make things easier for you when upgrading, you should add the settings from this file into your main custom values yaml file, e.g.:
>
> ```yaml theme={"dark"}
> api-gateway:
> service:
> type: "NodePort"
> ingress:
> enabled: true
> host: ""
> tls:
> enabled: true
> annotations:
> "networking.gke.io/managed-certificates": "-managed-certificate"
> "kubernetes.io/ingress.class": "gce"
> ```
>
> This way you don't have to remember to pass the additional `tls-values.yaml` file when upgrading.
>
> ## Verifying the Fusion Installation
>
> In this section, we provide some tips on how to verify the Fusion installation.
>
> > [!TIP]
> >
> > Check if the Fusion Admin UI is available at `\https://:6764/admin/`.
>
> Let's review some useful kubectl commands.
>
> ### Enhance the K8s Command-line Experience
>
> Here is a list of tools we found useful for improving your command-line experience with Kubernetes:
>
> * krew (kubectl plugin mgr): [https://github.com/kubernetes-sigs/krew/](https://github.com/kubernetes-sigs/krew/)
> * kube-ps1 (show current context on command line prompt): [https://github.com/jonmosco/kube-ps1](https://github.com/jonmosco/kube-ps1)
> * kubectx / kubens (switch between clusters / namespaces): [https://github.com/ahmetb/kubectx](https://github.com/ahmetb/kubectx)
>
> ### Useful kubectl commands
>
> kubectl reference: [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)
>
> Set the namespace for `kubectl` if not using the default:
>
> ```bash theme={"dark"}
> kubectl config set-context --current --namespace=
> ```
>
> **This saves you from having to pass `-n` with every command.**
>
> Get a list of running pods: `k get pods`
>
> Get logs for a pod using a label: `k logs –l app.kubernetes.io/component=query-pipeline`
>
> Get pod deployment spec and details: `k get pods -o yaml`
>
> Get details about a pod events: `k describe po `
>
> Port forward to a specific pod: `k port-forward 8983:8983`
>
> SSH into a pod: `k exec -it -- /bin/bash`
>
> CPU/Memory usage report for pods: `k top pods`
>
> Forcefully kill a pod: `k delete po --force --grace-period 0`
>
> Scale up (or down) a deployment: `k scale deployment.v1.apps/ --replicas=N`
>
> Get a list of pod versions: `k get po -o jsonpath='{..image}' | tr -s '[[:space:]]' '\n' | sort | uniq`
>
> ### Check Fusion Pods and Services
>
> Once the install script completes, you can check that all pods and services are available using:
>
> ```bash theme={"dark"}
> kubectl get pods
> ```
>
> If all goes well, you should see a list of pods similar to:
>
> ```bash wrap theme={"dark"}
> NAME READY STATUS RESTARTS AGE
> seldon-controller-manager-6675874894-qxwrv 1/1 Running 0 8m45s
> f5-admin-ui-74d794f4f8-m5jms 1/1 Running 0 8m45s
> f5-ambassador-fd6b9b5dc-7ghf6 1/1 Running 0 8m43s
> f5-api-gateway-6b9998b9c-tmchk 1/1 Running 0 8m45s
> f5-auth-ui-7565564b4c-rdc74 1/1 Running 0 8m42s
> f5-classic-rest-service-0 1/1 Running 3 8m44s
> f5-devops-ui-77bb867ffb-fbzxd 1/1 Running 0 8m42s
> f5-fusion-admin-78b8f8fc7f-4d7l8 1/1 Running 0 8m42s
> f5-fusion-indexing-599c8d448-xzsvm 1/1 Running 0 8m44s
> f5-insights-665fd9f6fc-g5psw 1/1 Running 0 8m43s
> f5-job-launcher-84dd4c5c96-p8528 1/1 Running 0 8m44s
> f5-job-rest-server-6d44d964b8-xtnxw 1/1 Running 0 8m45s
> f5-logstash-0 1/1 Running 0 8m45s
> f5-ml-model-service-6987dc94c9-9ppp8 2/2 Running 1 8m45s
> f5-monitoring-grafana-5d499dbb58-pzw72 1/1 Running 0 10m
> f5-monitoring-prometheus-kube-state-metrics-54d6678dv9h7h 1/1 Running 0 10m
> f5-monitoring-prometheus-pushgateway-7d65c65b85-vwrwf 1/1 Running 0 10m
> f5-monitoring-prometheus-server-0 2/2 Running 0 10m
> f5-pm-ui-86cbc5bb65-nd2n8 1/1 Running 0 8m44s
> f5-pulsar-bookkeeper-0 1/1 Running 0 8m45s
> f5-pulsar-broker-b56cc776f-56msx 1/1 Running 0 8m45s
> f5-query-pipeline-5d75d7d5f4-l2mdf 1/1 Running 0 8m43s
> f5-connectors-7bb6cfc65f-7wfs2 1/1 Running 0 8m42s
> f5-connectors-backend-987fdc648-dldwv 1/1 Running 0 8m45s
> f5-rules-ui-6b9d55b78f-9hzzj 1/1 Running 0 8m43s
> f5-solr-0 1/1 Running 0 8m44s
> f5-solr-exporter-c4687c785-jsm7x 1/1 Running 0 8m45s
> f5-ui-6cdbcc68c6-rj9cq 1/1 Running 0 8m45s
> f5-webapps-6d6bb9bfd-hm4qx 1/1 Running 0 8m45s
> f5-workflow-controller-7b66679fb7-sjbvp 1/1 Running 0 8m44s
> f5-zookeeper-0 1/1 Running 0 8m45s
> ```
>
> The number of pods per deployment / statefulset will vary based on your cluster size and replicaCount settings in your custom values YAML file.
> Also, don't worry if you see some pods having been restarted as that just means they were too slow to come up and Kubernetes killed and restarted them.
> You do want to see at least one pod running for every service. If a pod is not running after waiting a sufficient amount of time,
> use `kubectl logs ` to see the logs for that pod; to see the logs for previous versions of a pod, use: `kubectl logs -p`.
> You can also look at the actions Kubernetes performed on the pod using `kubectl describe po `.
>
> To see a list of Fusion services, do:
>
> ```bash theme={"dark"}
> kubectl get svc
> ```
>
> For an overview of the various Fusion 5 microservices, see: [Fusion microservices](/docs/5/fusion/reference/microservices).
>
> Once you're ready to build a Fusion cluster for production, please see see more information at [Fusion 5 Survival Guide](/docs/5/fusion/operations/survival-guide/overview).
>
> ### Upgrading with Zero Downtime
>
> One of the most powerful features provided by Kubernetes and a cloud-native microservices architecture is the ability to do a rolling update on a live cluster. Fusion 5 allows customers to upgrade from Fusion 5.x.y to a later 5.x.z version on a live cluster with zero downtime or disruption of service.
>
> When Kubernetes performs a rolling update to an individual microservice, there will be a mix of old and new services in the cluster concurrently (only briefly in most cases) and requests from other services will be routed to both versions. Consequently, Lucidworks ensures all changes we make to our service do not break the API interface exposed to other services in the same 5.x line of releases. We also ensure stored configuration remains compatible in the same 5.x release line.
>
> Lucidworks releases minor updates to individual services frequently, so our customers can pull in those upgrades using Helm at their discretion.
>
> To upgrade your cluster at any time, use the `--upgrade` option with our setup scripts in this repo.
>
> The scripts in this repo automatically pull in the latest chart updates from our Helm repository and deploy any updates needed by doing a diff of your current installation and the latest release from Lucidworks.
> To see what would be upgraded, you can pass the `--dry-run` option to the script.
>
> ### Grafana Dashboards
>
> Get the initial Grafana password from a K8s secret by doing:
>
> ```bash wrap theme={"dark"}
> kubectl get secret --namespace "${NAMESPACE}" ${RELEASE}-monitoring-grafana \
> -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
> ```
>
> With Grafana, you can either setup a temporary port-forward to a Grafana pod or expose Grafana on an external IP using a K8s LoadBalancer.
> To define a LoadBalancer, do (replace \$ with your Helm release label):
>
> ```bash wrap theme={"dark"}
> kubectl expose deployment ${RELEASE}-monitoring-grafana --type=LoadBalancer --name=grafana --port=3000 --target-port=3000
> ```
>
> You can use `kubectl get services --namespace ` to determine when the load balancer is setup and its IP address. Direct your browser to `http://:3000` and enter the username `admin@localhost` and the password that was returned in the previous step.
>
> This will log you into the application. It is recommended that you create another administrative user with a more desirable password.
>
> The dashboards and datasoure will be setup for you in grafana, simply navigate to `Dashboards` -> `Manage` to view the available dashboards
>
> ## More deployment options
>
> * How to deploy Fusion 5 on Amazon Elastic Kubernetes Service
> * How to deploy Fusion 5 on Azure Kubernetes Service
> * How to deploy Fusion on 5 other Kubernetes platforms
>
> ## Learn more
>
> > **[Deploying Fusion 5](https://academy.lucidworks.com/deploying-fusion-5)**
> >
> > The course for **Deploying Fusion 5** focuses on the prerequisite software needed to deploy Fusion, the necessary setup steps, and the physical act of deployment.
Looking to upgrade your Fusion instance? See **Fusion 5 Upgrades**.
> **Fusion 5 Upgrades**
>
> This guide describes how to perform Fusion 5 upgrades.
>
> > [!NOTE]
> >
> > Before upgrading, be aware of changes by checking for [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals) between versions.
>
> Lucidworks recommends upgrading to the next minor version only. For example, you should upgrade from Fusion 5.6.1 to Fusion 5.7.1 before upgrading to Fusion 5.8.0.
>
> The [general upgrade process](#general-upgrade-process) is described in this article. However, the specific upgrade procedures may vary depending on your upgrade path. For the most accurate instructions, please refer to the upgrade article specific to your upgrade.
>
> ## General upgrade process
>
> Fusion natively supports deployments on supported Kubernetes platforms, including AKS, EKS, and GKE.
>
> Fusion includes an upgrade script for AKS, EKS, and GKE. This script is not generated for other Kubernetes deployments.
>
> Upgrades differ from platform to platform. See below for more information about upgrading on your platform of choice.
>
> Whenever you upgrade Fusion, you must also update your [remote connectors](/docs/fusion-connectors/developers/remote-v2-connectors), if you are running any.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> ### Natively supported deployment upgrades
>
> | Deployment type | Platform |
> | - | - |
> | **Azure Kubernetes Service (AKS)** | `aks` |
> | **Amazon Elastic Kubernetes Service (EKS)** | `eks` |
> | **Google Kubernetes Engine (GKE)** | `gke` |
>
> Fusion includes upgrade scripts for natively supported deployment types. To upgrade:
>
> 1. Open the `___upgrade_fusion.sh` upgrade script file for editing.
> 2. Update the `CHART_VERSION` to your target Fusion version, and save your changes.
> 3. Run the `___upgrade_fusion.sh` script. The `` value is the same as your namespace, unless you overrode the default value using the `-r` option.
>
> After running the upgrade, use `kubectl get pods` to see the changes applied to your cluster. It may take several minutes to perform the upgrade, as new Docker images are pulled from DockerHub. To see the versions of running pods, do:
>
> ```
> kubectl get po -o jsonpath='{..image}' | tr -s '[[:space:]]' '\n' | sort | uniq
> ```
>
> ### Other Kubernetes deployment upgrades
>
> To update an existing installation, do:
>
> ```
> RELEASE=f5
> NAMESPACE=default
> helm repo update
> helm upgrade ${RELEASE} "lucidworks/fusion" --namespace "${NAMESPACE}" --values "${MY_VALUES}"
> ```
>
> Except for ZooKeeper, all K8s deployments and statefulsets use a `RollingUpdate` update policy:
>
> ```yaml theme={"dark"}
> strategy:
> rollingUpdate:
> maxSurge: 25%
> maxUnavailable: 25%
> type: RollingUpdate
> ```
>
> ZooKeeper instances use `OnDelete` to avoid changing critical stateful pods in the Fusion deployment. To apply changes to Zookeeper after performing the upgrade (uncommon), you need to manually delete the pods. For example:
>
> ```
> kubectl delete pod f5-zookeeper-0
> ```
>
> > [!TIP]
> >
> > Delete one pod at a time. Verify the new pod is healthy and serving traffic, before deleting the next healthy pod.
>
> You can also set the `updateStrategy` under the `zookeeper` section in your `"${MY_VALUES}"` file:
>
> ```yaml theme={"dark"}
> solr:
> ...
> zookeeper:
> updateStrategy:
> type: "RollingUpdate"
> ```
>
> #### Upgrades with Helm v3
>
> One of the most powerful features provided by Kubernetes and a cloud-native microservices architecture is the ability to do a rolling update on a live cluster. For example, Fusion 5 allows customers to upgrade from Fusion 5.1.0 to a later 5.x.y version on a live cluster with zero downtime or disruption of service.
>
> When Kubernetes performs a rolling update to an individual microservice, there is a mix of old and new services in the cluster. Requests from other services route to both versions.
>
> > [!NOTE]
> >
> > Lucidworks ensures all changes we make to our service do not break the API interface exposed to other services in the same minor release version (5.x). We also ensure that the stored configuration remains compatible in the same minor release version.
>
> Lucidworks releases minor updates to individual services frequently. Pull in those upgrades using Helm at your discretion.
>
> **How to upgrade Fusion**
>
> 1. Clone the [**fusion-cloud-native** repo](https://github.com/lucidworks/fusion-cloud-native), if you haven’t already.
> 2. Locate the `setup_f5_.sh` script that matches your Kubernetes platform.
> 3. Run the script with the `--upgrade` option.
>
> > [!TIP]
> >
> > To see what would be upgraded, pass the `--dry-run` option to the script.
>
> The scripts in the **fusion-cloud-native** repo automatically pull in the latest chart updates from our Helm repository and deploy any updates needed by doing a diff of your current installation and the latest release from Lucidworks.
>
> #### Helm upgrade script
>
> Once you deploy a working cluster, use the upgrade script created by the `customize_fusion_values.sh` script. The upgrade script hard-codes the parameters and eases the need to remember which parameters to pass to the script. This is helpful when working with multiple K8s clusters. Make sure you check the script into version control alongside your custom values YAML files.
>
> Whenever you change the custom values YAML files for your cluster, you need to run the upgrade script to apply the changes. The script calls `helm upgrade` with the correct parameters and `--values` options.
>
> > [!WARNING]
> >
> > If you run `helm upgrade` without passing the custom values YAML files, the deployment will revert to using chart defaults, which you never want to do.
>
> > [!TIP]
> >
> > The script assumes your `kubeconfig` is pointing to the correct cluster and you’re using Heml v3. If not, the upgrade fails. Select the correct `kubeconfig` before running the script.
## Important reference information
Our reference section includes information on [Fusion’s API](/docs/5/fusion/dev-portal/rest-apis), [index pipelines stages](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/overview), [query pipelines stages](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/overview), [connections](/docs/fusion-connectors/connectors/overview), and more.
See [Reference](/docs/5/fusion/reference/overview) for complete reference information.
## LucidAcademy
Lucidworks offers free training to help you get started with Fusion. Visit the [LucidAcademy](https://academy.lucidworks.com) and select classes such as **Working With Data** and **Query Fine-Tuning** to learn how Fusion ingests, indexes, and queries data.
## Key Improvements over Fusion 4
Fusion 5 offers the following upgrade benefits over Fusion 4:
* [Predictive Merchandiser](/docs/5/fusion/getting-data-out/curating-your-search-experience/predictive-merchandiser/overview): AI-powered visual tool including abilities to pin, boost, bury, or block products, rewrite and fix misspellings, and interpret synonyms.
* Advanced [Machine Learning](/docs/5/fusion/intro/machine-learning/overview) models and jobs.
* [Semantic Vector Search](/docs/5/fusion/intro/machine-learning/vector-search) to improve product discovery by influencing recall, relevancy, and precision.
* [Signals](/docs/5/fusion/getting-data-out/query-enhancement/signals/overview) for automatic self-tuning relevancy.
* Goes beyond search for personalized content discovery: Browse pages, Recommendations, Chatbots, AB Testing, Analytics, and more.
# Fusion 5.17.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.17/5.17.0-release-notes
Released on April 15, 2026, this is a [minor release](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#minor-release-support-policy) that focuses on AI-driven search integration through MCP, event-driven autoscaling with KEDA, and enhanced Dynamic Index hierarchical support.
Upgrading to the latest version of Fusion offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle) policy.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Lucidworks MCP for agentic search
Fusion 5.17 introduces support for the Model Context Protocol (MCP), an open standard that enables AI assistants to search your Fusion data.
With the new MCP server, you can connect Claude Code to your Fusion instance using a standardized protocol.
**Intro to Lucidworks MCP**
**Admin setup**
**Lucidworks MCP in Claude**
**Interactive walkthrough**
[MCP Server](https://app.supademo.com/embed/cmnp8dkls7ydoaburuww74ac0?embed_v=2\&utm_source=embed)
The MCP server integrates with Fusion's existing security controls, query pipelines, and multi-tenant architecture, allowing different users and use cases to access different data subsets through query profiles.
> **B2B Commerce**
>
> Electronic component distributors and industrial suppliers can search technical specifications using queries like "Find ceramic capacitors rated for 50V with 10% tolerance" to locate precise parts across complex catalogs.
> **B2C Commerce**
>
> Retail customers can ask "Find wireless headphones under \$200 with noise cancellation, sorted by rating" to discover products conversationally without navigating faceted search interfaces.
> **Knowledge Management**
>
> Employees search enterprise documentation with queries like "Find JWT authentication guides from the past six months" and receive filtered results with highlighted snippets while field-level security protects sensitive content.
For complete configuration options, multi-tenant setups, and troubleshooting, see [Lucidworks MCP](/docs/5/fusion/getting-data-out/mcp).
### Kubernetes event-driven autoscaling
Fusion 5.17 adds support for [KEDA (Kubernetes Event-Driven Autoscaling)](https://keda.sh/) as an alternative autoscaling approach for Fusion workloads.
Unlike traditional HPA-based scaling that relies mainly on CPU and memory utilization, KEDA enables you to scale based on events, schedules, and business metrics.
This allows you to align infrastructure capacity more closely with real demand, improving operational efficiency and reducing unnecessary resource consumption.

KEDA combines scheduled scaling (cron trigger) with reactive scaling (CPU trigger) to align infrastructure capacity with actual demand throughout the day.
KEDA provides these advantages for managing Fusion workloads:
* **Event-driven autoscaling**
Scale Fusion workloads in response to external signals such as Prometheus metrics, queue depth, or pipeline execution load.
* **Scheduled scaling**
Automatically scale workloads up or down based on predictable traffic patterns, such as market hours or peak usage windows.
* **Scale-to-zero capability**
Reduce infrastructure costs by allowing certain workloads to scale down to zero during off-hours or periods of inactivity.
* **Improved operational efficiency**
Align infrastructure capacity with real business demand instead of relying solely on CPU or memory thresholds.
In this release, these Fusion services support KEDA:
* `api-gateway`
* `query-pipeline`
* `fusion-indexing`
For complete details and setup instructions, see [Autoscaling with KEDA](/docs/5/fusion/operations/keda).
### Connectors improvements
#### Skipping validation is now supported in V2 and Pro connectors
All V2 and Pro connectors now support a new core property that allows you to skip validation when needed. In previous versions of Fusion, long-running validation checks could cause connector configuration timeouts in the UI, preventing you from saving connector configurations even when the settings were correct. You can now configure connectors to skip validation by setting the appropriate property in the datasource configuration.
> **Configuration parameters**
>
> **Skip Validation** `boolean` (default: false)
>
> Enable to skip configuration validation when it takes too long and causes a timeout issue.
This gives you more control over the connector configuration process and prevents unnecessary delays when you're confident in your settings.
#### The Selenium version for the Web connector has been upgraded
The Selenium Hub used by the Web connector has been upgraded from version 4.20.0 to version 4.38.0. The previous version was over a year old and contained security vulnerabilities. Users can expect more reliable web crawling operations, enhanced security, and improved browser compatibility with Chrome, Firefox, and Edge.
### Facet and JSON Facet stage improvements
Both the Facet and JSON Facet stages have been enhanced with several new capabilities that give you more control over facet presentation and matching:
* **Boost, bury, and suppress facet values**
The Facet and JSON Facet stages now support boost, bury, and suppress options for individual facet values, similar to the capabilities previously available only in facet rules. You can now promote important facet values to the top of the list (boost), move less relevant values to the bottom (bury), or hide specific values entirely (suppress) directly within the stage configuration. This provides greater flexibility for controlling facet display without requiring separate rules.
* **Facet field ordering**
You can now control the order in which facet fields appear in query responses for both standard facets and JSON facets. This ordering capability is available in both facet stages and facet rules, allowing you to define a specific display sequence for Field and Range facets that matches your business requirements or user interface needs.
[Configure Search Facets and Boost Relevance](https://app.supademo.com/embed/cmnruw48700e0y90jbmwm3nmg?embed_v=2\&utm_source=embed)
### Monitoring improvements with kafka-exporter and jmx-exporter
Fusion 5.17 introduces Docker images for `kafka-exporter` and `jmx-exporter`, providing enhanced monitoring capabilities for Kafka and JMX metrics. These exporters enable you to collect detailed metrics from Kafka brokers and Java applications, making it easier to monitor Fusion component health and performance through Prometheus and other observability tools. The `kafka-exporter` provides visibility into Kafka consumer lag, topic metrics, and broker performance, while the `jmx-exporter` exposes JVM and application-level metrics for Fusion services.
### Additional model parameters supported in Ray and Seldon vectorization stages
The [Ray / Seldon Vectorize Field](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/vectorize-field-via-seldon-index-stage) and [Ray/Seldon Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) stages now support passing additional custom parameters to Ray and Seldon models beyond the basic text input. You can now include parameters such as tracking IDs, custom endpoints, input/output keys, and other model-specific configuration options in your vectorization requests.

After

Before
New parameters in the **Ray / Seldon Vectorize Query** query pipeline stage
> **Configuration parameters**
>
> **Model Configuration** `array`
>
> Additional model parameters to pass to the model. These will be included in the model request. Each item in the array contains a key-value pair.
>
> **Parameter Name** `string` *required*
>
> The name of the model parameter to pass in the request.
>
> **Parameter Value** `string`
>
> The value for the model parameter.
This enhancement provides greater flexibility for logging, monitoring, and customizing model behavior to meet specific deployment requirements. The feature is backward compatible with existing configurations and works with both Ray and Seldon model deployments.
### ConfigSync annotations
ConfigSync now supports [annotations](/docs/5/fusion/operations/config-sync/metrics) that overlay ConfigSync event information on Grafana time-series graphs to highlight when specific events occurred. Annotations provide context by overlaying event information directly onto your graphs, making it easier to correlate Fusion system behavior with ConfigSync activities.
```promql Git files changed theme={"dark"}
increase(configsync_git_file_changes_total[1m]) > 0
```
```promql Fusion updated theme={"dark"}
increase(configsync_fusion_updates_total[1m]) > 0
```
```promql User commits theme={"dark"}
increase(configsync_git_commits_total{commit_type="explicit"}[1m]) > 0
```
### Commerce Studio collection backup support in ConfigSync
ConfigSync now supports automatic backup of Commerce Studio collections. When Commerce Studio is enabled for an application, it creates a specialized set of collections with the `_em` suffix (for example, `app_name_query_rewrite_em`).
These collections are now automatically included in ConfigSync backups alongside standard query rewrite collections, ensuring that Commerce Studio configurations are preserved and can be synchronized across environments.
## API Updates
Fusion 5.17 removes several deprecated endpoints in favor of more standardized alternatives. These changes align Fusion's API surface with modern best practices and improve consistency across services.
The following endpoints have been removed:
* `PUT /collections/{collection}/schema/dynamicfields/{fieldName}` has been removed. Instead, use `POST /solr/{collection}/schema` with a `replace-dynamic-field` command in the request body:
```json theme={"dark"}
{
"replace-dynamic-field": {
"name": "*_s",
"type": "string",
"stored": true
}
}
```
* `PUT /collections/{collection}/schema/fields/{fieldName}` has been removed. Instead, use `POST /solr/{collection}/schema` with a `replace-field` command in the request body:
```json theme={"dark"}
{
"replace-field": {
"name": "field_name",
"type": "string",
"stored": true
}
}
```
### Application API enhancements for Solr collection configuration
The Fusion Application Create API now provides advanced options for controlling default Solr shard and replica strategies when creating applications programmatically. You can now specify the number and types of replicas (NRT, TLOG, or PULL) for the collections that will be created with your application. The API also provides visibility into all collections that will be created for the application, giving you better control over resource allocation and replication strategies. This enhancement is particularly useful for customers who need to customize Solr topology to match specific performance, availability, or resource constraints when deploying Fusion applications through automation.
### OpenAPI documentation improvements
Several Fusion services have been updated to use OpenAPI specifications and resolve Swagger documentation issues. The fusion-indexing, fusion-api-gateway, and fusion-chassis services now provide improved API documentation with proper OpenAPI compliance, making it easier to understand available endpoints, request/response formats, and integration patterns. These updates enhance the developer experience when working with Fusion APIs and ensure that API documentation accurately reflects the actual service capabilities.
## Bug fixes
### PIN rules: pinned items outside the result window are now excluded rather than promoted to position 1
When a document was pinned to a position greater than the query's `rows` value, Fusion incorrectly promoted it to position 1 instead of omitting it.
PIN rule processing is now pagination-aware: pins that fall outside the current page are ignored.
| Scenario | Before | After |
| - | - | - |
| Pin at position 15, rows=10 | Promoted to position 1 | Excluded from results |
| Pin at position 15, rows=30 | Appears at position 15 | Appears at position 15 |
### LWAI Gateway SSL protocol mismatch fixed
In Fusion 5.9.16, self-hosted deployments using TLS with the LWAI Gateway service experienced HTTP `503 Service Unavailable` errors when users attempted to configure LWAI Vectorize Field or Query stages. This occurred because the API Gateway attempted HTTPS connections to the LWAI Gateway service, which was only listening on HTTP, causing an `Unsupported or unrecognized SSL message` error.
The protocol mismatch has been resolved, and self-hosted TLS deployments can now properly configure LWAI vectorization stages.
### Chunking RAG bridge stage now escapes document IDs properly
In previous versions of Fusion, the Chunking RAG Bridge stage failed with a Solr syntax error when processing documents with IDs containing special characters such as colons:
```json wrap focus={3-4,6} theme={"dark"}
{
"timestamp" : "2026-04-09T14:50:03.947759",
"service" : "query",
"error" : "client",
"path" : "/query-pipelines/Lucidworks_Docs_Site_Chunking_memoryUuid/collections/chunking/select",
"message" : "org.apache.solr.search.SyntaxError: Cannot parse '(id:https://doc.lucidworks.com/docs/lw-platform/lw-cs/cstudio-editor* OR id:https://doc.lucidworks.com/docs/lw-platform/lw-platform/overview* OR ...': Encountered \" \":\" \": \"\" at line 1, column 9.\nWas expecting one of:\n ...\n ...\n ...\n \"+\" ...\n \"-\" ...\n ...\n \"(\" ...\n \")\" ...\n \"*\" ...\n \"^\" ...\n ...\n ...\n ...\n ...\n ...\n ...\n \"[\" ...\n \"{\" ...\n ...\n \"filter(\" ...\n ...\n"
}
```
This pattern is commonly seen in web-crawled content where the document ID is a URL such as `https://example.com`. The stage now properly escapes document IDs in filter queries, allowing it to work correctly with web-crawled content and other sources that use special characters in document IDs.
### Pipeline cache initialization fixed to reduce ZooKeeper load
In previous versions of Fusion, query and index pipeline services generated excessive ZooKeeper read traffic due to an uninitialized cache. The cache was created but never initialized, causing every pipeline lookup to bypass the cache and query ZooKeeper directly. This resulted in high ZooKeeper traffic that scaled with query volume and the number of pipeline pods in the cluster.
The cache initialization has been fixed, significantly reducing ZooKeeper traffic and improving overall cluster performance.
### Solr Indexer stage no longer fails with `NullPointerException` when using Unmapped Fields Mapping
In previous versions of Fusion starting with 5.9.10, the Solr Indexer stage could fail with a `NullPointerException` when the **Unmapped Fields Mapping** configuration was enabled with a DELETE operation. This occurred when a field configured for deletion in the **Unmapped Fields Mapping** settings caused the validator to incorrectly return null when processing other unrelated fields that had multiple values being mapped to single-value fields. Documents would fail to index entirely when this condition was triggered.
The field validation logic has been fixed to properly handle DELETE operations in the **Unmapped Fields Mapping** configuration, ensuring that unmapped field operations only affect their intended target fields and do not interfere with the validation of other fields in the document.
### Ray vectorization now handles non-ASCII characters correctly
In previous versions of Fusion, Ray vectorization failed when processing text containing non-ASCII characters such as trademark symbols, copyright symbols, or other special characters. Query pipelines failed with a `Model execution error: CANCELLED: Failed to read message` error, while index pipelines silently omitted vector fields from documents without any error message.
This has been fixed by properly setting `charset=UTF-8` in the `Content-Type` header for all Ray model requests. Query and index pipelines using Ray-based vectorization stages now correctly process text containing special characters, ensuring that documents with these characters are properly vectorized.
### Filter queries now trigger rules when fq contains OR for the same field
In previous versions of Fusion, rules were only triggered when filter queries (`fq`) contained single values for a field, such as `fq=categories_s:hep-th`. Rules failed to trigger when multiple values for the same field were combined using OR logic, such as `fq=categories_s:(hep-ph OR hep-th)`. This prevented rules from applying consistently across different query patterns.
The rules engine has been enhanced to support OR-based filter values for the same field, so rules now trigger correctly whether you use single filter values or combine multiple values with OR clauses.
### Vectorize query stage performance improved
In previous versions of Fusion, the vectorize query stage could experience significant latency due to inefficient OAuth token handling. The OAuth token initialization was being performed lazily on each request rather than being cached properly.
This has been fixed by optimizing the OAuth token initialization and caching strategy, significantly reducing query latency. Additional logging has been added to improve troubleshooting and observability for vectorization stages.
### Helm chart whitespace syntax issues fixed
In previous versions of Fusion starting with 5.9.14, Helm charts contained whitespace formatting issues that could cause YAML syntax errors during deployment. These whitespace problems affected chart parsing and could prevent successful installations or upgrades.
The Helm charts have been corrected to ensure proper YAML formatting and eliminate syntax problems related to whitespace.
### Admin UI logging loop fixed
Previously, the Admin UI could enter an infinite logging loop when the `/api/ui-logs` endpoint failed. When this endpoint returned an error, the Admin UI would attempt to log that error, which would send another request to the same failing endpoint, creating a cascading loop.
The Admin UI now detects and prevents logging errors that originate from the ui-logs endpoint itself, breaking the infinite loop. Additionally, log queues are now properly cleared even when logging fails, and error details are output to the console for debugging purposes.
### JavaScript stage security enhancement
A security patch has been created to disable the Nashorn JavaScript engine for query and index pipeline JavaScript stages. This enhancement restricts JavaScript execution to only the more secure GraalVM engine, providing enhanced security for environments with strict security requirements.
This feature is particularly useful for customers undergoing penetration testing or who require highly secure JavaScript execution environments.
You can enable it by adding this to your Fusion Helm chart:
```yaml theme={"dark"}
featureFlags:
javascriptIsolated: true
```
### Parsing and indexing fixes
Several datasource indexing and parsing bugs have been fixed that previously caused data inconsistencies, missing documents, or incorrect field extraction.
* When Fusion parsed a document into multiple documents (such as splitting a large file into sections), it would index an extra `container-doc` document representing the parent document alongside the parsed child documents. This behavior caused confusion for users who would see unexpected extra documents in their index.
The connector now skips indexing the `container-doc` while still maintaining proper deletion handling for parsed documents.
* When Fusion parsed XML files with a root path configuration of `/` (representing the entire XML file as a single document), the `absolute_resource_name` field incorrectly included a `#0` suffix. For example, `https://example.com/file.xml` would be stored as `https://example.com/file.xml#0`.
This suffix has been removed, and the `absolute_resource_name` field now correctly reflects the original XML file path without any suffix.
### LWAI Vectorize stage validation errors improved
In previous versions of Fusion, providing invalid or misplaced parameters in the LWAI Vectorize stage configuration (such as placing a parameter meant for `modelConfig` into `useCaseConfig` instead) resulted in an unhelpful `NullPointerException`.
The stage now properly validates configuration parameters and returns an HTTP `400 Bad Request` with a descriptive error message that indicates which parameter is invalid, the list of valid parameters for each configuration section, and contextual suggestions. This improves the user experience and reduces troubleshooting time.
### Updating a datasource now displays default values
In previous versions of Fusion, default values for datasource configuration fields were only displayed when creating a new datasource. When editing an existing datasource, fields that had no value set by the user would appear empty instead of showing their default values. This made it difficult to understand the actual datasource configuration being used and could lead to confusion about whether default values were being applied.
Default values now display properly in edit mode for all fields that have not changed the default value, ensuring consistency between the create and edit experiences.
### Next job run time displays properly
In previous versions of Fusion, the next scheduled run time for jobs did not appear in the Jobs UI unless the browser was manually refreshed.
This has been fixed, and the job schedule information now displays correctly and updates automatically without needing to manually refresh your browser.
## Known issues
### Streaming mode indexing fails with unquoted character errors
When indexing content in streaming mode, the Jackson library upgrade (2.13.5 → 2.19.1) introduced stricter validation.
The current implementation might fail with the long requests which use a `Transfer-Encoding: chunked` header.
Below is an example of a failure message, though other messages are also possible:
```
Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in name
```
As a workaround, divide your requests into batches and send each batch as a single request with a `Content-Length` header.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Microsoft Azure Kubernetes Service (AKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Amazon Elastic Kubernetes Service (EKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.30, 1.31, 1.32, 1.33, 1.34, 1.35; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.17.0 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
| Helm | 3.4.1 |
More information about support dates can be found at [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle).
# Fusion 5.17.1
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.17/5.17.1-release-notes
Released on May 28, 2026, Fusion 5.17.1 is a [patch release](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#patch-release-support-policy) that delivers a security update and bug fixes for Commerce rules and pipeline compatibility.
Upgrading to the latest version of Fusion offers several key benefits:
* **Access to latest features:** Stay current with the latest features and capabilities to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle) policy.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Bug fixes
### Fusion now supports numeric operators for attribute-based rules
In previous versions of Fusion, configuring numeric field conditions for Boost by Attribute, Bury by Attribute, and Block by Attribute rules required writing Solr queries directly.
Fusion now supports numeric comparison operators for attribute-based rules, eliminating the need for manual query construction.
This update also includes fixes to the underlying JSON structure to support multiple block groups separated by OR logic.
### MCP Server now starts correctly when TLS is enabled
In previous versions of Fusion, the MCP Server failed to start when TLS was enabled due to missing SSL keystore password configuration, resulting in `BadPaddingException` errors at startup.
The MCP Server configuration now includes the required SSL properties (`server.ssl.key-store-password` and `server.ssl.trust-store-password`) when TLS is enabled, allowing the server to properly decrypt the keystore and start successfully.
### Apply Rules stage now correctly combines pipeline tags and URL tags
In previous versions of Fusion, the Apply Rules stage overwrote pipeline-configured tags with user-provided URL tags when both were present, causing rules scoped to pipeline tags to stop firing.
For example, if a pipeline had `tags=pipelineTag1` and a request also included `tags=urlTag`, only rules for `urlTag` would fire.
Rules for `pipelineTag1` were silently ignored, even though the response headers correctly showed both tags.
The Apply Rules stage now combines pipeline-configured tags and URL tags so that rules for all active tags fire as expected.
### `kubectl cp` restored after Java upgrade
A regression introduced by a previous Java base image upgrade caused `kubectl cp` commands to fail when copying files from Fusion service pods. The failure occurred because the updated base image was missing the `libpcre2-8.so.0` shared library required by the `tar` utility used internally by `kubectl cp`:
```text theme={"dark"}
tar: error while loading shared libraries: libpcre2-8.so.0: cannot open shared object file: No such file or directory
command terminated with exit code 127
```
The base image now includes the missing library, and `kubectl cp` works correctly across all Fusion service pods.
### RAG Bridge Stage no longer returns incorrect vector format error for byte vector fields after upgrade
After upgrading to Fusion 5.17.0, the RAG Bridge Stage returned an "incorrect vector format" error when processing byte vector fields, preventing RAG-based pipelines from functioning correctly.
Fusion 5.17.1 resolves this regression, and the RAG Bridge Stage now correctly processes byte vector fields.
### Security update: CVE-2026-33870 patched
Fusion 5.17.1 includes security patches for CVE-2026-33870 in the following services:
* apps-manager
* job-config
* lwai-gateway
### Prometheus metrics restored for low time scale resolution
In previous versions of Fusion, Prometheus metrics lacked resolution when viewed at low time scales because smaller time bucket intervals were missing from the metrics configuration.
Fusion 5.17.1 restores the smaller bucket intervals, and Prometheus metrics now display with correct granularity at low time scales.
## Known issues
### Streaming mode indexing fails with unquoted character errors
When indexing content in streaming mode, the Jackson library upgrade (2.13.5 → 2.19.1) introduced stricter validation. The current implementation might fail with the long requests which use a `Transfer-Encoding: chunked` header. Below is an example of a failure message, though other messages are also possible:
```
Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in name
```
As a workaround, divide your requests into batches and send each batch as a single request with a `Content-Length` header.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Microsoft Azure Kubernetes Service (AKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Amazon Elastic Kubernetes Service (EKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions based on Kubernetes 1.30, 1.31, 1.32, 1.33, 1.34, 1.35.
Note that RKE2 may require some Helm chart modification.
OpenStack and customized Kubernetes installations *aren't* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.17.1 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
| Helm | 4.1.1 |
For more information about support dates, see [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle).
# Fusion 5.17.2
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.17/5.17.2-release-notes
Released on June 12, 2026, Fusion 5.17.2 is a [patch release](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#patch-release-support-policy) that delivers critical security updates to address vulnerabilities in the Netty framework that handles network communication.
> [!WARNING]
>
> **Upgrade strongly recommended:** While Lucidworks is not aware of any active exploitation, this update addresses security vulnerabilities that could potentially be exploited.
> We strongly recommend upgrading to ensure continued security and platform stability.
Upgrading to the latest version of Fusion offers several key benefits:
* **Access to latest features:** Stay current with the latest features and capabilities to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle) policy.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Security updates
### Security vulnerabilities in Netty resolved
[CVE-2026-44249](https://nvd.nist.gov/vuln/detail/CVE-2026-44249)[CVE-2026-42577](https://nvd.nist.gov/vuln/detail/CVE-2026-42577)[CVE-2026-42579](https://nvd.nist.gov/vuln/detail/CVE-2026-42579)[CVE-2026-42581](https://nvd.nist.gov/vuln/detail/CVE-2026-42581)[CVE-2026-42583](https://nvd.nist.gov/vuln/detail/CVE-2026-42583)[CVE-2026-42584](https://nvd.nist.gov/vuln/detail/CVE-2026-42584)[CVE-2026-42585](https://nvd.nist.gov/vuln/detail/CVE-2026-42585)[CVE-2026-42587](https://nvd.nist.gov/vuln/detail/CVE-2026-42587)[CVE-2026-45416](https://nvd.nist.gov/vuln/detail/CVE-2026-45416)[CVE-2026-45674](https://nvd.nist.gov/vuln/detail/CVE-2026-45674)[CVE-2026-47691](https://nvd.nist.gov/vuln/detail/CVE-2026-47691)
Prior to this release, Netty versions before 4.1.135.Final contained multiple security vulnerabilities affecting HTTP request processing, DNS resolution, and network connection handling, including request smuggling vulnerabilities.
These vulnerabilities could potentially be exploited to bypass security controls, hijack user sessions, or compromise data integrity.
These vulnerabilities are now resolved.
Fusion 5.17.2 updates Netty to version 4.1.135.Final, which addresses these security issues across multiple Netty components including HTTP/HTTP2 codecs, DNS resolver, transport layer, and connection handlers.
Upgrading to Fusion 5.17.2 protects your deployment against these vulnerabilities.
## Known issues
### Streaming mode indexing fails with unquoted character errors
When indexing content in streaming mode, the Jackson library upgrade (2.13.5 → 2.19.1) introduced stricter validation.
The current implementation might fail with long requests that use a `Transfer-Encoding: chunked` header.
Below is an example of a failure message, though other messages are also possible:
```
Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in name
```
As a workaround, divide your requests into batches and send each batch as a single request with a `Content-Length` header.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Microsoft Azure Kubernetes Service (AKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Amazon Elastic Kubernetes Service (EKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions based on Kubernetes 1.30, 1.31, 1.32, 1.33, 1.34, 1.35.
Note that RKE2 may require some Helm chart modification.
OpenStack and customized Kubernetes installations *aren't* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.17.2 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
| Helm | 4.1.1 |
For more information about support dates, see [Lucidworks Semantic Version Support Lifecycle](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle).
# Fusion 5.18.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.18/5.18.0-release-notes
Released on July 7, 2026, this is a [minor release](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#minor-release-support-policy) that focuses on AI enhancements, connector reliability improvements, and operational stability.
Upgrading to the latest version of Fusion 5 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.X and later use an in-place upgrade strategy.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-fusion-product-lifecycle) policy.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Secrets management
Fusion now provides [Secrets management using Fusion Vault](/docs/5/fusion/operations/security/external-vault) that interfaces with [Kubernetes External Secrets Operator (ESO)](https://external-secrets.io/latest/) to reference and use credentials stored in external databases, services, and APIs.
External secret providers include Kubernetes, HashiCorp Vault, Amazon Web Services Secrets Manager, Google Cloud Platform (GCP) Secret Manager, and Azure Key Vault.
Install and configure ESO to interface between the vault provider and Fusion, and then configure Fusion pipelines, jobs, and connectors with variable references for the secrets.
Fusion contains the variable references, but does not store the secret values, ensuring usernames, passwords, certificates, and API keys are kept secure.
Credential values never display in Fusion configurations.
These examples illustrate the datasources, index and query pipeline stages, and job settings in Fusion.
**Datasources**

Set Fusion datasource to use a managed secret
Your managed secret is found in the datasource configuration in **Crawl Authentication Properties > Basic Authentication > Host**.
**Pipeline stages**

Set index and query pipeline stages to use a managed secret
If selected, **Use Managed Secret** applies to the name, password, and secret reference.
**Jobs**

Set script to use a managed secret
Your managed secret is found in **Advanced > Scripts Secrets**.
When you update a credential in your vault, all related pipelines change automatically without manual pipeline updates or service restarts.
### OpenTelemetry tracing support
OpenTelemetry (OTel) provides distributed tracing capabilities for Fusion that enable engineering and operations teams to identify performance bottlenecks and errors across microservices in real time.
This comprehensive, request-level observability across Fusion's microservices helps teams trace individual queries separately from monitoring systems such as Prometheus without overwhelming them.
The API Gateway handles incoming queries and routes them through the Query Service to Solr.
> [!NOTE]
>
> The services that support OpenTelemetry are API Gateway, Query, and Indexing.
#### Distributed trace flow
This section illustrates and describes the OpenTelemetry distributed trace flow.
Fusion's distributed tracing uses the API Gateway as the trace root with selective sampling for Query Service requests, while the Query Service uses parent-based sampling to ensure complete trace coverage.
OpenTelemetry collectors run locally on each server to minimize network overhead, bundling trace data before sending it to Grafana Tempo.
The tracing system integrates with the existing Lucidworks observability stack (Grafana, Loki, Prometheus) without requiring code changes to Solr, which uses environment variable configuration.

For more information, see [OpenTelemetry Distributed Tracing](/docs/5/fusion/operations/monitoring-and-reporting/opentelemetry-implementation-fusion).
### Lucidworks MCP enhancements
Fusion's Model Context Protocol (MCP) implementation includes improved configuration capabilities, enhanced authentication options, and monitoring in this release.
Enhancements include:
* **OAuth authentication with external identity providers**: Fusion now supports OAuth 2.1 authentication using external identity providers for both HTTP and STDIO modes.
This enables enterprise single sign-on workflows for MCP access and is the recommended authentication method for Claude Desktop applications.
See [Set up authentication](/docs/5/fusion/getting-data-out/mcp#set-up-authentication) for configuration details.
* **UI-based search experience configuration**: For simpler setup, you can configure MCP search experiences directly through the Fusion [Query Profile](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/query-profiles) panel instead of editing a configuration file.

* **Multi-experience search**: The MCP server can now use multiple search experiences in a single request, allowing Claude to gather information from multiple data sources in one query.
In 5.17.x, the server selected only the single best-matching search experience per request.
This enables AI assistants to retrieve information from multiple data sources in one query.
* **Enhanced document descriptions**: The MCP server now checks the `body_t` field as an additional source for document descriptions returned to AI assistants, providing richer document summaries.
* **MCP usage monitoring documentation**: The existing API gateway metrics that track MCP server usage (available since Fusion 5.17) are now documented with setup instructions and a ready-to-use Grafana dashboard.
The metrics provide request rates, latency percentiles, error rates, and traffic breakdowns by status code.
Note that STDIO-based MCP usage (such as earlier Claude Desktop integrations) does not flow through the `/mcp` endpoint and is not captured in these metrics.
See [MCP Server Monitoring](/docs/5/fusion/operations/monitoring-and-reporting/mcp-monitoring) for setup instructions and dashboard configuration.

For more information about MCP configuration and setup, see [Lucidworks MCP](/docs/5/fusion/getting-data-out/mcp).
### Mutual Transport Layer Security support
Fusion 5.18 introduces Mutual Transport Layer Security (mTLS) for self-hosted Fusion and Lucidworks Search clients on 5.9.15 and later.
mTLS is a network-layer authentication feature that extends standard TLS encryption by requiring both the client and server to present valid certificates during the TLS connection process.
While standard TLS encrypts traffic and allows clients to verify the server's identity, mTLS adds bidirectional authentication where the server also verifies the client's identity before allowing the connection.
mTLS is implemented at the Google Cloud External Application Load Balancer level and ensures that only trusted, certificate-authenticated clients can access APIs and UI endpoints.
This feature complements but does not replace application-layer authentication methods like SSO and OIDC, and provides an additional security layer that satisfies zero-trust architecture requirements.
Performance impact is minimal with only sub-millisecond latency added during initial connection, and the feature supports multiple CA certificates as trust anchors for flexible multi-environment access control.
This diagram illustrates an example authentication process.

mTLS and TLS service flow
For complete details, see [Mutual Transport Layer Security](/docs/5/fusion/operations/security/mtls-fusion).
#### Use cases
mTLS applies to B2B, B2C, and knowledge management scenarios.
Organizations can restrict Lucidworks Search API access to only authenticated services within their infrastructure, requiring valid client certificates signed by their certificate authority.
For multi-environment deployments, mTLS enables different certificate requirements across development, staging, and production environments.
Development environments can use self-signed certificates while production requires certificates from enterprise public key infrastructure (PKI).
The feature is particularly critical for organizations operating under zero-trust security frameworks that need to follow these guidelines:
* Adhere to strict compliance requirements such as SOC2, ISO 27001, or HIPAA
* Enforce network-layer security controls beyond application authentication
All client certificate usage is logged in Google Cloud logging, which provides comprehensive audit trails for regulatory compliance.
For more information, see [Lucidworks Search Mutual Transport Layer Security](/docs/5/fusion/operations/security/mtls-fusion).
### Ray environment variables
[Ray deploy jobs](/docs/5/fusion/reference/config-ref/jobs/create-ray-model-deployment) now support Ray environment variables, enabling better configuration and control of Ray-based machine learning workloads within Fusion's deployment infrastructure.
This enables configuration and control of Ray-based machine learning workloads, such as setting memory limits, adjusting worker parallelism, and configuring logging levels for Ray tasks within Fusion's deployment infrastructure.
### Connectors
#### Stray content deletion
All V2 and Pro [connectors](/docs/fusion-connectors/overview) now include a configurable circuit breaker that prevents accidental mass deletion of indexed content.
Previously, stray content deletion could silently remove all of a datasource's content due to misconfigurations or source system issues, with no safety mechanism to detect anomalous deletion patterns.
You can set a threshold in a connector's settings for the maximum percentage of indexed items that may be deleted as stray in a crawl.
If the total stray items exceeds this percentage, the job fails, and the circuit breaker blocks the deletion to prevent accidental data loss.
Failure details are visible in the job history.
To enable tracking each document, child documents of an embedded parser such as entries in a ZIP file or lines in a CSV file are now tracked by a signature so these documents also participate correctly in stray content deletion and circuit breaker accounting, instead of being silently reindexed or deleted.
Stray content deletion and the circuit breaker are enabled by default. You can edit these settings in each connector's core properties.

> **Configuration parameters**
>
> **Enable Stray Deletion** `boolean` (default: true)
>
> When enabled, items not re-encountered in the current crawl are deleted from the content collection.
>
> **Enable Circuit Breaker** `boolean` (default: true)
>
> When enabled, stray deletion is blocked if the percentage of items to be deleted exceeds the configured threshold.
> Disable this setting only if unconditional stray deletion is required regardless of volume.
>
> **Stray Deletion Threshold (%)** `number` (default: 80)
>
> Maximum percentage of indexed items that may be deleted as stray in a crawl.
> If the total stray items exceeds this percentage, the circuit breaker blocks the deletion to prevent accidental data loss.
> Accepts values from 0 to 100.
The circuit breaker setting eliminates expensive recovery operations, prevents search downtime, and maintains search quality even when source systems experience temporary issues.
#### Sidecar collections for graph security trimming
Connectors that use [graph security trimming](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/security-trimming-graph-query-stage) can now route access-control documents to a dedicated sidecar collection separate from the content collection.
This enables improved performance and cleaner separation of documents for deployments using graph ACLs.
By default, ACL documents continue to land in the content collection, maintaining backward compatibility.
To use a sidecar collection, navigate to **Graph security filtering configuration** in your datasource and set the **ACL Collection ID** datasource parameter to the name of your dedicated ACL collection. After configuring your datasource, navigate to the Query Workbench and configure the graph security trimming query stage to use this sidecar collection.
Connectors that support sidecar collections include SharePoint Optimized, LDAP, and any V2 or Pro connector that emits graph ACLs.

> **Configuration parameter**
>
> **ACL collection ID** `string`
>
> Name of the dedicated sidecar collection for storing ACL records.
> If not specified, ACL records are stored in the content collection (default behavior).
#### Document signatures
V2 and Pro connectors now evaluate document signatures to prevent reindexing unchanged content.
Each document, including parsed child documents, receives a `_lw_signature_s` field containing a fingerprint built from the document's fields, metadata, and ACLs.
During recrawls, documents with unchanged signatures skip reindexing, reducing memory overhead.
## API changes
### Connectors SDK upgrade
The Fusion Connectors SDK has been upgraded to version 4.2.5.
This release includes protobuf schema improvements, enhanced plugin resolution, and updated dependencies for custom connector development.
For details, see [Connectors SDK 4.2.5 Javadocs](https://lucidworks.github.io/connectors-sdk-javadocs/4.2.5/).
### Connector configuration endpoints removed
The Connectors API has removed the following internal configuration management endpoints:
* `DELETE /configs`
* `DELETE /configs/{id}`
* `GET /configs`
* `GET /configs/{id}`
* `POST /configs`
* `PUT /configs/{id}`
Applications using these connector configuration endpoints must migrate to alternative configuration management approaches.
### Templating API enhancements
Twenty-one templating endpoints received parameter additions and type corrections. These changes appear to be non-breaking enhancements that add missing parameters and fix type definitions in the OpenAPI specification. Review the [Fusion Templating API](/api-reference/render-controller/get-template-information-using-your-app-name) specification for complete details.
## Bug fixes
### Connectors
#### PhaseState no longer causes cached failures in fusion-connectors
In previous versions of Fusion, PhaseState operations resulted in cached failures that persisted inappropriately in the fusion-connectors service.
Fusion now properly manages PhaseState caching to prevent spurious failure states.
#### RepositoryPluginsService cache failures resolved
In previous versions of Fusion, the RepositoryPluginsService experienced cached failures that prevented proper plugin loading and initialization in fusion-connectors.
Fusion now correctly manages the plugin service cache lifecycle.
#### Stray content deletion now works correctly when parsers emit marker documents
In previous versions of Fusion, stray content deletion failed to remove orphaned child documents when a parser emitted an error or comment marker document before any records, causing orphaned documents to accumulate in the content collection across crawls.
Fusion now properly removes orphaned child documents to prevent document accumulation.
#### Connector plugin pods now allocated increased resources
In previous versions of Fusion, connector plugin pods operated with insufficient resource allocations, causing performance degradation and potential out-of-memory issues.
Fusion now allocates appropriate CPU and memory resources to connector plugin pods for reliable operation under load.
### AI and machine learning
#### LWAI stages now continue pipeline execution on failure
In previous versions of Fusion, LWAI stage failures caused entire pipelines to fail, preventing subsequent stages from executing.
Fusion now logs LWAI stage failures while allowing the pipeline to continue execution, ensuring that temporary AI service issues do not block document processing.
#### Ray vectorization now handles non-ASCII text correctly
In previous versions of Fusion, Ray vectorization failed for non-ASCII text due to missing UTF-8 encoding configuration.
Fusion now properly encodes text using UTF-8 before vectorization, ensuring reliable processing of international and special characters.
#### Machine Learning stage now works correctly with Neural Hybrid Query and Apply Rules
In previous versions of Fusion, using the Machine Learning stage together with the Neural Hybrid Query stage and the Apply Rules stage caused query pipeline failures.
Fusion now supports all three stages working together correctly in query pipelines.
#### lwai-gateway now returns correct error code on authentication failure
In previous versions of Fusion, the lwai-gateway service incorrectly returned HTTP 401 (Unauthorized) when it failed to authenticate itself with backend services, misleading clients about the nature of the error.
Fusion now returns HTTP 500 (Internal Server Error) to accurately indicate server-side authentication failures.
### Jobs and infrastructure
#### Jobs now display correct status
In previous versions of Fusion, jobs occasionally displayed incorrect status information in the UI.
Fusion now correctly reports job status in all cases.
#### job-launcher-spark Role now includes correct permissions
In previous versions of Fusion, the job-launcher-spark Kubernetes role was missing the `deletecollection` verb and referenced an incorrect PVC resource name, preventing proper cleanup operations.
Fusion now includes the correct RBAC permissions and resource references for Spark job management.
#### EventBus memory leaks eliminated
In previous versions of Fusion, Google Guava's EventBus caused memory leaks in singleton components, particularly affecting the DefaultDataProcessor and RPC service.
Fusion now migrates all remaining EventBus usage to Spring's event system, eliminating memory leaks and improving long-term stability.
#### Selenium driver updated in rpc-service
In previous versions of Fusion, the rpc-service used an outdated Selenium driver version with known issues and security vulnerabilities.
Fusion now uses the latest Selenium driver, providing improved compatibility and security.
#### Merge Async Results thread safety improved
In previous versions of Fusion, the DefaultContext class in the CDW 5.9.16 merge async results implementation was not thread-safe, causing ConcurrentExecutionException errors under concurrent load.
Fusion now resolves thread safety issues in asynchronous result merging.
#### apps-manager now starts correctly with SSL enabled
In previous versions of Fusion, the apps-manager service failed to start when SSL/TLS was enabled.
Fusion now properly initializes SSL configuration, allowing apps-manager to start successfully in TLS-enabled environments.
### User interface
#### Datasource configuration UI checkbox labels now align correctly
In previous versions of Fusion, checkbox labels in the datasource configuration UI appeared below or misaligned from their checkboxes, creating a confusing user experience.
Fusion now renders checkbox labels in the correct position next to their controls.
#### Blob binary data uploads now work correctly through UI
In previous versions of Fusion, binary blob data became corrupted when uploaded through the Admin UI.
Fusion now preserves binary data integrity during upload operations, ensuring files are stored and retrieved without corruption.
#### ACL label description clarified
In previous versions of Fusion, the ACL configuration label description was unclear, causing confusion during security configuration.
Fusion now provides clearer ACL label descriptions in the UI and documentation.
### Search and query
#### Bury by attribute now uses correct query parameter
In previous versions of Fusion, the Experience Manager API's bury by attribute functionality incorrectly used the `bq` (boost query) parameter instead of the `boost` parameter.
Fusion now correctly applies negative boosts using the `boost` parameter, ensuring buried items are properly demoted in Commerce Studio's search results.
#### Pinned documents now respect query parameters
In previous versions of Fusion, pinned documents returned by query rules did not inherit query parameters from the main query pipeline, such as the field list (`fl`) filter configured in the Query Fields stage.
Non-pinned documents correctly applied these parameters, but pinned documents outside the initial row count returned all fields regardless of pipeline configuration.
Fusion now propagates query parameters to the secondary lookup used to retrieve pinned documents, ensuring consistent field filtering across all results.
## Known issues
### First recrawl after upgrading to Fusion 5.18.0 reindexes all documents
Fixed in 5.19
Fusion 5.18.0 skips reindexing unchanged documents during recrawls by comparing each document's signature to the signature stored in the CrawlDB. Fusion 5.9 through 5.17 do not store document signatures. As a result, after upgrading from any of these versions to Fusion 5.18.0, the first recrawl of each affected datasource treats every document as changed and sends it through indexing again.
**Impact:** The first recrawl after the upgrade is a full reindex of all affected datasources.
**Workaround:** None. If a full reindex is not acceptable for your deployment, postpone upgrading to Fusion 5.18 until Fusion 5.18.1 is available.
### Web V2, file system, and SMB connectors re-fetch every item on every recrawl
Fixed in 5.19
In Fusion 5.18.0, Web V2, file system, and SMB connectors don't receive the stored state they use to skip unchanged items, such as ETag and Last-Modified values for Web V2 or modification times for files. As a result, every recrawl re-fetches every page or re-reads every file instead of only changed items.
**Impact:** Recrawls take longer and put more load on the content source.
**Workaround:** None. Upgrade to Fusion 5.19.0, which replays stored state to connectors on recrawl.
### JavaScript and Active Directory stages defer Vault validation
The Active Directory Security Trimming Stage and JavaScript pipeline stages (GraalVM, Nashorn, OpenJDK Nashorn) do not validate Vault-backed credentials during stage initialization.
The Active Directory stage recreates the LDAP resolver on every request using freshly resolved Vault credentials. Misconfigured or unavailable secrets only surface when the first query arrives, rather than being caught during pipeline deployment or updates.
JavaScript stages currently access Vault secrets through a polling mechanism that checks for updates on a fixed interval, rather than through a native integration with the Fusion Vault API. This means a JavaScript stage configured with a required secret that is unavailable in Vault can initialize successfully and only fail at request time. Secret values updated in the vault are not guaranteed to be reflected in the stage without a service restart.
**Impact:** Query pipelines with misconfigured Vault credentials appear to deploy successfully but fail when processing the first query.
**Workaround:** Manually verify all required Vault secrets are available and correctly configured before deploying or updating query pipelines that use the Active Directory Security Trimming Stage or JavaScript stages with Vault-backed credentials.
> [!TIP]
>
> A future release will introduce Vault API integration for JavaScript stages, including seamless secret value updates without requiring service restarts and improved secret refresh capabilities.
> This integration will change how secrets are accessed in JavaScript stage scripts.
>
> If you use secrets management with JavaScript query stages, review and update your stage configurations before upgrading once this change is released.
## Deprecations
In Fusion 5.18.0, all V1 connectors are deprecated. This means they are no longer being actively developed and will be removed in Fusion 6.
* **Some V1 connectors already have a direct replacement available.** You can find the replacement connector on the [Fusion Connectors Deprecations and Removals page](/docs/fusion-connectors/deprecations-and-removals).
* **For all other V1 connectors, a replacement is still under development.** The documentation is updated when the replacement is available.
If you are using a V1 connector, you must migrate to the replacement connector or a supported alternative before upgrading to Fusion 6. Migrate to the replacement connector as soon as possible to avoid any disruption to your workflows.
## Platform support and component versions
### Kubernetes support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.31, 1.32, 1.33, 1.34, 1.35, 1.36
* **Microsoft Azure Kubernetes Service (AKS):** 1.31, 1.32, 1.33, 1.34, 1.35, 1.36
* **Amazon Elastic Kubernetes Service (EKS):** 1.31, 1.32, 1.33, 1.34, 1.35, 1.36
Lucidworks also supports Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.31, 1.32, 1.33, 1.34, 1.35, 1.36.
RKE2 may require Helm chart modification.
OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-fusion-product-lifecycle#kubernetes-support).
### Components
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.18.0 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
| Helm | 4.1.1 |
See [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-fusion-product-lifecycle) for more information about support dates.
# Fusion 5.19.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.19/5.19.0-release-notes
Released October 22, 2026, this is a [minor release](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#minor-release-support-policy) that introduces a preview of the new Admin UI and automatic scaling for indexing, along with query pinning fixes and security updates.
Watch this video for a quick tour of what's new in Fusion 5.19.
Full details for every change are in these release notes and the linked documentation.
Fusion 5.19 release highlights
Upgrading to the latest version of Fusion 5 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.X and later use an in-place upgrade strategy.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-fusion-product-lifecycle) policy.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### New Admin UI (preview)
Get an early look at the redesigned Fusion Admin UI, available now as a preview alongside the one you already know. It's rebuilt on React to replace the legacy AngularJS interface, with a modern visual style, updated navigation, and improvements to several screens:
* See status and details at a glance in tables for datasources, jobs, pipelines, and more, with status labels, a details panel for the selected object, and a notifications panel.
* Get a better view in the Object Explorer, which now groups and color-codes objects by type and shows the selected object's links next to the list.
* See what each pipeline or parser stage does in Index Workbench and Query Workbench, where a diagram traces a sample input through the selected stage.
* Find the right job type in a more detailed jobs catalog, with full descriptions of each job type.
* Search and inspect your data sooner in Quickstart, which lets you query the first few documents as soon as they're indexed.
Select a screen to see it in the new Admin UI.
Where a slider appears, drag it to compare the screen with the legacy UI.
**Datasources**

New UI

Legacy UI
**Object Explorer**

New UI

Legacy UI
**Index Workbench**

New UI

Legacy UI
**Query Workbench**

New UI

Legacy UI
**Quickstart**

To try it, use the toggle in the top bar of the Admin UI.
The toggle is in both the legacy and new Admin UI, so you can switch between them at any time, and your apps and objects are all there.
Most menu items keep their familiar names and groups, but a few have moved or aren't in the preview yet.
For example, **Jobs** is now under **System**.
Because this is a preview, capabilities and screen locations may change before general availability.
For how to switch between UIs and a full map of where menu items went, see [Try the New Admin UI](/docs/5/fusion/new-fusion-ui).
### Scale indexing automatically with KEDA
Fusion indexing can now scale out and back in automatically as indexing load changes, using a KEDA-based autoscaling trigger.
Delete-by-query and ACL operations now use Kafka offsets as the source of truth, so no operations are duplicated or lost when pods join or leave during a scale event.
Rebalancing uses cooperative partition assignment, so the pods that keep running continue indexing while partitions move.

You pay for extra indexing capacity only while a burst, such as a full catalog refresh, needs it.
Large updates finish sooner, so changes become searchable faster, and nobody has to scale pods by hand before a known spike.
Autoscaling is off by default.
To enable it and configure the Kafka or Prometheus trigger, see [Autoscaling with KEDA](/docs/5/fusion/operations/keda#triggers-for-fusion-indexing).
> **[Autoscaling Fusion with KEDA](https://academy.lucidworks.com/scorm/01a16543-f5f0-7877-ad43-bc635dac0267)**
>
> The course for **Autoscaling Fusion with KEDA** focuses on enabling and tuning event-driven, scheduled, and lag-based autoscaling for the `api-gateway`, `query-pipeline`, and `fusion-indexing` services, including cron, CPU, and Kafka consumer lag triggers, troubleshooting, and how Fusion keeps indexing consistent while pods scale in and out.
### Debug query rewrites faster
You can now turn off specific query rewrites for a single query, the same way you already can for rules.
This lets you find which rewrite causes an unexpected result without changing your live configuration.
To suppress rewrites, pass their IDs in `executionModifiers` on the `/preview` endpoint.
The response still shows which rewrites would have fired, but they don't affect the results.
For example, if a search for "apple charger" ranks laptop power adapters above phone cables, preview the query once with a brand rewrite suppressed and once with a synonym rewrite suppressed.
Whichever change fixes the ranking identifies the rewrite to adjust, and shoppers never see the test.

### Support for Fusion on ARM64
Fusion 5.19 adds preview support for running some services on lower-cost ARM64 nodes.
Services such as `api-gateway`, `fusion-indexing`, and the connectors services can move to ARM64 nodes, while the rest of Fusion stays on x86-64 (amd64) nodes in the same cluster.
ARM64 nodes aren't supported for production workloads in this release, but Lucidworks recommends testing them in a non-production environment now to prepare for a future release.
See [Run Fusion Services on ARM64 Nodes](/docs/5/fusion/operations/survival-guide/arm64-nodes) for the list of supported services and scheduling steps.
### Connectors improvements
Fusion 5.19 includes several updates that streamline the connectors platform and give administrators more control over crawl and plugin behavior.
* **Consistent security trimming across V2 connectors.**
V2 connectors now use graph-based security trimming as their single security-trimming model, so access control works the same way across connectors and the connectors SDK is simpler to build against.
To support this, Fusion removes the legacy static and dynamic security-trimming code paths from the connectors SDK and the `fusion-connectors` service.
Custom connectors built on the static or dynamic security-trimming APIs must move to graph-based security trimming.
* **More reliable Web v2 crawling.**
Fusion ships safer default Selenium Grid settings in the `connector-plugin-service` Helm chart, using modern Selenium 4 environment variable names.
This avoids hung nodes, out-of-memory failures, and silent capacity limits during Web v2 JavaScript-evaluation crawls without requiring manual chart overrides.
- **Better support for air-gapped connectors.**
Fusion adds an option to disable the connectors plugin repository's outbound Google Cloud Storage lookups, preventing repeated failed calls in air-gapped or firewalled environments without outbound internet access.
### Parsing and indexing improvements
Fusion 5.19 includes an update that prevents conflicting stage configurations in the Fusion UI.
* **Fewer conflicting pipeline configurations.**
When you configure a query pipeline stage in the Fusion UI, settings that are alternatives to each other now accept only one choice, so you can't save a stage with conflicting settings.
For example, in the Query Fields stage, **Group Leader Strategy** now lets you fill in either **By Field Value** or **By Sort**, not both.
Previously, only the field description said that these settings couldn't be combined.
### OpenShift-compliant Spark secret handling
Fusion adds an option to disable secret-to-environment-variable injection for Spark jobs, supporting compliance with Red Hat Advanced Cluster Security policies on OpenShift deployments that require the stricter setting.
### Observability improvements
Fusion 5.19 extends OpenTelemetry tracing coverage across more services and message boundaries.
* **Broader OpenTelemetry tracing coverage.**
Fusion adds OpenTelemetry tracing support to the Apps Manager and Admin services, extending the distributed tracing already available for other supported services.
* **End-to-end tracing through Kafka.**
Fusion propagates the W3C `traceparent` header through Kafka messages, creating a continuous distributed trace span from the originating message through downstream consumers instead of losing trace context at the message boundary.
## API changes
* **API for duplicating datasources.**
A new `POST /connectors/datasources/{id}/duplicate` endpoint creates a new datasource by copying the configuration of an existing V2 (SDK) datasource. You provide the ID for the new datasource and can optionally override its description, app, and collection. Classic (V1) datasources can't be duplicated.
See [Fusion APIs](/api-reference/datasource-configuration-api/duplicate-a-datasource) for an example.
This lays the groundwork for a future Duplicate action in the datasource UI, so datasources with mostly identical configuration no longer need to be recreated from scratch.
* **Option to create Kafka topics for subscriptions.**
The `POST /subscriptions` and `PUT /subscriptions/{id}` endpoints accept a new optional `create` query parameter. When `create` is `true`, Fusion creates the subscription's Kafka topic if it doesn't already exist, instead of rejecting the request.
See [Fusion APIs](/api-reference/subscriptions-api/create-a-subscription) for details.
* **OAuth scopes in Proxy API responses.**
The `POST /oauth2/register` response now includes a `scope` field that lists the scopes granted to the registered client. The `GET /.well-known/oauth-protected-resource` response now includes a `scopes_supported` field that lists the scopes the protected resource supports.
See [Fusion APIs](/api-reference/oauth-20/register-oauth-21-client) for details.
* **Admin API spec shows lowercase enum values.**
The Admin API spec now shows these enum values in lowercase, matching what the API has always sent and accepted:
* `AuthConfig.authType`: `none`, `basic`, and `kerberos`.
* `CallParams.method`: `get`, `put`, `post`, and `delete`.
* The `type` field in `AnyType` and `ObjectType`: `string`, `number`, `integer`, `boolean`, `object`, `array`, `null`, and `ref`.
Earlier versions of the spec showed these values capitalized, such as `NONE` or `String`.
The API accepts these values in any case, so requests that use uppercase values continue to work, but responses always use lowercase.
No changes to your applications are needed.
See [Fusion APIs](/api-reference/search-cluster/create-a-cluster) for an example of a schema that uses `AuthConfig`.
* **Parser updates create missing parsers.**
The Async Parsing `PUT /async-parsing/parsers/{id}` endpoint now creates the parser if no parser with the specified ID exists, instead of only updating an existing parser.
See [Fusion APIs](/api-reference/parsers-crud-api/update-a-parser) for an example.
- **Connectors SDK 4.3.0.**
Fusion 5.19 supports Connectors SDK 4.3.0, which adds graph-based security trimming with a sidecar collection.
For the SDK version that matches each Fusion release, see the [Connectors SDK support matrix](/docs/5/fusion/dev-portal/connectors-sdk/overview#connectors-sdk-support-matrix).
## Bug fixes
### Connectors
* **The first recrawl after upgrading to Fusion 5.18.0 reindexed all documents.**
In Fusion 5.18.0, where this issue was first found, the first recrawl after upgrading from Fusion 5.9 through 5.17 treated every document in each affected datasource as changed and sent it through indexing again, because those earlier versions don't store document signatures.
This known issue from Fusion 5.18 is fixed.
Upgrading to Fusion 5.19.0 no longer causes a full reindex on the first recrawl.
* **Some connectors re-fetched every item on every recrawl.**
In previous versions of Fusion, starting with 5.18.0, Web V2, file system, and SMB connectors didn't receive the stored state they use to skip unchanged items, such as ETag and Last-Modified values for Web V2 or modification times for files. As a result, every recrawl re-fetched every page or re-read every file instead of only changed items. This issue is fixed.
Fusion now replays stored state to connectors on recrawl, so they fetch only changed items.
> [!NOTE]
>
> To return to the Fusion 5.18.0 recrawl behavior, globally or for specific datasources, set these JVM system properties in `javaToolOptions` for the `connectors-backend` service:
>
> ```java wrap theme={"dark"}
> -Dcom.lucidworks.connectors.recrawl.mode=replay|rediscover
> -Dcom.lucidworks.connectors.recrawl.mode.rediscoverDatasourceIds=,
> -Dcom.lucidworks.connectors.recrawl.mode.replayDatasourceIds=,
> ```
>
> Set `com.lucidworks.connectors.recrawl.mode` to `rediscover` to re-fetch every item on recrawl. Leave it at the default, `replay`, to fetch only changed items. Add a datasource ID to `rediscoverDatasourceIds` or `replayDatasourceIds` to override the global value for that datasource. Restart the service to apply your changes.
* **Nested connector properties displayed out of order.**
In previous versions of Fusion, the connector configuration UI ignored the `@Property(order = N)` annotation on nested or grouped properties, so nested fields appeared in an unpredictable order.
This issue is fixed.
Fusion now applies the declared order to nested properties as well as top-level properties.
- **Connector jobs hung on unexpected crawl errors.**
In previous versions of Fusion, some unexpected crawl errors, such as a missing reactor error handler or a CrawlDB write failure, could leave connector jobs hanging indefinitely instead of failing.
This issue is fixed.
Fusion now fails these jobs with a meaningful error message.
- **Cleared datasource values appeared masked.**
In previous versions of Fusion, clearing a datasource configuration value and saving it could cause the field to show masked dots instead of appearing empty.
This issue is fixed.
Fusion now displays cleared values as empty.
- **Brief Solr outages failed connector jobs.**
In previous versions of Fusion, a transient Solr outage during a connector job's unprocessed-document count check could cause the job to fail.
This issue is fixed.
Fusion now retries this request, so brief Solr interruptions no longer fail the job.
- **Connector Helm charts exposed TLS passwords.**
In previous versions of Fusion, connector Helm charts rendered TLS keystore and truststore passwords in plaintext in Kubernetes resources, where anyone with read access to those resources could see them.
This issue is fixed.
Fusion now keeps these passwords out of rendered resources, matching the fix already applied to other Fusion services.
- **Some Microsoft Office documents failed to parse.**
In previous versions of Fusion, a parser initialization error caused some Microsoft Office documents to fail to parse, so their content wasn't indexed.
This issue is fixed.
Fusion now parses these documents correctly.
- **Connectors included a Solr remote code execution vulnerability.**
In previous versions of Fusion, `connectors-backend` bundled a version of `solr-core` affected by CVE-2025-24814, a remote code execution vulnerability.
This issue is fixed.
Fusion now removes or upgrades the vulnerable dependency in `connectors-backend`.
- **Connectors included a Netty denial-of-service vulnerability.**
In previous versions of Fusion, the gRPC library in `fusion-connectors` bundled a Netty version affected by CVE-2025-55163, an HTTP/2 vulnerability that attackers could use to cause a denial of service.
This issue is fixed.
Fusion now uses a gRPC version that bundles a patched Netty.
Connector plugin loading is unaffected.
- **Connector plugins could fill the Kafka volume.**
In previous versions of Fusion, each connector plugin published its full configuration to a Kafka topic every second, about 18 GB per day, so several plugins could fill the default 8 Gi Kafka volume and take Fusion down.
This issue is fixed.
Fusion now publishes plugin availability every 60 seconds instead of every second, compresses these messages, and limits the size and retention of the `fusion.connectors.plugin-notifications` topic.
The topic limits also apply to existing installations when the connectors RPC service starts.
### Search and query
* **Boost rules applied boosts to the wrong terms.**
In previous versions of Fusion, the `block_groups_list` feature of `BoostAttributesRule` could bind a boost factor to the wrong term and incompletely escape generated boost function queries, so results were boosted incorrectly.
This issue is fixed.
Fusion now binds boost factors to their intended terms and fully escapes generated queries.
* **Pinned documents ignored the `fl` field list.**
In previous versions of Fusion, pinned documents returned all fields instead of the fields set by `fl` in the Query Fields stage.
This issue is fixed.
Fusion now applies the same `fl` filter to pinned documents as to organic results.
* **Pinned rules stopped working after upgrading to 5.17.2.**
In previous versions of Fusion, upgrading to 5.17.2 could cause working pinned rules to stop applying, because pin rule processing changed how the boost list rule rewrote the query.
This issue is fixed.
Fusion now applies pinned rules consistently after upgrading.
* **Pinned documents appeared twice.**
In previous versions of Fusion, a document that pinning moved to a later results page could appear twice: once at its organic rank and again at its pinned position.
This issue is fixed.
Fusion now removes the duplicate entry.
* **Multi-phase pinning returned inconsistent results.**
In previous versions of Fusion, multi-phase pinning could return more documents than the requested `rows` value, and its supplemental lookup query could inherit an unintended `defType` from earlier rule processing.
This issue is fixed.
Fusion now truncates merged results to the requested page size and forces `defType=lucene` on the supplemental lookup query.
* **Multi-phase pinning dropped `fl` fields and `fq` filters.**
In previous versions of Fusion, the multi-phase pinning supplemental query kept only the first `fl` value and ignored non-collapse `fq` filters, so pinned documents could be missing fields or ignore filters.
This issue is fixed.
Fusion now preserves all requested `fl` fields and applies `fq` filters to the supplemental query.
* **Pinning many documents caused URI Too Long errors.**
In previous versions of Fusion, the multi-phase pinning supplemental query could fail with an HTTP 414 URI Too Long error when many pinned documents needed to be fetched.
This issue is fixed.
Fusion now sends this query as a POST request, which avoids URI length limits.
### Parsing and indexing improvements
* **Large bulk index requests timed out.**
In previous versions of Fusion, the Index Pipelines API could time out on bulk index requests of 400 or more documents, causing batch jobs to fail with read timeout errors.
This issue is fixed.
Fusion now handles large bulk index batches without timing out.
### Security and dependency updates
* **SnakeYAML 1.x exposed Fusion to known vulnerabilities.**
In previous versions of Fusion, services used SnakeYAML 1.x, which has known CVEs.
This issue is fixed.
Fusion now uses SnakeYAML 2.x.
- **Invalid Vault credentials weren't detected until query time.**
In previous versions of Fusion, the Active Directory Security Trimming stage and JavaScript stages (GraalVM, Nashorn, and OpenJDK Nashorn) resolved Vault-backed credentials on each request instead of at stage initialization.
Pipelines with invalid or unavailable credentials deployed successfully and failed only when the first query arrived.
This known issue from Fusion 5.18 is fixed.
Fusion now resolves and validates Vault-backed credentials during stage initialization, so configuration problems surface at deploy time.
- **Base container images included known vulnerabilities.**
In previous versions of Fusion, base container images included packages with known vulnerabilities.
This issue is fixed.
Fusion now uses updated base container images.
- **Some services used an older Netty version.**
In previous versions of Fusion, some services used an older Netty version than the rest of the platform, so they lacked the latest Netty security patches.
This issue is fixed.
Fusion now uses the same Netty version across all services.
### SDKs and services
* **The LWAI Batch Vectorize stage failed when its token expired.**
In previous versions of Fusion, the LWAI Batch Vectorize stage could keep using an expired authentication token and didn't clearly report the resulting failure.
This issue is fixed.
Fusion now refreshes the token before it expires and reports authentication failures clearly.
### Operational stability and build reliability
* **API Gateway requests were intermittently slow.**
In previous versions of Fusion, starting with 5.17.2 and 5.18.0, a small percentage of API Gateway requests took more than a second to complete, even though query pipeline and Solr execution remained fast.
This issue is fixed.
Fusion now delivers consistent API Gateway request latency under load.
* **Solr was affected by a configset remote code execution vulnerability.**
In previous versions of Fusion, the bundled Solr 9.6.1 was affected by CVE-2025-24814, a vulnerability in how Solr loads `` directives from configsets.
Fusion's default configsets don't use `` directives, but this issue is fixed.
Fusion now includes the upstream Solr fix, which ignores `` directives in `solrconfig.xml` by default.
> [!WARNING]
>
> If a custom configset uses `` directives to load JAR files, set the `SOLR_CONFIG_LIB_ENABLED` environment variable to `true` on your Solr pods before you upgrade.
> Otherwise, Solr ignores those directives and doesn't load the JAR files.
## Known issues
* **Running more than one MCP server replica breaks the `/mcp` endpoint.**
MCP sessions are stored in each pod, so requests routed to a different replica fail.
Run a single MCP server replica.
* **Collections with mixed replica types can fail to create on 3-node clusters.**
Creating a collection with NRT, TLOG, and PULL replicas can fail with a "Not enough eligible nodes" error on a 3-node high-availability cluster.
* **The Parallel Bulk Loader can duplicate documents during atomic updates.**
When `atomicUpdates` is `true` and `outputPartitions` is greater than `1`, the job adds duplicate documents instead of updating existing ones.
* **Calls between services can fail intermittently in multi-replica deployments.**
Service discovery can intermittently lose healthy services, so calls fall back to `http://:80` and fail.
This can affect deployments and API calls to services such as `fusion-admin` and `classic-rest-service`.
* **Indexing can drop documents without reporting an error.**
When Solr is temporarily unavailable, under heavy load, or returns errors, the index pipeline can discard documents after logging a warning or error.
The connector job still reports success, so the missing documents aren't indexed and no failure is surfaced.
Compare document counts in the datasource and the collection after large indexing jobs.
## Deprecations
Fusion 5.19 deprecates these features, which are expected to be removed in Fusion 6.0:
* **Legacy Admin UI.** Use the [new Admin UI](/docs/5/fusion/new-fusion-ui) instead.
* **Reverse Search.**
* **Seldon.** This includes the Create Seldon Core Model Deployment and Delete Seldon Core Model Deployment jobs, and Seldon models in the Ray/Seldon Vectorize Field and Ray/Seldon Vectorize Query stages.
* **Content-Based Recommender job.**
* **Smart Answers Supervised Training job.**
* **Smart Answers Evaluate Pipeline job.**
* **`fusion-classification` service.**
* **gRPC `ml-model-service` API.**
For details, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
## Removals
Fusion 5.19 removes these connectors framework features:
* **Static and dynamic security trimming.** V2 connectors now support only graph-based security trimming.
* **Connectors `ConfigsApi` endpoints.** Use the `DataSourcesApi` endpoints instead.
For details, see [Fusion Connectors Deprecations and Removals](/docs/fusion-connectors/deprecations-and-removals#connectors-platform-features).
## Platform support and component versions
### Kubernetes support
Lucidworks has tested and validated Fusion 5.19 on Google Kubernetes Engine (GKE) 1.31, 1.32, 1.33, 1.34, 1.35, and 1.36.
Lucidworks also supports these platforms on versions based on Kubernetes 1.31 through 1.36:
* Microsoft Azure Kubernetes Service (AKS)
* Amazon Elastic Kubernetes Service (EKS)
* Rancher Kubernetes Engine (RKE and RKE2)
* OpenShift 4
RKE2 may require Helm chart modification.
OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-semantic-version-support-lifecycle#kubernetes-support).
### Components
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.19.0 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.56.0 |
| Helm | 4.1.1 |
See [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-fusion-product-lifecycle) for more information about support dates.
# Fusion 5.9.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.0-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.0-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.0-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/kpv8sh
Released on June 29, 2023, this [long-term release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#long-term-support-release-policy) includes the new Consumption Dashboard feature, adding Tika Asynchronous Parsing support for remote V2 connectors, and new version requirements for the LDAP ALCs V2 connector and the SharePoint Optimized V2 connector.
To learn more, skip to the [release notes](#new-features).
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.25 and 1.26
* **Microsoft Azure Kubernetes Service (AKS):** 1.25 and 1.26
* **Amazon Elastic Kubernetes Service (EKS):** 1.25 and 1.26
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.25 and 1.26. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.0 *(based on Solr 9.1.1)* |
| **ZooKeeper** | 3.7.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
> [!WARNING]
>
> Upgrades from Fusion 5.8.0
>
> Fusion 5.8.1 fixed an issue with the Fusion 5.8.0 Helm chart that prevented horizontal pod autoscaling.
>
> If you are upgrading from Fusion 5.8.0 to any later version and use horizontal pod autoscaling, you must complete the procedure detailed in the [Fusion 5.8.1 release notes](/docs/5/fusion/release-notes/more/5.8.1-release-notes).
## New Features
* The new [Consumption Dashboard](/docs/5/fusion/operations/monitoring-and-reporting/consumption) tracks your request and document usage against the allotted consumption in your Fusion license. To access the dashboard, log into Fusion and go to **Analytics > Consumption**.
> **[The Consumption Dashboard](https://academy.lucidworks.com/the-consumption-dashboard)**
>
> The course for **The Consumption Dashboard** focuses on the purpose and function of this dashboard as well as how to navigate it using the Fusion Admin UI.
## Improvements
### Fusion
* Fusion now supports Kubernetes 1.25 and 1.26. This applies to GKE, AKS, and EKS. It also applies to Rancher (RKE) and OpenShift 4 versions that are compatible with Kubernetes 1.25 and 1.26. Refer to Kubernetes documentation for versions [1.25](https://kubernetes.io/blog/2022/08/04/upcoming-changes-in-kubernetes-1-25/) and [1.26](https://kubernetes.io/blog/2022/11/18/upcoming-changes-in-kubernetes-1-26/) to decide which version to use for your deployment.
* Added a new Admin button to the Rules Editor screen. Click on it to log out of Fusion.
* Improved Spark Solr’s performance to ingest and transport data, as well as setting the most efficient sort for data export.
### Fusion Connectors
* Remote V2 connectors now support Tika Asynchronous Parsing. You can **Use Tika Asynchronous Parsing** on [remote V2 connectors](/docs/fusion-connectors/developers/remote-v2-connectors) to separate document crawling from document parsing, which is useful for large sets of complex documents.
> **Use Tika Asynchronous Parsing**
>
> This document describes how to set up your application to use Tika asynchronous parsing.
>
> Unlike synchronous Tika parsing, which uses a parser stage, asynchronous Tika parsing is configured in the datasource and index pipeline. For more information, see [Asynchronous Tika Parsing](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing).
>
> > [!TIP]
> >
> > **Field names change with asynchronous Tika parsing.**
> >
> > In contrast to synchronous parsing, asynchronous Tika parsing prepends `parser_` to fields added to a document. System fields, which start with `\_lw_`, are not prepended with `parser_`. If you are migrating to asynchronous Tika parsing, and your search application configuration relies on specific field names, update your search application to use the new fields.
>
> ## Configure the connectors datasource
>
> 1. Navigate to your datasource.
> 2. Enable the **Advanced** view.
> 3. Enable the **Async Parsing** option.
>
> 
>
> > [!TIP]
> >
> > **Fusion 5.9.11 and later uses your parser configuration when using asynchronous parsing.**
> >
> > The asynchronous parsing service performs Tika parsing using Apache Tika Server. In Fusion 5.8 through 5.9.10, other parsers, such as HTML and JSON, are not supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is ignored. In Fusion 5.9.11 and later, other parsers, such as HTML and JSON, are supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is used.
> 4. Save the datasource configuration.
>
> ## Configure the parser stage
>
> > [!TIP]
> >
> > You must do this step in Fusion 5.9.11 and later.
>
> 1. Navigate to **Parsers**.
> 2. Select the parser, or create a new parser.
> 3. From the **Add a parser stage** menu, select **Apache Tika Container Parser**.
> 4. (Optional) Enter a label for this stage. This label changes the names from Apache Tika Container Parser to the value you enter in this field.
> 5. If the Apache Tika Container Parser stage is not already the first stage, drag and drop the stage to the top of the stage list so it is the first stage that runs.
>
> ## Configure the index pipeline
>
> 1. Go to the **Index Pipeline** screen.
> 2. Add the **Solr Partial Update Indexer** stage.
> 3. Turn off the **Reject Update if Solr Document is not Present** option and turn on the **Process All Pipeline Doc Fields** option:
>
> 
> 4. Include an extra update field in the stage configuration using any update type and field name. In this example, an incremental field `docs_counter_i` with an increment value of `1` is added:
>
> 
> 5. Enable the **Allow reserved fields** option:
>
> 
> 6. Click **Save**.
> 7. Turn off or remove the **Solr Indexer stage**, and move the **Solr Partial Update Indexer stage** to be the last stage in the pipeline.
>
> 
>
> Asynchronous Tika parsing setup is now complete. Run the datasource indexing job and monitor the results.
* Updated the connectors-sdk library version to Java 11.
* Updated Fusion to prevent automatically updating V2 connector plug-ins. Intentional updates allow you to verify related functions and operations.
* Updated Fusion to specify pod resources for connector plug-in type to ensure optimal capability and performance.
## Other changes
### Babel Street (formerly Basistech) Compatibility
* Fusion 5.9.0 and later can reference a new Solr 9.0/9.1 image that comes bundled with Babel Street JAR files.
### Fusion Connectors
* Fusion 5.9.0 introduces new version requirements for the LDAP ACLs V2 and SharePoint Optimized V2 connectors. The [LDAP ACLs V2 connector](/docs/fusion-connectors/connectors/ad-acl-ldap) must use version 1.5.0 or later, and the [SharePoint Optimized V2 connector](/docs/fusion-connectors/connectors/sharepoint-v2-optimized) must use version 1.6.0 or later.
## Bug Fixes
### Fusion
* Fixed an issue where the parsing endpoint in the indexing service did not parse a DOC file or other Microsoft Word documents. The Apache POI was updated with the `log4j` API.
### Fusion Connectors
* Fixed an issue where clearing the `crawldb` for the Access Control List (ACL) datasource also deletes the ACLs.
* Fixed an issue where the Box.com V2 connector did not start successfully when a Fusion branch was deployed.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.9.1
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.1-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.1-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.1-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/ht2sax
Released on September 5, 2023, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes corrections to remote connectors, the JDBC V2 connector, and LDAP ACL documents.
To learn more, skip to the [release notes](#bug-fixes).
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.25 and 1.26
* **Microsoft Azure Kubernetes Service (AKS):** 1.25 and 1.26
* **Amazon Elastic Kubernetes Service (EKS):** 1.25 and 1.26
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.25 and 1.26. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.1 *(based on Solr 9.1.1)* |
| **ZooKeeper** | 3.7.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Bug Fixes
### Fusion Connectors
* Fixed an issue to make gRPC max outbound message size configurable to prevent remote connectors from failing on large field sizes.
* Fixed an issue where a restart was required when the remote JDBC V2 connector timed out and did not restart correctly.
* Fixed an issue where the JDBC V2 connector failed to index data.
* Fixed an issue where the Connectors SDK delete-by-query that contains a NOT-EQUAL phrase did not delete the appropriate documents.
* Fixed an issue where the outbound access control list (ACL) object contained a reference to itself in the `outbound_ss` field by default. The plug-in that creates the ACL should enter that reference explicitly only when required.
* Fixed an issue where the connectors-backend service did not add the following fields by default to the LDAP ACL documents: `_lw_data_source_type_s`, `_lw_batch_id_s`, `_lw_data_source_collection_s`, and `_lw_block_start_time_l`. These fields are required by the LDAP plug-in to keep the list of ACL objects up-to-date.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.9.10
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.10-release-notes
February 20, 2025
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.10-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.10-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/kf2gbd
Fusion 5.9.10 is a [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) that introduces enhanced capabilities for Neural Hybrid Search, that improve search relevance for ecommerce by intelligently blending semantic and lexical signals and optimizing result collapsing.
Support for Kubernetes 1.31 boosts container security and operational reliability, while the Spark 3.4.1 upgrade accelerates data processing and analytics.
Additional security updates and the new Apps Manager API strengthen system protection and give better visibility into licensing and usage.
Collectively, these improvements drive more accurate search, faster data workflows, and a more secure, stable platform—delivering clear business value across search, infrastructure, and data operations.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.10-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#component-versions).
## What’s new
### Improved relevance with Neural Hybrid Search
Fusion 5.9.10 introduces the Neural Hybrid Query stage, enhancing Neural Hybrid Search (NHS) by refining how semantic and lexical scores are combined in search ranking.
This new stage works with Lucidworks AI to ensure that result collapsing and final ranking use a unified scoring approach, leading to more precise and consistent search results—especially in ecommerce, where selecting the most relevant SKU for a product is critical.
Key benefits include:
* **Smarter relevance ranking:** Combines semantic and lexical signals earlier for more accurate ordering.
* **Optimized result collapsing:** Ensures the best representative item is selected before final ranking.
* **Broad applicability:** Enhances search performance in ecommerce and other scenarios that use result collapsing.
The [Neural Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query) differs from the [Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/hybrid-search-query) in a few ways. The new stage contains the following new fields:
* **Lexical Query Squash Factor** lets you input a value that squashes the lexical query scores from `0..inf` to `0..1`. This setting helps prevent the lexical query from dominating the final score.
* **Compute Vector Similarity for Lexical-Only Matches** computes vector similarity scores for documents found in lexical search results, but not in the initial vector search results. This setting can rescue orphaned nodes by finding docs which match lexically but are not in the vector results, and compute the vector similarity score for those.

This update provides a more intelligent hybrid search experience, improving relevance across a range of search applications.
### Support for Kubernetes 1.31
Fusion 5.9.10 introduces support for Kubernetes 1.31, bringing enhanced security, improved resource management, and better networking reliability.
This update strengthens container security, improves how custom resources are managed and filtered, and enhances the reliability of `kubectl` operations like `exec` and `port-forward`, especially in complex network environments.
By upgrading to Fusion 5.9.10, you can take full advantage of Kubernetes 1.31’s advancements for stronger security, streamlined resource handling, and improved system stability.
### Expanded support for read-only file system
Fusion 5.9.11 completes support for the read-only root file system feature across all Fusion services, strengthening protection against unauthorized changes and improving security posture in hardened environments.
All services can now be configured to run in read-only mode using Helm values, with writable mounts available for components that require write access.
To learn more, including which services have this feature enabled by default, see
**Enable Read-Only Root File System**.
> **Enable Read-Only Root File System**
>
> This topic describes how to configure a read-only root file system for a Fusion deployment.
> Read-only mode safeguards your file system against unauthorized changes, such as by malicious software or other attacks.
> Enabling this feature entails configuring the `readOnlyRootFilesystem` attribute in the Fusion Helm chart.
>
> > [!NOTE]
> >
> > This feature is available starting in Fusion 5.9.9 and in all subsequent Fusion 5.9 releases.
>
> Beginning with Fusion 5.9.10, all of [Fusion’s services](/docs/5/fusion/reference/microservices) are designed to work with a read-only root file system, but some external services may require write access to the file system.
> In that case, you can configure a read-only root file system and mount a separate writable file system for these services.
>
> The examples below show how to configure a read-only root file system for various Fusion services.
>
> ## Solr
>
> ```yaml theme={"dark"}
> fusion:
> solr:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml theme={"dark"}
> fusion:
> solr:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Zookeeper
>
> ```yaml theme={"dark"}
> fusion:
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml theme={"dark"}
> fusion:
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> exporters:
> jmx:
> enabled: true
> zookeeper:
> enabled: true
> jobs:
> chroots:
> enabled: true
> config:
> create:
> - /root-read-only
> ```
>
> ## Kafka
>
> ```yaml theme={"dark"}
> fusion:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml expandable theme={"dark"}
> fusion:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> volumePermissions:
> enabled: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> metrics:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> jmx:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> externalAccess:
> enabled: true
> autoDiscovery:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> provisioning:
> enabled: true
> topics:
> - name: test
> partitions: 1
> replicationFactor: 1
> ## https://kafka.apache.org/documentation/#topicconfigs
> config:
> max.message.bytes: 64000
> flush.messages: 1
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> ```
>
> ## ML Model Service
>
> ```yaml expandable theme={"dark"}
> fusion:
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> With optional services:
> fusion:
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> prometheusExporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> metrics:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> cluster:
> enabled: false
> mishards:
> securityContext:
> readOnlyRootFilesystem: true
> admin:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Argo
>
> ```yaml theme={"dark"}
> fusion:
> argo:
> minio:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Seldon Core Operator
>
> ```yaml theme={"dark"}
> fusion:
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Argo Common Workflows
>
> ```yaml theme={"dark"}
> fusion:
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Question Answering
>
> ```yaml theme={"dark"}
> fusion:
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Classification
>
> ```yaml theme={"dark"}
> fusion:
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## All-in-one values.yaml example
>
> ```yaml expandable theme={"dark"}
> fusion:
> solr:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> solr-managed:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> argo:
> minio:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## All-in-one values.yaml with optional services example
>
> ```yaml expandable theme={"dark"}
> fusion:
> argo:
> minio:
> persistence:
> enabled: false
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> solr:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> # tls:
> # enabled: true
> solr-managed:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> enableExternalFiles: true
> enabledStorage:
> - gcs
> processRaw:
> image:
> repository: fusion-dev-docker.ci-artifactory.lucidworks.com
> cloudRoot: gs://lw-managed-fusion-data/tmp
> gcs:
> secret: gcs-key
> secretFieldName: key.json
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> # tls:
> # enabled: true
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> exporters:
> jmx:
> enabled: true
> zookeeper:
> enabled: true
> jobs:
> chroots:
> # enabled: true
> config:
> create:
> - /root-read-only
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> volumePermissions:
> enabled: true
> image:
> repository: "fusion-dev-docker.ci-artifactory.lucidworks.com/os-shell"
> containerSecurityContext:
> readOnlyRootFilesystem: true
> metrics:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> jmx:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> externalAccess:
> enabled: true
> autoDiscovery:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> provisioning:
> enabled: true
> topics:
> - name: test
> partitions: 1
> replicationFactor: 1
> ## https://kafka.apache.org/documentation/#topicconfigs
> config:
> max.message.bytes: 64000
> flush.messages: 1
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> ml-model-service:
> enabled: true
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> prometheusExporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> metrics:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> cluster:
> enabled: false
> mishards:
> securityContext:
> readOnlyRootFilesystem: true
> admin:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Supported services
>
> The table below lists the services that support a read-only root file system, the ones that have it enabled by default, and the Fusion release in which support was added:
>
> | Chart Name | Pod Name | Container Name | Supported | Default enabled | Supported version |
> | - | - | - | - | - | - |
> | admin-ui | admin-ui | admin-ui | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | init/api-gateway | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | api-gateway | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | generate-jks | ✅ | ✅ | 5.9.9+ |
> | apps-manager | apps-manager | apps-manager | ✅ | ✅ | 5.9.9+ |
> | argo | argo-server | argo-server | ✅ | ❌ | 5.9.10+ |
> | argo | argo-executor | executor | ✅ | ❌ | 5.9.10+ |
> | argo | argo-mainContainer | mainContainer | ✅ | ❌ | 5.9.10+ |
> | argo | argo-controller | controller | ✅ | ✅ | 5.9.10+ |
> | argo/minio | minio | minio | ✅ | ❌ | 5.9.10+ |
> | argo/minio | minio | minio | ✅ | ❌ | 5.9.10+ |
> | argo/minio | make-bucket-job | minio-mc | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | delete-model | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | deploy-model | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | milvus-maintenance | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | upload-model-to-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | async-parsing | async-parsing | tika-server | ✅ | ✅ | 5.9.9+ |
> | async-parsing | async-parsing | async-parsing | ✅ | ✅ | 5.9.9+ |
> | auth-ui | auth-ui | auth-ui | ✅ | ✅ | 5.9.9+ |
> | classic-rest-service | classic-rest-service | init/import-certs | ✅ | ✅ | 5.9.10+ |
> | classic-rest-service | classic-rest-service | classic-rest-service | ✅ | ✅ | 5.9.9+ |
> | classification | argo/classification | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | connector-plugin | connector-plugin | init/import-certs | ✅ | ❌ | 5.9.10+ |
> | connector-plugin | connector-plugin | connector-plugin | ✅ | ✅ | 5.9.9+ |
> | connectors | connectors | connectors | ✅ | ✅ | 5.9.9+ |
> | connectors-backend | CRD | | ✅ | ✅ | 5.9.9+ |
> | connectors-backend | connectors-backend | connectors-backend | ✅ | ✅ | 5.9.9+ |
> | fusion-admin | fusion-admin | admin | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-admin | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-api-gateway | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-indexing | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-kafka | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-logstash | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-pulsar | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | setup-keystore-and-properties | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-zk | ✅ | ✅ | 5.9.9+ |
> | fusion-config-sync | fusion-config-sync | fusion-config-sync | ✅ | ✅ | 5.9.9+ |
> | fusion-data-augmentation | argo/data-augmentation/volume-fix | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/init-workspace | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/write-job-configs | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/write-io-configs | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/add-zkhost | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/pull-data-training-and-metadata | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/pull-data-training-and-metadata-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/volume-fix2 | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/synonym-list | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/download-synonym-dictionary | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/keystroke-list | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/download-keystroke-blob | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/augment | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/push-augmented-data | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/push-augmented-data-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-indexing | fusion-indexing | fusion-indexing | ✅ | ✅ | 5.9.9+ |
> | fusion-resources | fusion-resources-secret-hook | setup-keystore-and-properties | ✅ | ✅ | 5.9.10+ |
> | insights | insights | insights | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher | job-launcher | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher-spark-cleanup | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | job-launcher | spark-kubernetes-driver | spark-kubernetes-driver | ✅ | ❌ | 5.9.10+ |
> | job-launcher | spark-kubernetes-executor | spark-kubernetes-executor | ✅ | ❌ | 5.9.10+ |
> | job-rest-server | job-rest-server | job-rest-server | ✅ | ✅ | 5.9.9+ |
> | kafka | kafka-metrics | kafka-exporter-archived | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka-provisioning | init/wait-for-available-kafka | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka-provisioning | kafka-provisioning | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | kafka | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | jmx-exporter | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | init/check-zk | ✅ | ✅ | 5.9.9+ |
> | kafka | kafka | init/auto-discovery | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | init/volume-permissions | ✅ | ❌ | 5.9.10+ |
> | lwai-gateway | lwai-gateway | lwai-gateway | ✅ | ✅ | 5.9.9+ |
> | ml-model-service | ml-model-service | java-service | ✅ | ✅ | 5.9.9+ |
> | ml-model-service | ml-model-service-namespace-hook | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | ml-model-service/ambassador | ambassador | ambassador | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/ambassador | ambassador | prometheus-exporter | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | milvus | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | init/create-for-share-storage | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-admin | admin | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-admin | init/wait-for-milvus | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | mishards | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus/mysql | mysql | init/remove-lost-found | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus/mysql | mysql | mysql | ✅ | ❌ | 5.9.10+ |
> | pm-ui | pm-ui | pm-ui | ✅ | ✅ | 5.9.9+ |
> | query-pipeline | query-pipeline | query-pipeline | ✅ | ✅ | 5.9.9+ |
> | question-answering | argo/qna-coldstart/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/add-zkHost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/pull-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/pull-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/post-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/apply-seldon-deployment | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/pull-qa-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/pull-qa-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/train-with-texts | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/post-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/apply-seldon-deployment | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/pull-eval-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/pull-eval-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/evaluate | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/push-eval-results-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/push-eval-results | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/pull-data-training-and-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/pull-data-training-and-metadata-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/train-with-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/train-without-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/push-recommendations | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/push-recommendations-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/add-default-exclude-query | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/copy-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/pull-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/pull-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/push-content | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/push-content-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/add-default-exclude-query | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/delete-old-content-recommendations | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | reverse-search | reverse-search | init/set-reverse-search-zone | ✅ | ✅ | 5.9.10+ |
> | reverse-search | reverse-search | init/check-zk | ✅ | ✅ | 5.9.9+ |
> | reverse-search | reverse-search | init/enable-tls-in-reverse-search | ✅ | ✅ | 5.9.10+ |
> | reverse-search | reverse-search | reverse-search | ✅ | ❌ | 5.9.10+ |
> | rules-ui | rules-ui | rules-ui | ✅ | ✅ | 5.9.9+ |
> | seldon-core-operator | seldon-controller-manager | manager | ✅ | ❌ | 5.9.10+ |
> | seldon-core-operator | seldon-spartakus-volunteer | seldon-spartakus-volunteer | ✅ | ❌ | 5.9.9+ |
> | seldon-core-operator | crd/SeldonDeployment | | ✅/❌ | ❌ | 5.9.9+ |
> | solr | solr | init/set-solr-zone | ✅ | ✅ | 5.9.10+ |
> | solr | solr | init/enable-tls-in-solr | ✅ | ✅ | 5.9.10+ |
> | solr | configset-bootstrap | configset-bootstrap | ✅ | ✅ | 5.9.10+ |
> | solr | solr | solr | ✅ | ❌ | 5.9.10+ |
> | solr | solr-exporter | exporter | ✅ | ❌ | 5.9.10+ |
> | solr | solr-exporter | init/solr-init | ✅ | ✅ | 5.9.10+ |
> | solr-managed | configset-bootstrap | configset-bootstrap | ✅ | ✅ | 5.9.10+ |
> | solr-managed | exporter | exporter | ✅ | ❌ | 5.9.10+ |
> | solr-managed | exporter | init/solr-init | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | init/set-solr-zone | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | init/enable-tls-in-solr | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | solr | ✅ | ❌ | 5.9.10+ |
> | solr-managed | solr | process-raw | ✅ | ❌ | 5.9.10+ |
> | solr-backup-runner | solr-backup-runner-backup | solr-backups | ✅ | ❌ | 5.9.10+ |
> | solr-backup-runner | solr-backup-runner-prune | solr-prune | ✅ | ❌ | 5.9.10+ |
> | templating | templating | templating | ✅ | ✅ | 5.9.9+ |
> | webapps | webapps | webapps | ✅ | ✅ | 5.9.9+ |
> | zookeeper | zookeeper | zookeeper | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper | jmx-exporter | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper | zookeeper-exporter | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper-chroots | main | ✅ | ❌ | 5.9.10+ |
### Faster, more efficient data processing with Spark 3.4.1
Fusion 5.9.10 upgrades Apache Spark to 3.4.1, bringing faster query execution, improved data transformation efficiency, and greater stability for distributed workloads.
This enhancement optimizes indexing, refines SQL query handling, and ensures smoother analytics workflows, enabling you to process large-scale data with greater speed and precision.
For more details, see the [Spark 3.4.1 release notes](https://spark.apache.org/releases/spark-release-3-4-1.html).
The Apache Spark 3.4.1 upgrade impacts jobs that use Python 3.7 behavior or compatibility, which may have automatically updated to Python 3.10.x and no longer function correctly. Update your code to ensure compatibility with Python 3.10.x and then test your Spark jobs in a staging environment before deploying to production.
### Enhanced security and stability
Fusion 5.9.10 introduces a new wave of security enhancements, ensuring a more resilient and up-to-date platform. This release includes critical updates across core services, including admin, frameworks, apps manager, classic connectors, and query indexing, reinforcing protection across the stack. Additionally, we’ve updated the `bitnami-shell` base image and upgraded `key-tools` to v3.0.2, further strengthening security and compliance.
These enhancements help maintain a robust and secure Fusion environment, keeping your data and infrastructure protected while optimizing performance for mission-critical workloads.
### Apps Manager API
The new [Apps Manager API](/api-reference/license/get-the-fusion-license) gives information about your Fusion license, entitlements, and usage.
> **[Apps Manager API](https://academy.lucidworks.com/apps-manager-api)**
>
> The quick learning for **Apps Manager API** focuses on the purpose and functions of the Apps Manager API.
## Bug fixes
* `Solr-exporter` pods no longer get stuck in an `ImagePullBackOff` state, ensuring they pull the correct image and start reliably.
* The `job-launcher` and `job-rest-server` services now start correctly in SSL mode, resolving an issue where missing dependencies caused failures during initialization.
* Fusion now returns all matching search rules and rewrites in Commerce Studio instead of just the first ten, ensuring complete rule retrieval and better compatibility between the two systems.
* Prometheus stage execution histograms and counters now include stage labels, making it easier to organize dashboards and interpret stage metrics without relying on auto-generated IDs.
* Resolved an issue in Fusion 5.9.4 where v2 connectors failed to start in certain self-hosted EKS environments, preventing timeouts and ensuring successful job execution.
* Increased the request buffer size in `lwai-gateway` from 250 KB to 5 MB, allowing large messages to be processed without failures.
## Known issues
* Saving large query pipelines may cause OOM failures under high load.
In Fusion versions 5.9.10 through 5.9.13, saving a large query pipeline during high query volume can result in thread lock, excessive memory use, and eventual OOM errors in the Query service.\
This issue is fixed in Fusion 5.9.14.
* Deploying Fusion with TLS flags enabled fails in ArgoCD due to Helm chart rendering limitations.\
When using ArgoCD to deploy Fusion 5.9.10 or 5.9.11 with TLS options enabled, Helm chart rendering fails due to the use of the `lookup` function, which is unsupported by ArgoCD. This prevents ArgoCD from generating manifests, blocking deployment workflows that rely on TLS configuration.\
As a workaround, deploy Fusion without enabling TLS in ArgoCD-managed environments, or perform the deployment using Helm directly.\
This issue is fixed in Fusion 5.9.12.
* An issue prevents segment-based rule filtering from working correctly in Commerce Studio. This issue is fixed in Fusion 5.9.12.
## Deprecations and removals
For full details on deprecations and removals, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### Bitnami removal
Fusion 5.9.10 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
### Webapps service
Fusion has deprecated the Webapps service.
In previous versions of Fusion, you could use this service to deploy an App Studio WAR file into Fusion.
As of Fusion 5.9.10, you should instead **Deploy App Studio Enterprise to a Fusion 5 Cluster (GKE)**.
> **Deploy App Studio Enterprise to a Fusion 5 Cluster (GKE)**
>
> This article explains how to deploy [App Studio Enterprise](/docs/5/fusion/dev-portal/appkit/concepts/app-studio-enterprise/overview) (ASE) to an existing Fusion 5 cluster in Google Kubernetes Engine (GKE) without using the Webapps service.
>
> Before completing this guide, ensure that your `fusion.conf` file points to the IP or URI and port of the proxy service.
>
> Run the App Studio Enterprise application locally and verify functioning security and search features with the cluster you are deploying to.
>
> ## Prepare the package
>
> 1. Package your app into a single JAR file:
>
> ```
> ./app-studio package
> ```
>
> 2. App Studio Enterprise includes a `dockerfile`. Create the App Studio Enterprise Docker image:
>
> ```
> docker build PATH -t APP_NAME
> ```
>
> Set or replace `APP_NAME` with the name of your application. Replace `PATH` with the path to build from.
>
> 3. You can test the Docker image locally with the following command:
>
> ```
> docker run -it -p LOCAL_PORT:8080 APP_NAME
> ```
>
> Set or replace `LOCAL_PORT` with the port on your local machine that can access the app. Replace `APP_NAME` with the ASE application name.
>
> ## Publish the image
>
> You can publish the Docker image anywhere that supports Docker images. This section explains how to publish a Docker image to Google Kubernetes Engine.
>
> 1. Tag your container for the registry:
>
> ```
> docker tag APP_NAME gcr.io/PROJECT_NAME/APP_NAME
> ```
> 2. Push your Docker image to the Google Container Registry:
>
> ```
> docker push gcr.io/PROJECT_NAME/APP_NAME
> ```
> 3. Verify the image:
>
> ```
> gcloud compute instances list
> ```
>
> ## Deploy the app to a cluster
>
> After publishing your ASE Docker image, deploy the image to a cluster. Your existing Fusion 5 cluster is a good choice.
>
> 1. Switch the context to your Fusion 5 cluster:
>
> ```
> gcloud container clusters get-credentials CLUSTER_NAME
> ```
>
> Replace `CLUSTER_NAME` with your existing Fusion 5 cluster’s name.
> 2. Create a deployment in your cluster using the image you published:
>
> ```
> kubectl create deployment APP_NAME --image=gcr.io/PROJECT_NAME/APP_NAME:latest
> ```
>
> ## Create an Ingress resource
>
> After deploying the app, create an Ingress resource for your ASE instance. If you require more Ingress rules, your Ingress resource will look different. Learn more about [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/).
>
> 1. Use the following command to create a minimal Ingress resource:
>
> ```
> cat < apiVersion: networking.k8s.io/v1beta1
> kind: Ingress
> metadata:
> name: ase-ingress
> spec:
> backend:
> serviceName: $AppName
> servicePort: 80
> EOF
> ```
> 2. Verify the Ingress resource:
>
> ```
> kubectl get ingress ase-ingress
> ```
### Forked Apache Tika Parser
The Forked Apache Tika parser stage has been removed. Use [asynchronous Tika parsing](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead.
## Upgrade and platform support details
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features**: Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process**: Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support**: Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
Check out the **Fusion 5 Upgrades** for details.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30, 1.31
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30, 1.31
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30, 1.31
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30, 1.31. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.10 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.4.1 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
# Fusion 5.9.11
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.11-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.11-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.11-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/z72wlm
Released on March 20, 2025, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) provides KNN-based performance enhancements for Neural Hybrid Search, Java 17 support for connectors, a new asynchronous parsing service, the Apps Manager API, and critical security updates.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.11-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### KNN performance enhancements
The [Neural Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query) now uses K-Nearest Neighbors (KNN) instead of vector similarity (vecSim).
KNN is a more efficient method for finding the most relevant results, leading to faster and more accurate searches that help users find the most relevant information faster.
New configuration options give you finer control over the speed and accuracy of neural hybrid queries:
* `vectorDepth` (Number of Vector Results) sets the number of vector results to return from the vector portion of the hybrid query.
Increasing `vectorDepth` retrieves more vector results but may increase query time.
Lowering it speeds up search but may reduce result diversity.
* `vecPreFilterBoolean` (Block pre-filtering) indicates whether to prevent pre-filtering.
Pre-filtering can improve performance, while blocking it can yield more accurate facet counts and search results.
### Java 17 for connectors
Connectors have been updated to use Java 17. If you use remote connectors, you must upgrade to JVM 17. See **Configure Remote V2 Connectors** for more information.
> **Configure Remote V2 Connectors**
>
> If you need to index data from behind a firewall, you can configure a V2 connector to run remotely on-premises using TLS-enabled gRPC.
>
> ## Prerequisites
>
> Before you can set up an on-prem V2 connector, you must configure the egress from your network to allow HTTP/2 communication into the Fusion cloud. You can use a [forward proxy server](#egress-and-proxy-server-configuration) to act as an intermediary between the connector and Fusion.
>
> The following is required to run V2 connectors remotely:
>
> * The [plugin zip file and the connector-plugin-standalone JAR](https://plugins.lucidworks.com/).
>
> * A configured connector backend gRPC endpoint.
>
> * Username and password of a user with a `remote-connectors` or `admin` role.
>
> * If the host where the remote connector is running is not configured to trust the server’s TLS certificate, you must configure the file path of the trust certificate collection.
>
> > [!NOTE]
> >
> > If your version of Fusion doesn’t have the `remote-connectors` role by default, you can create one. No API or UI permissions are required for the role.
>
> ## Connector compatibility
>
> Only V2 connectors are able to run remotely on-premises.
> You also need the remote connector client JAR file that matches your Fusion version.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> > [!NOTE]
> >
> > Whenever you upgrade Fusion, you must also update your remote connectors to match the new version of Fusion.
>
> The gRPC connector backend is not supported in Fusion environments deployed on AWS.
>
> ## System requirements
>
> The following is required for the on-prem host of the remote connector:
>
> * (Fusion 5.9.0-5.9.10) JVM version 11
> * (Fusion 5.9.11) JVM version 17
> * Minimum of 2 CPUs
> * 4GB Memory
>
> Note that memory requirements depend on the number and size of ingested documents.
>
> ## Enable backend ingress
>
> In your `values.yaml` file, configure this section as needed:
>
> ```yaml theme={"dark"}
> ingress:
> enabled: false
> pathtype: "Prefix"
> path: "/"
> #host: "ingress.example.com"
> ingressClassName: "nginx" # Fusion 5.9.6 only
> tls:
> enabled: false
> certificateArn: ""
> # Enable the annotations field to override the default annotations
> #annotations: ""
> ```
>
> * Set `enabled` to `true` to enable the backend ingress.
> * Set `pathtype` to `Prefix` or `Exact`.
> * Set `path` to the path where the backend will be available.
> * Set `host` to the host where the backend will be available.
> * In Fusion 5.9.6 *only*, you can set `ingressClassName` to one of the following:
> * `nginx` for Nginx Ingress Controller
> * `alb` for AWS Application Load Balancer (ALB)
> * Configure TLS and certificates according to your CA’s procedures and policies.
>
> > [!NOTE]
> >
> > TLS must be enabled in order to use AWS ALB for ingress.
>
> ## Connector configuration example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443 # mandatory
> plain-text: false # optional, false by default.
> proxy-server: # optional - needed when a forward proxy server is used to provide outbound access to the standalone connector
> host: host
> port: some-port
> user: user # optional
> password: password # optional
> trust: # optional - needed when the client's system doesn't trust the server's certificate
> cert-collection-filepath: path1
>
> proxy: # mandatory fusion-proxy
> user: admin
> password: password123
> url: https://fusiontest.com/ # needed only when the connector plugin requires blob store access
>
> plugin: # mandatory
> path: ./fs.zip
> type: #optional - the suffix is added to the connector id
> suffix: remote
> ```
>
> ### Minimal example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443
>
> proxy:
> user: admin
> password: "password123"
>
> plugin:
> path: ./testplugin.zip
> ```
>
> ### Logback XML configuration file example
>
> ```xml theme={"dark"}
>
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
> ${LOGDIR:-.}/connector.log
>
>
> ${LOGDIR:-.}/connector-%d{yyyy-MM-dd}.%i.log.gz
> 50MB
> 10GB
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
>
>
>
>
> ```
>
> ## Run the remote connector
>
> ```java theme={"dark"}
> java [-Dlogging.config=[LOGBACK_XML_FILE]] \
> -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> The `logging.config` property is optional. If not set, logging messages are sent to the console.
>
> ## Test communication
>
> You can run the connector in communication testing mode. This mode tests the communication with the backend without running the plugin, reports the result, and exits.
>
> ```java theme={"dark"}
> java -Dstandalone.connector.connectivity.test=true -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> ## Encryption
>
> In a deployment, communication to the connector’s backend server is encrypted using TLS. You should only run this configuration without TLS in a testing scenario. To disable TLS, set `plain-text` to `true`.
>
> ## Egress and proxy server configuration
>
> One of the methods you can use to allow outbound communication from behind a firewall is a proxy server. You can configure a proxy server to allow certain communication traffic while blocking unauthorized communication. If you use a proxy server at the site where the connector is running, you must configure the following properties:
>
> * **Host.** The hosts where the proxy server is running.
> * **Port.** The port the proxy server is listening to for communication requests.
> * **Credentials.** Optional proxy server user and password.
>
> When you configure egress, it is important to disable any connection or activity timeouts because the connector uses long running gRPC calls.
>
> ## Password encryption
>
> If you use a login name and password in your configuration, run the following utility to encrypt the password:
>
> 1. Enter a user name and password in the connector configuration YAML.
>
> 2. Run the standalone JAR with this property:
>
> ```java theme={"dark"}
> -Dstandalone.connector.encrypt.password=true
> ```
>
> 3. Retrieve the encrypted passwords from the log that is created.
>
> 4. Replace the clear password in the configuration YAML with the encrypted password.
>
> ## Connector restart (5.7 and earlier)
>
> The connector will shut down automatically whenever the connection to the server is disrupted, to prevent it from getting into a bad state. Communication disruption can happen, for example, when the server running in the `connectors-backend` pod shuts down and is replaced by a new pod. Once the connector shuts down, connector configuration and job execution are disabled. To prevent that from happening, you should restart the connector as soon as possible.
>
> You can use Linux scripts and utilities to restart the connector automatically, such as [Monit](https://mmonit.com/monit/).
>
> ## Recoverable bridge (5.8 and later)
>
> If communication to the remote connector is disrupted, the connector will try to recover communication and gRPC calls. By default, six attempts will be made to recover each gRPC call. The number of attempts can be configured with the `max-grpc-retries` bridge parameters.
>
> ## Job expiration duration (5.9.5 only)
>
> The timeout value for irresponsive backend jobs can be configured with the `job-expiration-duration-seconds` parameter. The default value is `120` seconds.
>
> ## Use the remote connector
>
> Once the connector is running, it is available in the Datasources dropdown. If the standalone connector terminates, it disappears from the list of available connectors. Once it is re-run, it is available again and configured connector instances will not get lost.
>
> ## Enable asynchronous parsing (5.9 and later)
>
> To separate document crawling from document parsing, enable Tika Asynchronous Parsing on remote V2 connectors.
### Asynchronous parsing service
An asynchronous parsing service for connectors has been added.
While traditional synchronous parsing can create delays in indexing when handling large documents or high data volumes, asynchronous parsing processes files in the background, allowing indexing to continue without waiting for each document to be fully parsed.
This new service brings more efficient data processing, improved search freshness, scalability without added complexity, and better support for diverse data types, supporting HTML, JSON, and other formats.
A new parsing stage, [Apache Tika Container](/docs/5/fusion/reference/config-ref/parser-stages/apache-tika-container), has been added to route asynchronous parsing through the new service.
This stage is now required when using asynchronous parsing for connectors.
To use asynchronous parsing for connectors, be sure that ***Async Parsing*** is checked in the datasource and the Apache Tika Container parser stage is enabled in the index pipeline.
See **Use Tika Asynchronous Parsing** for detailed steps to set up asynchronous parsing.
> **Use Tika Asynchronous Parsing**
>
> This document describes how to set up your application to use Tika asynchronous parsing.
>
> Unlike synchronous Tika parsing, which uses a parser stage, asynchronous Tika parsing is configured in the datasource and index pipeline. For more information, see [Asynchronous Tika Parsing](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing).
>
> > [!TIP]
> >
> > **Field names change with asynchronous Tika parsing.**
> >
> > In contrast to synchronous parsing, asynchronous Tika parsing prepends `parser_` to fields added to a document. System fields, which start with `\_lw_`, are not prepended with `parser_`. If you are migrating to asynchronous Tika parsing, and your search application configuration relies on specific field names, update your search application to use the new fields.
>
> ## Configure the connectors datasource
>
> 1. Navigate to your datasource.
> 2. Enable the **Advanced** view.
> 3. Enable the **Async Parsing** option.
>
> 
>
> > [!TIP]
> >
> > **Fusion 5.9.11 and later uses your parser configuration when using asynchronous parsing.**
> >
> > The asynchronous parsing service performs Tika parsing using Apache Tika Server. In Fusion 5.8 through 5.9.10, other parsers, such as HTML and JSON, are not supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is ignored. In Fusion 5.9.11 and later, other parsers, such as HTML and JSON, are supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is used.
> 4. Save the datasource configuration.
>
> ## Configure the parser stage
>
> > [!TIP]
> >
> > You must do this step in Fusion 5.9.11 and later.
>
> 1. Navigate to **Parsers**.
> 2. Select the parser, or create a new parser.
> 3. From the **Add a parser stage** menu, select **Apache Tika Container Parser**.
> 4. (Optional) Enter a label for this stage. This label changes the names from Apache Tika Container Parser to the value you enter in this field.
> 5. If the Apache Tika Container Parser stage is not already the first stage, drag and drop the stage to the top of the stage list so it is the first stage that runs.
>
> ## Configure the index pipeline
>
> 1. Go to the **Index Pipeline** screen.
> 2. Add the **Solr Partial Update Indexer** stage.
> 3. Turn off the **Reject Update if Solr Document is not Present** option and turn on the **Process All Pipeline Doc Fields** option:
>
> 
> 4. Include an extra update field in the stage configuration using any update type and field name. In this example, an incremental field `docs_counter_i` with an increment value of `1` is added:
>
> 
> 5. Enable the **Allow reserved fields** option:
>
> 
> 6. Click **Save**.
> 7. Turn off or remove the **Solr Indexer stage**, and move the **Solr Partial Update Indexer stage** to be the last stage in the pipeline.
>
> 
>
> Asynchronous Tika parsing setup is now complete. Run the datasource indexing job and monitor the results.
> [!NOTE]
>
> Other parsers, such as HTML and JSON, are now supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is used.
To learn how to start using the new asynchronous parsing service, see the following demonstration:
[Fusion 5.9.11 Asynchronous parsing service](https://app.supademo.com/embed/cm7p23oxz00m9290i04lcinw5?embed_v=2)
This update also includes a new [Async Parsing API](/api-reference/async-parsing-api/index-a-document-using-a-profile-id).
> **[Asynchronous Parsing Service](https://academy.lucidworks.com/asynchronous-parsing-service)**
>
> The course for **Asynchronous Parsing Service** focuses on how to use asynchronous parsing to index your data more efficiently.
### Job Config service
The new Job Config service provides more accurate and reliable job status reporting.
This service uses asynchronous communication through Kafka for improved efficiency over the previous synchronous calls, with these benefits:
* More accurate job tracking. You get real-time, reliable job status updates, reducing uncertainty about whether a job is running, completed, or failed.
* Faster troubleshooting. With detailed job histories and improved reporting, teams can quickly diagnose issues instead of chasing down incomplete or outdated job statuses.
* Seamless transition. For most users, no action is required—API calls through `api-gateway` automatically reroute. Internal API users need only a simple update to continue tracking jobs accurately.
The following API endpoints have been migrated from the `admin` service to the new `job-config` service:
```bash theme={"dark"}
/api/tasks/{id}
/api/jobs/{resource}/schedule
/api/tasks
/api/jobs/{resource}/actions
/api/tasks/_schema
/api/jobs
/api/jobs/{resource}
/api/jobs/{resource}/history
/api/jobs/_schema
```
For API calls made to the `api-gateway` service, you do not need to make any changes; the endpoints above are automatically rerouted to the new `job-config` service.
See [Job Config API](/api-reference/manage-task-jobs/list-task-jobs) for reference information about these endpoints.
> [!NOTE]
>
> If you are making internal API calls to the `admin` service using any of the endpoints above, you must update your API calls to point to the new `job-config` service.
### Security updates
Lucidworks remains committed to providing a secure and resilient platform. Fusion 5.9.11 includes critical security updates across a number of Fusion services, including the admin, connectors, distributed compute, indexing, job configuration, and query services, ensuring continued protection and reliability for your deployments.
### API path changes
Trailing slashes are no longer supported when making API calls.
For example, this API call works:
```
http://HOSTNAME/api/apps/APP_NAME/query/QUERY_PROFILE?q=hello
```
But this API call does not work and results in an error:
```
http://HOSTNAME/api/apps/APP_NAME/query/QUERY_PROFILE/?q=hello
```
## Bug fixes
* Critical fix for Azure Kubernetes Service (AKS) and Amazon Elastic Kubernetes Service (EKS) compatibility on Kubernetes 1.30+\
By upgrading the Kubernetes Client library to version 6.2.0, this update prevents token refresh failures that previously caused service disruptions. Affected services—including connectors backend, indexing, job rest server, and job launcher services—now operate reliably in OIDC-enabled AKS and EKS environments, strengthening Fusion’s stability on modern Kubernetes deployments.
## Known issues
* Saving large query pipelines may cause OOM failures under high load.\
In Fusion 5.9.x versions through 5.9.13, saving a large query pipeline during high query volume can result in thread lock, excessive memory use, and eventual OOM errors in the Query service.\
This issue is fixed in Fusion 5.9.14.
* Scheduled jobs that perform Solr operations may fail to run or save due to permission-related issues in the `job-config` service.\
In some cases, users without full permissions can create or modify scheduled tasks that execute actions they aren’t authorized to run directly, specifically tasks that invoked Solr using `solr://` URIs.\
These jobs may fail silently or prevent schedule changes from being saved. This issue can also affect the execution of jobs after upgrade. It is fixed in Fusion 5.9.13.
* Deploying Fusion with TLS flags enabled fails in ArgoCD due to Helm chart rendering limitations.\
When using ArgoCD to deploy Fusion 5.9.10 or 5.9.11 with TLS options enabled, Helm chart rendering fails due to the use of the `lookup` function, which is unsupported by ArgoCD. This prevents ArgoCD from generating manifests, blocking deployment workflows that rely on TLS configuration.\
This issue is fixed in Fusion 5.9.12.\
As a workaround, deploy Fusion without enabling TLS in ArgoCD-managed environments, or perform the deployment using Helm directly.
* Incorrect Solr image repository in Helm charts.\
Fusion 5.9.11’s Helm chart incorrectly references an internal Lucidworks Artifactory repository for the Solr image. This can prevent successful deployment in environments without access to internal infrastructure.\
This issue is fixed in Fusion 5.9.12.\
As a workaround, override the Solr image repository in your custom `values.yaml` file.
* Jobs API returns incorrect timestamps for jobs scheduled after 12:00 UTC.\
In Fusion 5.9.11, job timestamps returned by the API may be off by 12 hours if the time is after noon UTC. This affects scheduling accuracy and may cause the UI to misinterpret whether a change has been made.\
This issue is fixed in Fusion 5.9.12.
* Cannot update existing job triggers in the Schedulers view.\
In Fusion 5.9.11, scheduled job triggers cannot be modified due to incorrect timestamp comparison logic in the Admin UI. You must delete and recreate the trigger instead.\
This issue is fixed in Fusion 5.9.12.
* Scheduler may stop working if ZooKeeper becomes briefly unavailable.\
If all `job-config` pods lose connection to ZooKeeper in Fusion 5.9.11, they may fail to re-elect a leader, halting all scheduling until one of the pods is manually restarted.\
This issue is fixed in Fusion 5.9.12.
* Datasource jobs show incorrect "started by" user.\
In Fusion 5.9.11, datasource jobs started in the UI incorrectly show `default-subject` as the initiating user in job history instead of the actual user.\
This issue is fixed in Fusion 5.9.12.
* Schema API incompatibility with nonstandard schema file names.\
In Fusion 5.9.11, new apps save Solr schemas with the name `managed-schema.xml` instead of `managed-schema`, while older apps may include only a `managed-schema` file.\
This mismatch can cause errors when editing or previewing schemas using the Schema API, particularly when the expected file extension is missing.\
For existing config sets, it’s best to copy the contents from `managed-schema` to a new `managed-schema.xml`, then delete `managed-schema`.\
Fusion 5.9.12 resolves this by supporting both file names, ensuring backward compatibility with older apps and consistent behavior for new ones.
* Job scheduling may stop working if all `job-config` pods lose connection to ZooKeeper.\
In rare cases, when a ZooKeeper connection is lost, the leader latch mechanism used by the `job-config` service might fail to recover. If no node can re-establish leadership, the job scheduler stops until at least one `job-config` pod is restarted.\
This issue is fixed in Fusion 5.9.13.
* Scheduled job triggers can’t be updated in the Schedulers view.\
While the Admin UI displays the current trigger time correctly, changes to the time are not saved.\
This is due to a mismatch in how the API formats UTC timestamps, especially for times after 12:00 UTC, which prevents the UI from detecting that a change has been made.\
To work around this, delete the existing scheduler entry and create a new one with the desired time.\
This issue is resolved in Fusion 5.9.13.
* Dependent job scheduling may fail.\
Jobs configured to run based on the success or failure of another job may not trigger as expected. This includes configurations using “on\_success\_or\_failure” and “Start + Interval” options. This issue is resolved in Fusion 5.9.13.
* Aborted jobs in Fusion are listed twice in the Job History.\
This issue is fixed in Fusion 5.9.12.
* When a new datasource is configured in **Indexing > Index Workbench**, the simulated results do not display, and the following error is generated: "Failed to simulate results from a working pipeline." As a result, the Index Workbench cannot simulate results for new datasources, preventing users from configuring the indexing process within the workbench.\
This issue is fixed in Fusion 5.9.12.\
To work around this issue, configure each part of the indexing process separately instead of using the Index Workbench:
* Configure datasources in **Indexing > Datasources**.
* Configure parsers in **Indexing > Parsers**.
* Configure index pipelines in **Indexing > Index Pipelines**.
* In Fusion 5.9.10, the Apache Spark 3.4.1 upgrade impacted jobs that use Python 3.7 behavior or compatibility, which may have automatically updated to Python 3.10.x and no longer function correctly. If you have not yet updated the code for Python 3.10.x, update your code to ensure compatibility with Python 3.10.x and then test your Spark jobs in a staging environment before deploying to production.
* An issue prevents segment-based rule filtering from working correctly in Commerce Studio. This issue is fixed in Fusion 5.9.12.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
* The [Parsers Indexing CRUD API](/api-reference/parsers-crud-api/update-a-parser), which provides CRUD operations for parsers, allowing users to create, read, update, and delete parsers, is deprecated in Fusion 5.9.11. This feature was originally deprecated in Fusion 5.12.0. It will be removed in a future release no later than September 4, 2025.
> [!TIP]
>
> The [Async Parsing API](/api-reference/parsers-crud-api/list-all-parsers) replaces the Parsers Indexing CRUD API and is available in Fusion 5.9.11. This API provides improved functionality and aligns with Fusion’s updated architecture, ensuring consistency across versions.
* The [Word2Vec Model Training Job](/docs/5/fusion/reference/config-ref/jobs/word2vec-model-training), which trains a shallow neural model to generate vector embeddings for text data, is deprecated in Fusion 5.9.11. It will be removed in a future release no later than September 4, 2025.
> [!TIP]
>
> Lucidworks offers a wide array of AI solutions, including [Lucidworks AI](/docs/lw-platform/lw-ai/overview). Lucidworks AI provides easy-to-use, AI-powered data discovery and search capabilities including:
>
>
>
Pre-trained embedding models
>
Custom embedding model training
>
Seamless integration with Fusion
>
## Removals
### Bitnami removal
Fusion 5.9.11 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30, 1.31
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30, 1.31
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30, 1.31
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30, 1.31; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.11 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.12
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.12-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.12-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.12-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/lt4m82
Originally released on April 16, 2025 and re-released on May 14, 2025, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) provides support for chunking in Lucidworks AI, model hosting with Ray, and important security upgrades and bug fixes.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.12-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!NOTE]
>
> If you downloaded or installed Fusion 5.9.12 **before May 14, 2025** and are encountering issues, you should pull the images again and re-install Fusion 5.9.12 to pick up the latest bug fixes. This ensures you benefit from critical stability, security, and compatibility improvements included in the re-released version. If you are using self-hosted Fusion and installed 5.9.12 prior to the re-release, see the [self-hosted reinstallation instructions below](#reinstall-5-9-12-for-self-hosted-fusion).
>
> When requesting help from the Lucidworks support team about this release, be sure to specify whether you are running the original Fusion 5.9.12 release or the re-release, so we can provide accurate guidance and faster resolution.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Reinstall 5.9.12 for self-hosted Fusion
If you are a self-hosted Fusion client and installed 5.9.12 in your environment before the re-release, the standard image pull policy may prevent pulling the re-release version. With the original release, the worker nodes cache the images, and the new version won’t be pulled because they weren’t retagged with a newer version string.
### Instructions
1. Verify the job-launcher pod is using the correct image by comparing its sha256 digest to the expected value of `fusion/lucidworks/job-launcher@sha256:02624cfbc3eb536e4a29353b7bfe0846380a09f98ae3c78da859793686782092`.
1. Run the following command:
```sh wrap theme={"dark"}
kubectl get pod job-launcher-pod -n ns-name -o jsonpath='{.status.containerStatuses[0].imageID}'
```
2. If the digest output is different in any way, the image is not from the re-release.
2. Check the `imagePullPolicy` of your Deployments:
```sh wrap theme={"dark"}
kubectl get deployment -n ns-name -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.template.spec.containers[*]}{.name}={.imagePullPolicy}{" "}{end}{"\n"}{end}'
```
1. If the policy is set to `IfNotPresent`, patch it to `Always`:
```sh wrap theme={"dark"}
kubectl patch deployments -n ns-name --type=json -p='[{"op":"replace","path":"/spec/template/spec/containers/0/imagePullPolicy","value":"Always"}]'
```
2. Restart the Deployments and StatefulSets to apply the changes:
```sh theme={"dark"}
kubectl rollout restart deployment,statefulset -n ns-name
```
3. (Optional) Check the `imagePullPolicy` for StatefulSets specifically to ensure they are set correctly:
```sh wrap theme={"dark"}
kubectl get sts -n ns-name -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.template.spec.containers[*]}{.name}={.imagePullPolicy}{" "}{end}{"\n"}{end}'
```
3. After the rollout, confirm again that the job-launcher pod is using the correct image:
```sh wrap theme={"dark"}
kubectl get pod job-launcher-pod -n ns-name -o jsonpath='{.status.containerStatuses[0].imageID}'
```
1. If the result matches the expected digest of `sha256:02624cfbc3eb536e4a29353b7bfe0846380a09f98ae3c78da859793686782092` then the pod is running the latest re-release version.
## Key highlights
### Improved relevance in large documents with chunking
Fusion 5.9.12 introduces document chunking, a major advancement for search and generative AI quality and performance. Chunking breaks large documents into smaller, meaningful segments—called chunks—that are stored and indexed using Solr’s block join capabilities. Each chunk captures either lexical content (for keyword-based search) or semantic vectors (for neural search), enabling Fusion to retrieve the most relevant part of a document, rather than treating the document as a single block.
This improves:
* **Search relevance**: Users get results that point to the most relevant sections within large documents, not just documents that match overall.
* **Neural search precision**: Vector chunks improve hybrid scoring by aligning semantic relevance with specific lexical content.
* **Scalability and maintainability**: Updates or deletions are applied at the chunk level, ensuring consistency and avoiding stale or orphaned content.
* **Faceted search and UX**: Results can be grouped and ranked more accurately, especially in use cases where dense documents contain multiple topics.
Document chunking is particularly valuable in knowledge management and technical content domains, where retrieving the right paragraph can be more important than retrieving the right document.
* A new [LWAI Chunker index pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lucidworks-ai-chunker-index-stage) uses one of the available chunking strategies (chunkers) for the specified LW AI model to provide optimized storage and retrieval. The chunkers asynchronously split the provided text in various ways such as by sentence, new line, semantics, and regular expression (regex) syntax.
* A new [Chunking Neural Hybrid Query pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/chunking-neural-hybrid-query) now detects chunked documents and retrieves the most relevant lexical and vector segments for hybrid search.
* Updates and deletions now ensure consistent chunk synchronization to prevent orphaned data.
* This feature includes a new [Lucidworks AI Async Chunking API](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-async-chunking-api).
Click **Get Started** below to see how to enable chunking in Fusion:
[Enable chunking in Fusion](https://app.supademo.com/embed/cmbjyucmh00j9xu0j0vmhkoum?embed_v=2)
> [!NOTE]
>
> Contact your Lucidworks account manager to confirm that your license includes this feature.
### Model hosting with Ray
Fusion 5.9.12 introduces support for model hosting with Ray, replacing the previous Seldon-based approach. Ray offers a more scalable and efficient architecture for serving machine learning models, with native support for distributed inference, autoscaling, and streamlined deployment. This transition simplifies Fusion’s AI infrastructure, enhances performance, and aligns with modern MLOps practices to make deploying and managing models faster, more reliable, and easier to monitor.
Ray is present by default but still needs to be configured to run and perform tasks.
Istio is only required for using Ray if you require in-cluster TLS.
* The Seldon vectorize stages have been renamed to [Ray/Seldon Vectorize Field](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/vectorize-field-via-seldon-index-stage) and [Ray/Seldon Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage).
* There are two new jobs for deploying models with Ray:
* [Create Ray Deployment](/docs/5/fusion/reference/config-ref/jobs/create-ray-model-deployment).
* [Delete Ray Deployment](/docs/5/fusion/reference/config-ref/jobs/delete-ray-model-deployment).
> [!TIP]
>
> If you previously deployed a model with Seldon, you can deploy the same model with Ray.
>
> Just follow the instructions in **Develop and deploy a machine learning model with Ray**, and deploy the model with a different name to avoid conflicts.
>
> > **Develop and deploy a machine learning model with Ray**
> >
> > This tutorial walks you through deploying your own model to Fusion with Ray.
> >
> > > [!NOTE]
> > >
> > > This feature is only available in Fusion 5.9.x for versions 5.9.12 and later.
> >
> > ## Prerequisites
> >
> > * A Fusion instance with an app and indexed data.
> > * An understanding of Python and the ability to write Python code.
> > * [Docker](https://docs.docker.com/get-docker/) installed locally, plus a private or public Docker repository.
> > * Ray installed locally: `pip install ray[serve]` using the version of ray\[serve] found in the release notes for your version of Fusion.
> > * Code editor; you can use any editor, but Visual Studio Code is used in this example.
> > * Model: [intfloat/e5-small-v2](https://huggingface.co/intfloat/e5-small-v2)
> > * Docker image: [e5-small-v2-ray](https://hub.docker.com/r/jstrmec/e5-small-v2-ray/)
> >
> > ## Tips
> >
> > * Always test your Python code locally before uploading to Docker and then Fusion.
> > This simplifies troubleshooting significantly.
> > * Once you’ve created your Docker you can also test locally by doing `docker run` with a specified port, like 9000, which you can then `curl` to confirm functionality in Fusion.
> > See the testing example below.
> > * If you previously deployed a model with Seldon, you can deploy the same model with Ray after making a few changes to your Docker image as explained in this topic.
> > To avoid conflicts, deploy the model with a different name.
> > When you have verified that the Ray model is working after deployment with Ray, you can delete the Seldon model using the [Delete Seldon Core Model Deployment job](/docs/5/fusion/reference/config-ref/jobs/delete-seldon-core-model-deployment).
> > * If you run into an issue with the model not deploying and you’re using the 'real' example, there is a very good chance you haven’t allocated enough memory or CPU in your job spec or in the Ray-Argo config.
> > It’s easy to increase the resources. To edit the ConfigMap, run `kubectl edit configmap argo-deploy-ray-model-workflow -n ` and then find the `ray-head` container in the artisanal escaped YAML and change the memory limit.
> > Exercise caution when editing because it can break the YAML.
> > Just delete and replace a single character at a time without changing any formatting.
> > * For additional guidance, see the [testing locally e5-model example](https://colab.research.google.com/drive/1ef-NTJBtP8p77aAa8Pp9SPXtQyozJEas?usp=sharing).
> >
> > > **[Intro to Machine Learning in Fusion](https://academy.lucidworks.com/intro-to-machine-learning-in-fusion)**
> > >
> > > The course for **Intro to Machine Learning in Fusion** focuses on using machine learning to infer the goals of customers and users in order to deliver a more sophisticated search experience.
> >
> > ## Local testing example
> >
> > 1. Docker command:
> > ```bash theme={"dark"}
> > docker run -p 127.0.0.1:9000:9000 DOCKER_IMAGE
> > ```
> > 2. Curl to hit Docker:
> > ```bash theme={"dark"}
> > curl -i -X POST http://127.0.0.1:8000 -H 'Content-Type: application/json' -d '{"text": "The quick brown fox jumps over the lazy dog."}'
> > ```
> > 3. Curl model in Fusion:
> > ```bash theme={"dark"}
> > curl -u $FUSION_USER:$FUSION_PASSWORD -X POST -H 'Content-Type: application/json' -d '{"text": "i love fusion"}' https://FUSION_HOST.com:6764/api/ai/ml-models/MODEL_NAME/prediction
> > ```
> > 4. See all your deployed models:
> > ```bash theme={"dark"}
> > curl -u USERNAME:PASSWORD http://FUSION_HOST:FUSION_PORT/api/ai/ml-models
> > ```
> > 5. Check the Ray UI to see Replica State, Resources, and Logs.\
> > If you are getting an internal model error, the best way to see what is going on is to query via port-forwarding the model.\
> > The `MODEL_DEPLOYMENT` in the command below can be found with `kubectl get svc -n NAMESPACE`. It will have the same name as set in the model name in the **Create Ray Model Deployment** job.
> > ```bash theme={"dark"}
> > kubectl -n NAMESPACE port-forward svc/MODEL_DEPLOYMENT-head-svc 8000:8000
> > ```
> > Once port-forwarding is successful, you can use the below cURL command to see the issue.
> > At that point your worker logs should show helpful error messages.
> > ```bash theme={"dark"}
> > curl --location 'http://127.0.0.1:8000/' \
> > --header 'charset: utf-8' \
> > --header 'Content-Type: application/json' \
> > --data '{"text": "i love fusion"}'
> > ```
> >
> > ## Download the model
> >
> > This tutorial uses the [`e5-small-v2`](https://huggingface.co/intfloat/e5-small-v2) model from Hugging Face, but any pre-trained model from [https://huggingface.co](https://huggingface.co) will work with this tutorial.
> >
> > If you want to use your own model instead, you can do so, but your model must have been trained and then saved though a function similar to the PyTorch’s `torch.save(model, PATH)` function.
> > See [Saving and Loading Models](https://pytorch.org/tutorials/beginner/saving_loading_models.html) in the PyTorch documentation.
> >
> > ## Format a Python class
> >
> > The next step is to format a Python class which will be invoked by Fusion to get the results from your model.
> > The skeleton below represents the format that you should follow.
> > See also [Getting Started](https://docs.ray.io/en/latest/serve/getting_started.html) in the Ray Serve documentation.
> >
> > ```python wrap expandable theme={"dark"}
> > from ray import serve
> > from starlette.requests import Request
> >
> > # These defaults are for the ray serve deployment
> > # when running simply from docker. The 'Create Ray Model Deployment'
> > # job can override these replicas and resources if needed.
> > @serve.deployment(num_replicas=1, ray_actor_options={"num_cpus": 1})
> > class Deployment(object):
> > def __init__(self):
> > """
> > Add any initialization parameters. Generally this is where you would load
> > your model. This method will be called once when the deployment is created.
> > """
> > print("Initializing")
> > self.model = load_model() #faux code
> >
> > # This can be named as any method which takes a dictionary as input and returns a dictionary
> > # as output. In this example, we are using the encode method to encode the
> > # input text into a vector.
> > def encode(self, input_dict: Dict[str, Any]) -> Dict[str, Any]:
> > """
> > This method will be called when the deployment is queried. It will receive
> > the input data and should return the output data.
> > """
> > text = input_dict["text"]
> > embeddings = self.model.encode #faux code
> > return { "vector": embeddings } # To use the 'Ray / Seldon Vectorize Field' stage, the output key should be `vector`, if using the 'Machine Learning' stage you must ensure the output key matches the output key in the 'Machine Learning' stage
> >
> > async def __call__(self, http_request: Request) -> Dict[str, Any]:
> > input_dict: Dict[str, Any] = await http_request.json()
> > return self.encode(input_dict=input_dict) # This will be the function you defined above, in this case encode
> >
> >
> > app = Deployment.bind()
> >
> > ```
> >
> > A real instance of this class with the `e5-small-v2` model is as follows:
> >
> > > [!NOTE]
> > >
> > > This code pulls from Hugging Face. To have the model load in the image without pulling from Hugging Face or other external sources, download the model weights into a folder name and change the model name to the folder name preceded by `./`.
> >
> > ```python wrap expandable theme={"dark"}
> > import json
> > import sys
> > from time import time
> > from typing import Any, Dict
> >
> > import torch
> > import torch.nn.functional as F
> > from ray import serve
> > from starlette.requests import Request
> > from starlette.responses import JSONResponse
> > from torch import Tensor
> > from transformers import AutoModel, AutoTokenizer
> >
> > HUB_MODEL_NAME = "intfloat/e5-small-v2"
> >
> >
> > @serve.deployment(num_replicas=1, ray_actor_options={"num_cpus": 1})
> > class Deployment(object):
> > def __init__(self):
> > from loguru import logger
> >
> > self.logger = logger
> > # Initializing logger
> > self.logger.remove()
> > self.logger.add(sys.stdout, level="INFO", serialize=False, colorize=True)
> >
> > # Initializing model
> > self.logger.info("Loading model...")
> > self.tokenizer = AutoTokenizer.from_pretrained(HUB_MODEL_NAME)
> > self.model = AutoModel.from_pretrained(HUB_MODEL_NAME)
> > self.model.eval()
> > self.logger.info("Model initialization finished!")
> >
> > def encode(self, input_dict: Dict[str, Any]) -> Dict[str, Any]:
> > _start_time = time()
> >
> > # Extracting text from input
> > text = input_dict["text"]
> >
> > # Tokenization
> > tokenized_texts = self.tokenizer(
> > text,
> > max_length=512,
> > padding=True,
> > truncation=True,
> > return_tensors="pt",
> > )
> >
> > # Encoding
> > with torch.inference_mode():
> > # Forward pass of the model
> > outputs = self.model(**tokenized_texts)
> >
> > # Average pooling the last hidden states
> > embeddings = self.average_pool(
> > outputs.last_hidden_state, tokenized_texts["attention_mask"]
> > )
> >
> > # Normalizing embeddings
> > embeddings = F.normalize(embeddings, p=2, dim=1)
> >
> > # Converting into output format
> > output_dict = {"vector": embeddings.squeeze().tolist()}
> >
> > prediction_time = (time() - _start_time) * 1000
> > self.logger.info(f"Time taken to make a prediction: {prediction_time:.0f}ms")
> > return output_dict
> >
> > async def __call__(self, http_request: Request) -> Dict[str, Any]:
> > try:
> > input_dict: Dict[str, Any] = await http_request.json()
> > except UnicodeDecodeError:
> > body_bytes = await http_request.body()
> > try:
> > decoded = body_bytes.decode("utf-8", errors="replace")
> > input_dict = json.loads(decoded)
> > except json.JSONDecodeError:
> > return JSONResponse({"error": "Invalid JSON"}, status_code=400)
> > return self.encode(input_dict=input_dict)
> >
> > @staticmethod
> > def average_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:
> > last_hidden = last_hidden_states.masked_fill(
> > ~attention_mask[..., None].bool(), 0.0
> > )
> > return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
> >
> >
> > app = Deployment.bind()
> > ```
> >
> > In the preceding code, logging has been added for debugging purposes.
> >
> > The preceding code example contains the following functions:
> >
> > * `__call__`: This function is non-negotiable.
> > * `init`: The `init` function is where models, tokenizers, vectorizers, and the like should be set to self for invoking.\
> > It is recommended that you include your model’s trained parameters directly into the Docker container rather than reaching out to external storage inside `init`.
> > * `encode`: The `encode` function is where the field or query that is passed to the model from Fusion is processed.\
> > Alternatively, you can process it all in the `__call__` function, but it is cleaner not to.\
> > The `encode` function can handle any text processing needed for the model to accept input invoked in its `model.predict()` or equivalent function which gets the expected model result.
> >
> > If the output needs additional manipulation, that should be done before the result is returned.
> > For embedding models, the return value must have the shape of (1, DIM), where DIM (vector dimension) is a consistent integer, to enable Fusion to handle the vector encoding into Ray.
> >
> > > [!NOTE]
> > >
> > > The class name must be `Deployment()` and the name of this file must be `deployment.py`.
> >
> > In the preceding example, the Python file is named `deployment.py` and the class name is `Deployment()`.
> >
> > ## Create a Dockerfile
> >
> > The next step is to create a Dockerfile. The Dockerfile should follow this general outline; read the comments for additional details:
> >
> > ```dockerfile theme={"dark"}
> > #It is important that python version is 3.x-slim
> > FROM python:3.10-slim
> >
> > # Install dependencies
> > RUN apt-get update && apt-get install -y wget
> >
> > # Create working app directory
> > RUN mkdir -p /app
> > WORKDIR /app
> >
> > # Copy the requirements file and install the dependencies
> > COPY requirements.txt /app
> > RUN pip install -r requirements.txt --no-cache-dir
> >
> > # Copy source code
> > COPY deployment.py /app
> >
> > # Expose serving port for HTTP communication with Fusion
> > EXPOSE 8000
> >
> > # The end of the command follows module:application and the below value should be set in the RAY DEPLOYMENT IMPORT PATH field in 'Create Ray Model Deployment' job
> > CMD exec serve run deployment:app
> >
> > ```
> >
> > ## Create a requirements file
> >
> > The `requirements.txt` file is a list of installs for the `Dockerfile` to run to ensure the Docker container has the right resources to run the model.
> > For the `e5-small-v2` model, the requirements are as follows:
> >
> > ```text theme={"dark"}
> > torch -f https://download.pytorch.org/whl/torch_stable.html # Make sure that we download CPU version of PyTorch
> > transformers
> > loguru
> > ray[serve]==2.42.1
> > ```
> >
> > Any recent ray\[serve] version should work, but the tested value and known supported version is 2.42.1.
> > In general, if an item was used in an `import` statement in your Python file, it should be included in the requirements file.
> >
> > To populate the requirements, use the following command in the terminal, inside the directory that contains your code:
> >
> > ```bash theme={"dark"}
> > pip freeze > requirements.txt
> > ```
> >
> > ## Build and push the Docker image
> >
> > After creating the `MODEL_NAME.py`, `Dockerfile`, and `requirements.txt` files, you need to run a few Docker commands.
> > Run the following commands in order:
> >
> > ```bash theme={"dark"}
> > DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build . -t [DOCKERHUB-USERNAME]/[REPOSITORY]:[VERSION-TAG]
> > ```
> >
> > ```bash theme={"dark"}
> > docker push [DOCKERHUB USERNAME]/[REPOSITORY]:[VERSION-TAG]
> > ```
> >
> > Using the example model, the terminal commands would be as follows:
> >
> > ```bash theme={"dark"}
> > DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build . -t jstrmec/e5-small-v2-ray:0.1
> > ```
> >
> > ```bash theme={"dark"}
> > docker push jstrmec/e5-small-v2-ray:0.1
> > ```
> >
> > This repository is public and you can visit it here: [e5-small-v2-ray](https://hub.docker.com/r/jstrmec/e5-small-v2-ray/)
> >
> > ## Deploy the model in Fusion
> >
> > Now you can go to Fusion to deploy your model.
> >
> > When deploying your Ray model, you have two options for handling traffic:
> >
> > * Use a single deployment. Deploy one model job that handles both indexing and query traffic. This is simpler to manage and requires only one deployment.
> > * Use separate deployments for indexing and querying. Deploy two separate model jobs: one dedicated to indexing and another for query traffic. This approach eliminates the risk of indexing workloads impacting query response times, providing better performance isolation and independent scaling control.
> >
> > Choose separate deployments if query performance is critical and you want to ensure indexing operations don't compete with user-facing queries for resources.
> >
> > To use separate deployments, follow the deployment steps to create two Ray model deployment jobs with different job IDs (for example, `EXAMPLE_MODEL_INDEX` and `EXAMPLE_MODEL_QUERY`). Use the index-specific model in your index pipeline stages and the query-specific model in your query pipeline stages. To keep both deployments in sync, ensure both jobs use the exact same model name, Ray deployment import path, Docker repository, and image name.
> >
> > 1. In Fusion, navigate to **Collections** > **Jobs**.
> >
> > 2. Add a job by clicking the **Add+** Button and selecting **Create Ray Model Deployment**.
> >
> > 3. Fill in each of the text fields:
> >
> > 
> >
> > | Parameter | Description |
> > | - | - |
> > | Job ID | A string used by the Fusion API to reference the job after its creation. |
> > | Model name | A name for the deployed model. This is used to generate the deployment name in Ray. It is also the name that you reference as a `model-id` when making predictions with the ML Service. |
> > | Model min replicas | The minimum number of load-balanced replicas of the model to deploy. |
> > | Model max replicas | The maximum number of load-balanced replicas of the model to deploy. Specify multiple replicas for a higher-volume intake. |
> > | Model CPU limit | The number of CPUs to allocate to a single model replica. |
> > | Model memory limit | The maximum amount of memory to allocate to a single model replica. |
> > | Ray Deployment Import Path | The path to your top-level Ray Serve deployment (or the same path passed to `serve run`). For example, `deployment:app` |
> > | Docker Repository | The public or private repository where the Docker image is located. If you’re using Docker Hub, fill in the Docker Hub username here. |
> > | Image name | The name of the image. For example, `e5-small-v2-ray:0.1`. |
> > | Kubernetes secret | If you’re using a private repository, supply the name of the Kubernetes secret used for access. |
> >
> > 4. Click **Advanced** to view and configure advanced details:
> >
> > | | |
> > | - | - |
> > | Parameter | Description |
> > | Additional parameters. | This section lets you enter parameter `name:parameter` value options to be injected into the training JSON map at runtime. The values are inserted as they are entered, so you must surround string values with `"`. This is the sparkConfig field in the configuration file. |
> > | Write Options. | This section lets you enter parameter `name:parameter` value options to use when writing output to Solr or other sources. This is the writeOptions field in the configuration file. |
> > | Read Options. | This section lets you enter parameter `name:parameter` value options to use when reading input from Solr or other sources. This is the readOptions field in the configuration file. |
> >
> > 5. Click **Save**, then **Run** and **Start**.
> >
> > 
> >
> > When the job finishes successfully, you can proceed to the next section.
> >
> > Now that the model is in Fusion, you can use it in the Machine Learning or Ray / Seldon Vectorize index and query stages.
> >
> > ## Configure the Fusion pipelines
> >
> > Your real-world pipeline configuration depends on your use case and model, but for our example we will configure the index pipeline and then the query pipeline.
> >
> > **Configure the index pipeline**
> >
> > 1. Create a new index pipeline or load an existing one for editing.
> > 2. Click **Add a Stage** and then **Machine Learning**.
> > 3. In the new stage, fill in these fields:
> > * The model ID
> > * The model input
> > * The model output
> > 4. Save the stage in the pipeline and index your data with it.
> >
> > **Configure the query pipeline**
> >
> > 1. Create a new query pipeline or load an existing one for editing.
> > 2. Click **Add a Stage** and then **Machine Learning**
> > 3. In the new stage, fill in these fields:
> > * The model ID
> > * The model input
> > * The model output
> > 4. Save the stage and then run a query by typing a search term.
> > 5. To verify the Ray results are correct, use the **Compare+** button to see another pipeline without the model implementation and compare the number of results.
> >
> > You have now successfully uploaded a Ray model to Fusion and deployed it.
>
> When you have verified that the Ray model is working after deployment with Ray, you can delete the Seldon model using the [Delete Seldon Core Model Deployment job](/docs/5/fusion/reference/config-ref/jobs/delete-seldon-core-model-deployment).
### AI and machine learning features
Fusion’s machine learning services now run on Python 3.10 and Java 11, bringing improved performance, security, and compatibility with the latest libraries.
These upgrades enhance model execution speed, memory efficiency, and long-term support, ensuring Fusion’s machine learning capabilities remain optimized for your evolving AI workloads.
No configuration changes are required to take advantage of these improvements.
### Improved prefiltering support for Neural Hybrid Search (NHS)
Fusion 5.9.12 introduces early improvements for a more robust prefiltering strategy with Neural Hybrid Search, including support for chunked document queries.
> [!WARNING]
>
> Be aware that some prefiltering capabilities, such as access to the `preFilterKey` context property and the `VectorPreFilter` helper class are not available in 5.9.12.
> These features were included in Fusion 5.9.13.
>
> In 5.9.12, prefiltering may require custom pipeline logic or workarounds and may not behave the same as in earlier hybrid query implementations. For full prefiltering support, including the `VectorPreFilter` context object and documented JavaScript usage, we recommend upgrading to Fusion 5.9.13 or later, where the functionality is fully available.
Prefiltering is a technique that can improve performance and accuracy by filtering documents before applying the algorithm, reducing the number of documents that need to be processed.
You can enable prefiltering in any NHS query pipeline stage; see the configuration reference topics for details:
* [Chunking Neural Hybrid Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/chunking-neural-hybrid-query)
* [Neural Hybrid Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query)
## Bug fixes
* Fixed a Helm chart rendering issue that blocked ArgoCD deployments with TLS flags enabled.\
In previous releases, using TLS flags during deployment caused Helm chart rendering to fail in ArgoCD due to the use of the unsupported `lookup` function. Fusion 5.9.12 resolves this issue by modifying the chart templates for compatibility with ArgoCD, restoring support for TLS-enabled deployments in GitOps workflows.
* Fixed incorrect image repository for Solr in Helm charts.\
In Fusion 5.9.11, the Helm chart specified an internal Lucidworks Artifactory repository for the Solr image.\
This has been corrected in 5.9.12 so the Solr image repository is either empty or points to `lucidworks/fusion-solr`, aligning with other components and simplifying deployment for external environments.
* Added support for configuring the Spark version used by Fusion.\
Fusion 5.9.12 now lets you switch from the default Spark 3.4.1 version(introduced in Fusion 5.9.10) to the earlier Spark 3.2.2 version used in Fusion 5.9.9.\
This flexibility helps maintain compatibility with legacy Python (3.7.3) and Scala environments, especially for apps that depend on specific Spark runtime behaviors.
When Spark 3.4.1 is enabled, custom Python jobs require Python 3.10.\
To enable Spark 3.2.2 instead, change the `fusion-spark` image in the configmap of the `job-launcher`, like this:
```yaml theme={"dark"}
driver:
container:
image: example.com/dir/fusion-spark-3.2.2
executor:
container:
image: example.com/dir/fusion-spark-3.2.2
```
> [!NOTE]
>
> The Spark 3.4.1 runtime is incompatible with Azure Blob Storage when accessed via the deprecated `wasbs://` protocol due to a Jetty version conflict; run Spark 3.2.2 instead if your jobs rely on `wasbs://`.
In the long term, we recommend migrating to the `abfs://` protocol for Azure Blob Storage access, which is fully supported in Spark 3.4.1.
* Fixed incorrect `started-by` values for datasource jobs in the job history.\
In previous versions, datasource jobs started from the Fusion UI were incorrectly shown as started by `default-subject` instead of the actual user.\
Fusion now correctly records and displays the initiating user in the job history, restoring accurate audit information for datasource operations.
* Fixed a schema loading issue that prevented older apps from working with the Schema API.\
Fusion now correctly handles both `managed-schema` and `managed-schema.xml` files when reading Solr config sets, ensuring backward compatibility with apps created before the move to template-based config sets.\
This prevents Schema API failures caused by unhandled exceptions during schema file lookup.
* Scheduled jobs now correctly trigger dependent jobs.\
In Fusion 5.9.12, we fixed an issue that prevented scheduled jobs from triggering other jobs based on their success or failure status.\
This includes jobs configured to run “on\_success\_or\_failure” or using the “Start + Interval” option.\
With this fix, dependent jobs now execute as expected, restoring reliable job chaining and scheduling workflows.
* Fixed an issue that prevented updates to existing scheduled job triggers in the Schedulers view.\
This bug was caused by inconsistencies in how the API returned UTC timestamps, particularly for times after 12:00 UTC. The Admin UI now correctly detects changes and allows updates to trigger times without requiring the entry to be deleted and recreated.
* Fixed multiple scheduling issues in the `job-config` service to improve reliability and user experience.\
This release includes several important fixes to ensure that scheduled jobs function correctly across upgrades and user actions:
* Improved leader election recovery: Ensures the scheduler service recovers if all `job-config` pods lose connection to ZooKeeper.
* Corrected permission checks: Prevents scheduling failures caused by mismatches between user and service account permissions.
* Fixed job history display for system jobs: Resolved an issue where delete-old-system-logs and delete-old-job-history jobs did not appear in the UI after upgrade, despite existing in the backend.
* Restored schedule creation in certain apps: Fixed a bug where clicking Save when adding a schedule in the Run dialog appeared to succeed but failed to persist the schedule in specific app states.
* Fixed a simulation failure in the Index Workbench when configuring new datasources.\
Fusion 5.9.12 resolves an issue where Index Workbench failed to simulate results after configuring a new datasource, displaying the error “Failed to simulate results from a working pipeline.”
This fix restores full functionality to the Index Workbench, allowing you to preview and configure indexing workflows in one place without switching between multiple views.
* Fixed a bug that caused aborted jobs to appear twice in the job history.\
Previously, when you manually aborted a job, it was recorded twice in the job history.\
This duplication has been resolved, and each aborted job now appears only once in the history log.
* Fixed an issue that prevented segment-based rule filtering from working correctly in Commerce Studio. Fusion now honors the `lw.rules.target_segment` parameter, ensuring only matching rules are triggered and improving rule targeting and safety.
* This release eliminates extra warning messages in the API Gateway related to undetermined service ports. Previously, the gateway logged repeated warnings about missing `primary-port-name` labels, even though this did not impact functionality. This fix reduces unnecessary log noise and improves the clarity of your logs.
* Fixed in the Fusion 5.9.15 release, this patch was also applied to Fusion 5.9.12:
Added a custom module that serializes Nashorn `undefined` values as JSON `null`, preventing serialization errors when such values appear in Java objects. When using the OpenJDK version of Nashorn, an exception was thrown when the context contained keys with undefined JavaScript values. This exception occurred because the class for the undefined values was not visible outside of the OpenJDK Nashorn package. A custom object mapper is added for the class so serialization issues are now resolved when handling `undefined` in JavaScript pipeline to run reliably under Java 17.
## Known issues
* Job-config service may appear “down” in UI even when running correctly.\
In Fusion versions 5.9.12 through 5.9.13, the job-config service may falsely report as “down” in the Fusion UI, particularly during startup or in TLS-enabled deployments.
This issue is fixed in Fusion 5.9.14.
> [!NOTE]
>
> For the `job-config` service, the **Next Run** value is updated *only after the current job completes*. Because the same job cannot run multiple times simultaneously, if another run is scheduled before the current job completes, that run is not executed.
* Jobs and V2 datasources may fail when Fusion collections are remapped to different Solr collections.\
In Fusion versions 5.9.12 through 5.9.13, strict validation in the `job-config` service causes “Collection not found” errors when jobs or V2 datasources target Fusion collections that point to differently named Solr collections.\
This issue is fixed in Fusion 5.9.14.\
As a workaround, use V1 datasources or avoid using REST call jobs on remapped collections.
* Saving large query pipelines may cause OOM failures under high load.\
In Fusion versions 5.9.12 through 5.9.13, saving a large query pipeline during high query volume can result in thread lock, excessive memory use, and eventual OOM errors in the Query service.\
This issue is fixed in Fusion 5.9.14.
* Some S3 and Web datasource jobs cannot be stopped in Fusion 5.9.12.\
Clicking the Stop button has no effect in some cases where the backend job is no longer being tracked. This causes the `job-config` service to ignore the job and prevents the system from updating the job status. A workaround is to issue a `POST {"action": "start"}` to the appropriate job actions endpoint, which aborts the stuck job.\
This issue is fixed in Fusion 5.9.14.
* Spark jobs may disappear from the job list after pod deletion\
In Fusion 5.9.12 and 5.9.13, Spark jobs may vanish from the job list if a Spark driver pod is deleted. This behavior can cause confusion and require a job-launcher restart to restore job visibility.\
This issue is fixed in Fusion 5.9.12.
* Jobs for Web V2 connectors may fail to start after an earlier failure.\
A bug in the connectors-backend service can prevent jobs from running if a previous crawl attempt was interrupted—for example, if the connector pod was scaled down mid-job.\
A subsequent crawl attempt may fail with the error `The state should never be null`, even after clearing the datasource configuration.\
This issue is fixed in Fusion 5.9.13.
* The `fusion-spark-3.2.2` image included in Fusion 5.9.12 contains a Fabric8 token refresh bug.\
This issue affects Spark jobs running in Kubernetes environments that rely on token-based authentication.\
Due to an outdated Fabric8 client library, the image fails to refresh Kubernetes tokens correctly, which can cause authentication errors in long-running or distributed Spark jobs.\
This issue is fixed in Fusion 5.9.13.
* The `job-config` service may report a `DOWN` status at `/actuator/health` even when it is fully operational.\
This issue can occur after a prolonged ZooKeeper outage when TLS is enabled.\
Despite the service being healthy and showing `UP` status on readiness and liveness checks, the `/job-config/actuator/health` endpoint may still report `DOWN`, potentially triggering false alarms or unnecessary restarts.\
This issue is fixed in Fusion 5.9.13.
* When upgrading to Fusion 5.9.12, add the following to your `values.yaml` file to avoid a known issue that prevents the `kuberay-operator` pod from launching successfully:
```yaml theme={"dark"}
kuberay-operator:
crd:
create: true
```
* Web connector may fail to index due to corrupted job state\
Fusion 5.9.12 may fail to index with the Webv2 connector (v2.0.1) due to a corrupted job state in the `connectors-backend` service.\
Affected jobs log the error `The state should never be null`, and common remediation steps like deleting the datasource or reinstalling the connector plugin may not resolve the issue.\
The issue is fixed in Fusion 5.9.13.
* Saving new datasource schedules may fail silently.\
In some Fusion 5.9.12 environments, clicking **Save** when adding a schedule from the datasource “Run” dialog does not persist the schedule or show an error message, particularly in apps created before the upgrade.\
As a workaround, use a new app or manually verify that the job configuration was saved.\
This issue is fixed in Fusion 5.9.13.
* The Apache Tika Container parser in Fusion 5.9.12 does not index the body field for SharePoint connector documents, such as DOCS, PPTX, and XLSX files. Documents are split into multiple parts, so the body content only ends up in child documents, while the parent document lacks the body field.
This issue is fixed in Fusion 5.9.15.
* Fusion 5.9.12 introduces updated built-in Solr configsets used by Fusion collections. The managed schema filename is `managed-schema.xml`, with updated configset names such as `_fusion_default`, `_fusion_query_rewrite`, `_fusion_signals`, `_fusion_user_prefs`, and `_fusion_blobs`.
Collections created prior to this change may still reference `managed-schema` without the `.xml` extension. While these collections serve queries normally after upgrade, Fusion UI features and APIs that access Solr configuration files may fail to load schema or configset data.
If you encounter schema or configuration access errors after upgrading, verify that affected collections use `managed-schema.xml` in their ZooKeeper configsets. Lucidworks recommends removing the legacy `managed-schema` file once the XML version is present to avoid ambiguity.
## Removals
For full details on removals, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### Bitnami removal
Fusion 5.9.12 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
### Tika Server Parser removal
The Tika Server Parser is removed in this release.
Use the [Tika Asynchronous Parser](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead. Asynchronous Tika parsing performs parsing in the background. This allows Fusion to continue indexing documents while the parser is processing others, resulting in improved indexing performance for large numbers of documents.
### MLeap removal
MLeap is removed from the `ml-model` service. MLeap was deprecated in Fusion 5.2.0 and was no longer used by Fusion.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.29, 1.30, 1.31
* **Microsoft Azure Kubernetes Service (AKS):** 1.29, 1.30, 1.31
* **Amazon Elastic Kubernetes Service (EKS):** 1.29, 1.30, 1.31
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.29, 1.30, 1.31; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.12 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.42.1 |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.13
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.13-release-notes
June 17, 2025
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.13-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.13-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/4dtlz0
Fusion 5.9.13 is a
[maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) that introduces
advanced SKU grouping with Solr collapse, custom certificates for indexing and querying services, and compatibility with Kubernetes 1.32.
Fusion 5.9.13 also improves authentication resilience with a configurable JWT timeout, and resolves key scheduling and security bugs to ensure greater stability and compliance in enterprise environments.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.13-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## What’s new
### Expanded support for collapsed search results
Now Fusion gives you access to all of the available Solr settings for collapsing search results, giving you finer control over how Fusion groups variations of each item into a single search result.
You can use collapse to improve conversion rates and customer satisfaction by streamlining search results, reducing cognitive load, and surfacing the most relevant product variations first.
For example, you can use a `product_id` field as the collapse field to group all versions or SKUs of a product into a single search result.
You can also control how Fusion selects the variation that represents the collapsed group; the default is the one most relevant to the user’s query.
For example, a user who searches for "red shoes" sees all of the red variations of shoes first, with the option to drill down and see all the variations.

Additional capabilities include:
* **Faceting compatibility**: Facets can reflect counts based on collapsed groups instead of individual SKUs.
* **Sorting options**: Choose how the representative SKU is selected using sort fields like `sales_rank` or `popularity_score`.
* **Expand support**: Optional expansion of collapsed groups allows users to see all SKUs for a product on demand.
* **Commerce Studio integration**: Merchandising actions such as pinning, boosting, and burying now apply to the entire product group, not just individual SKUs.
* **Query Workbench support**: You can preview collapsed and expanded result sets directly in Query Workbench for easy validation.
This update eliminates the need for custom collapse implementations and makes SKU/product rollup behavior a first-class capability in Fusion.
For complete details about the new configuration options, see the [Query Fields stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/search-fields-query-stage) configuration reference.
### Kubernetes 1.32 support for better security and long-term compatibility
Fusion 5.9.13 introduces full compatibility with Kubernetes version 1.32, ensuring seamless deployment and operation on the latest Kubernetes platforms.
This update allows you to take advantage of the latest stability, performance, and security improvements in Kubernetes, including better control over sidecar container behavior and improvements to admission webhooks and scheduling logic.
By supporting Kubernetes 1.32, Fusion stays aligned with cloud provider upgrades and helps future-proof your infrastructure, especially on managed services like AKS, EKS, and GKE.
### Improved JWT authentication resilience with configurable timeout
Fusion now allows you to configure the `jwkSetTimeout` variable in the JWT Realm settings, enabling better control over how long Fusion waits for a response when retrieving a JSON Web Key (JWK) set.
This improves authentication reliability in environments where key providers may respond slowly.
By increasing the default 500 ms timeout as needed (for example, to 2000 ms), you can reduce the risk of failed authentication due to network latency or external service delays.
You can configure this in the Fusion UI under the **System > Access Control > Security Realms** tab.
Alternatively, you can set this in the `security.initial-realm-configs` spring boot properties:
```yml theme={"dark"}
security:
initial-realm-configs:
realmType: jwt
enabled: true
name: jwt_okta
config:
autoCreateUsers: true
jwtIssuer: https://HOSTNAME/oauth2/default
jwkSetUri: https://HOSTNAME/oauth2/default/v1/keys
jwkSetTimeout: 2000
roleNames:
- developer
```
### Configurable vector quantization method in LWAI pipeline stages
Fusion 5.9.13 adds vector quantization in certain Lucidworks AI (LWAI) pipeline stages, making it easier to reduce memory usage and accelerate vector search without sacrificing quality.
Quantization converts high-precision float vectors into compact 8-bit integer vectors, significantly lowering storage and compute costs.
Now you can choose between `min-max` or `max-scale` quantization methods directly in the pipeline configuration interface for the LWAI vectorization stages:
* [LWAI Vectorize Field Index stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-vectorize-field)
* [LWAI Vectorize Query Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query)
To select the quantization method, go to **Model Config** in the LWAI pipeline stage configuration and enter the `vectorQuantizationMethod` parameter with the value for the desired method:

### Custom certificates for indexing and querying services
Fusion 5.9.13 introduces the ability add custom certificates for indexing and querying services, making it easier to align to your organization’s specific security requirements. This feature allows a Helm chart update to support persistent custom certificates and adding them into truststores during pod startup.
To add a custom certificate, create a new YAML file for your custom certificates and edit it to include your indexing or querying certificates. You must use different YAML files in order to use different certificates for indexing and querying services. See **Deploy Fusion at Scale** for full instructions, including the Helm chart update.
> **Deploy Fusion at Scale**
>
> Before you begin, see [Fusion Server Deployment](/docs/5/fusion/operations/deployment) to understand the architecture and requirements.
>
> This article explains how to plan and execute a Fusion deployment at the scale required for staging or production.
>
> While the `setup_f5_*.sh` scripts are handy for getting started and proof-of-concept purposes, this article covers the planning process for building a production-ready environment.
>
> > **[Preparing for Fusion Implementation](https://academy.lucidworks.com/preparing-for-fusion-implementation)**
> >
> > The course for **Preparing for Fusion Implementation** focuses on the key elements for a successful implementation, defining your business requirements, preparing clean data, and involving the right personnel.
>
> ## Prerequisites
>
> You must meet the following prerequisites before you can customize your Fusion cluster:
>
> * A local copy of the [fusion-cloud-native repository](https://github.com/lucidworks/fusion-cloud-native). This must be up-to-date with the latest master branch.
>
> * Any cloud provider-specific **command line tools**, such as `gcloud` or `aws`, and `kubectl`.\
> See the platform-specific instructions linked above, or check with your cloud provider.
>
> * Helm v3
> * To install on a Mac:
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
> * For other operating systems, download from [Helm Releases](https://github.com/helm/helm/releases).
> * Verify your installation:
> ```bash theme={"dark"}
> helm version --short
> v3.0.0+ge29ce2a
> ```
>
> * Kubernetes namespace
> * Collect the following information about your Kubernetes environment:
> * **CLUSTER**: Cluster name (passed to our setup scripts using the `-c` arg)
> * **NAMESPACE**: Kubernetes namespace where to install Fusion; a namespace should only contain lowercase letters (a-z), digits (0-9), or dash. No periods or underscores allowed.
>
> * *(optional)* Clarify your organization’s DockerHub policy. The Fusion Helm chart points to public Docker images on DockerHub. Your organization may not allow Kubernetes to pull images directly from DockerHub or may require extra security scanning before loading images into production clusters.\
> Consult your Kubernetes and Docker admin team to find how to get the Fusion images loaded into a registry that’s accessible to your cluster. You can update the image for each service using the [custom values YAML file](#custom-values-yaml-file).
>
> > [!TIP]
> >
> > **Kubernetes namespace tips**
> >
> > * Fusion 5 service discovery requires all services for the same release be deployed in the same namespace. Moreover, you should only run one instance of Fusion in a namespace. If you need multiple instances of Fusion running in the same Kubernetes cluster, then you need to deploy them in separate namespaces.
> > * If your organization requires CPU / Memory quotas for namespaces, you can start with a minimum of 12 CPU and 45GB of RAM (such as 3 x n1-standard-4 on GKE), but you will need to increase the quotas once you start load testing Fusion with production workloads and real datasets.
> > * Fusion requires at least 3 ZooKeeper nodes and 2 Solr nodes to achieve high availability.
>
> ## Custom values YAML file
>
> 1. Clone the `fusion-cloud-native` repository: `git clone https://github.com/lucidworks/fusion-cloud-native`
>
> 2. Run the `customize_fusion_values.sh` script.
>
> ```bash theme={"dark"}
> ./customize_fusion_values.sh --provider -c -n \
> --num-solr 3 \
> --solr-disk-gb 100 \
> --node-pool \
> --prometheus true \
> --with-resource-limits \
> --with-affinity-rules
> ```
>
> \[!TIP] Pass the `--help` parameter to see script usage details.
> The script creates the following files:
>
> | File | Description |
> | - | - |
> | `___fusion_values.yaml` | Main custom values YAML used to override Helm chart defaults for Fusion microservices. |
> | `___monitoring_values.yaml` | Custom values yaml used to configure Prometheus and Grafana. |
> | `___fusion_resources.yaml` | Resource requests and limits for all Microservices. |
> | `___fusion_affinity.yaml` | Pod affinity rules to ensure multiple replicas for a single service are evenly distributed across zones and nodes. |
> | `___upgrade_fusion.sh` | Script used to install and/or upgrade Fusion using the aforementioned custom values YAML files. |
>
> For an explanation of these placeholder values, see [Configuration Values](#custom-values-yaml-file) below.
>
> 3. Add the new files to version control. You will make changes to it over time as you fine-tune your Fusion installation. You will also need it to perform upgrades. If you try to upgrade your Fusion installation and don’t provide the custom values YAML, your deployment will revert to chart defaults.\
> Review the `___fusion_values.yaml` file to familiarize yourself with its structure and contents. Notice it contains a separate section for each of the Fusion microservices. The example configuration of the `query-pipeline` service below illustrates some important concepts about the custom values YAML file.
>
> ```yaml highlight={1,2,3,5,6} theme={"dark"}
> query-pipeline:
> enabled: true
> nodeSelector:
> cloud.google.com/gke-nodepool: default-pool
> javaToolOptions: "..."
> pod:
> annotations:
> prometheus.io/port: "8787"
> prometheus.io/scrape: "true"
> prometheus.io/path: "/actuator/prometheus"
> ```
>
> 4. Service-specific setting overrides under the top-level heading
>
> 5. Every Fusion service has an implicit enabled flag that defaults to true, set to false to remove this service from your cluster
>
> 6. Node selector identifies the label find nodes to schedule pods on
>
> 7. Used to pass JVM options to the service
>
> 8. Pod annotations to allow Prometheus to scrape metrics from the service
>
> Once we go through all of the configuration topics in this topic, you’ll have a well-configured custom values YAML file for your Fusion 5 installation. You’ll then use this file during the Helm v3 installation at the end of this topic.
>
> ### Deployment-specific values
>
> The script creates a custom values YAML file using the naming convention: `___fusion_values.yaml`. For example, `gke_search_f5_fusion_values.yaml`.
>
> | Parameter | Description |
> | - | - |
> | `` | The K8s platform you’re running on, such as `gke`. |
> | `` | The name of your cluster. |
> | `` | The K8s namespace where you want to install Fusion. |
> | `` | Specifies a `nodeSelector` label to find nodes to schedule Fusion pods on. |
>
> > [!WARNING]
> >
> > Providing the correct `--node-pool ` label is very important. Using the wrong value will cause your pods to be stuck in the `pending` state. If you’re not sure about the correct value for your cluster, pass ’'\` to let Kubernetes decide which nodes to schedule Fusion pods on.
>
> Default `nodeSelector` labels are provider-specific. The `fusion-cloud-native` scripts use the following defaults for GKE and EKS:
>
> | Provider | Default node selector |
> | - | - |
> | GKE | cloud.google.com/gke-nodepool: default-pool |
> | EKS | alpha.eksctl.io/nodegroup-name: standard-workers |
>
> > [!WARNING]
> >
> > If you are deploying Fusion 5.9.12, add the following to your `values.yaml` file to avoid a known issue that prevents the `kuberay-operator` pod from launching successfully: `yaml kuberay-operator: crd: create: true `
>
> ### Flags
>
> The script provides flags for additional configuration:
>
> | Flag | Description |
> | - | - |
> | `--node-pool` | Add a Fusion specific label to your nodes. |
> | `--with-resource-limits` | Configure resource requests/limits. |
> | `--with-replicas` | Configure replica counts. |
> | `--with-affinity-rules` | Configure pod affinity rules for Fusion services. |
>
> Use `--node-pool` to add a Fusion specific label to your nodes by doing:
>
> ```bash theme={"dark"}
> kubectl label fusion_node_type=
> ```
>
> Then, pass `--node-pool 'fusion_node_type: '`.
>
> ## Configure Solr sizing
>
> When you’re ready to build a production-ready setup for Fusion 5, you need to customize the Fusion Helm chart to ensure Fusion is well-configured for production workloads.
>
> You’ll be able to scale the number of nodes for Solr up and down after building the cluster, but you need to establish the initial size of the nodes (memory and CPU) and the size and type of disks you need.
>
> See the example config below to learn which parameters to change in the custom values YAML file.
>
> ```yaml expandable theme={"dark"}
> solr:
> resources: # Set resource limits for Solr to help K8s pod scheduling;
> limits: # these limits are not just for the Solr process in the pod,
> cpu: "7700m" # so allow ample memory for loading index files into the OS cache (mmap)
> memory: "26Gi"
> requests:
> cpu: "7000m"
> memory: "25Gi"
> logLevel: WARN
> nodeSelector:
> fusion_node_type: search # Run this Solr StatefulSet in the "search" node pool
> exporter:
> enabled: true # Enable the Solr metrics exporter (for Prometheus) and
> # schedule on the default node pool (system partition)
> podAnnotations:
> prometheus.io/scrape: "true"
> prometheus.io/port: "9983"
> prometheus.io/path: "/metrics"
> nodeSelector:
> cloud.google.com/gke-nodepool: default-pool
> image:
> tag: 8.4.1
> updateStrategy:
> type: "RollingUpdate"
> javaMem: "-Xmx3g -Dfusion_node_type=system" # Configure memory settings for Solr
> solrGcTune: "-XX:+UseG1GC -XX:-OmitStackTraceInFastThrow -XX:+UseStringDeduplication -XX:+PerfDisableSharedMem -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=150 -XX:+UseLargePages -XX:+AlwaysPreTouch"
> volumeClaimTemplates:
> storageSize: "100Gi" # Size of the Solr disk
> replicaCount: 6 # Number of Solr pods to run in this StatefulSet
>
> zookeeper:
> nodeSelector:
> cloud.google.com/gke-nodepool: default-pool
> replicaCount: 3 # Number of Zookeepers
> persistence:
> size: 20Gi
> resources: {}
> env:
> ZK_HEAP_SIZE: 1G
> ZOO_AUTOPURGE_PURGEINTERVAL: 1
> ```
>
> To be clear, you can tune GC settings and number of replicas after the cluster is built. But changing the size of the persistent volumes is more complicated so you should try to pick a good size initially.
>
> ### Configure storage class for Solr pods (optional)
>
> If you wish to run with a storage class other than the default you can create a storage class for your Solr pods before you install. For example, to create regional disks in GCP you can create a file called `storageClass.yaml` with the following contents:
>
> ```yaml theme={"dark"}
> kind: StorageClass
> apiVersion: storage.k8s.io/v1
> metadata:
> name: solr-gke-storage-regional
> provisioner: kubernetes.io/gce-pd
> parameters:
> type: pd-standard
> replication-type: regional-pd
> zones: us-west1-b, us-west1-c
> ```
>
> and then provision into your cluster by calling:
>
> ```bash theme={"dark"}
> kubectl apply -f storageClass.yaml
> ```
>
> to then have Solr use the storage class by adding the following to the custom values YAML:
>
> ```yaml theme={"dark"}
> solr:
> volumeClaimTemplates:
> storageClassName: solr-gke-storage-regional
> storageSize: 250Gi
> ```
>
> > [!NOTE]
> >
> > We’re not advocating that you must use regional disks for Solr storage, as that would be redundant with Solr replication. We’re just using this as an example of how to configure a custom storage class for Solr disks if you see the need. For instance, you could use regional disks without Solr replication for write-heavy type collections.
>
> ## Configure multiple node pools
>
> Lucidworks recommends isolating search workloads from analytics workloads using multiple node pools. The included scripts do not do this for you; this is a manual process.
>
> See the example script for GKE, see [create\_gke\_cluster\_node\_pools.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/additional_environments/create_gke_cluster_node_pools.sh).
>
> In the custom values YAML file, you can add additional Solr StatefulSets by adding their names to the list under the `nodePools` property. If any property for that statefulset needs to be changed from the default set of values, then it can be set directly on the object representing the node pool, any properties that are omitted are defaulted to the base value. See the following example (additional whitespace added for display purposes only):
>
> ```yaml expandable highlight={3,4,9,17,22,31} theme={"dark"}
> solr:
> nodePools:
> - name: ""
> - name: "analytics"
> javaMem: "-Xmx6g"
> replicaCount: 6
> storageSize: "100Gi"
> nodeSelector:
> fusion_node_type: analytics
> resources:
> requests:
> cpu: 2
> memory: 12Gi
> limits:
> cpu: 3
> memory: 12Gi
> - name: "search"
> javaMem: "-Xms11g -Xmx11g"
> replicaCount: 12
> storageSize: "50Gi"
> nodeSelector:
> fusion_node_type: search
> resources:
> limits:
> cpu: "7700m"
> memory: "26Gi"
> requests:
> cpu: "7000m"
> memory: "25Gi"
> nodeSelector:
> cloud.google.com/gke-nodepool: default-pool
> ...
> ```
>
> 1. The empty string `""` is the suffix for the default partition.
>
> 2. Overrides the settings for the **analytics** Solr pods.
>
> 3. Assigns the **analytics** Solr pods to the node pool and attaches the label `fusion_node_type=analytics`. You can use the `fusion_node_type` property in Solr auto-scaling policies to govern replica placement during collection creation.
>
> 4. Overrides the settings for the **search** Solr pods.
>
> 5. Assigns the **search** Solr pods to the node pool and attaches the label `fusion_node_type=search`.
>
> 6. Sets the default settings for all Solr pods, if not specifically overridden in the `nodePools` section above.
>
> > [!WARNING]
> >
> > Do not edit the `nodePools` value `""`.
>
> In the example above, the **analytics** partition `replicaCount`, or number of Solr pods, is six. The **search** partition `replicaCount` is twelve.
>
> Each nodePool is automatically be assigned the -Dfusion\_node\_type property of ``, ``, or ``. This value matches the name of the nodePool. For example, `-Dfusion_node_type=`.
>
> The Solr pods have a `fusion_node_type` system property, as shown below:
>
> 
>
> ## Solr auto-scaling policy
>
> Use [replica placement plugins](https://solr.apache.org/guide/solr/latest/configuration-guide/replica-placement-plugins.html) to control how replicas are placed in Solr.
>
> ## Pod network policy
>
> A Kubernetes network policy governs how groups of pods communicate with each other and other network endpoints. With Fusion, all incoming traffic flows through the API Gateway service. All Fusion services in the same namespace expect an internal JWT, which is supplied by the Gateway, as part of the request. As a result, Fusion services enforce a basic level of API security and don’t need an additional network policy to protect them from other pods in the cluster.
>
> To install the network policy for Fusion services, pass `--set global.networkPolicyEnabled=true` when installing the Fusion Helm chart.
>
> ## On-premises private Docker registries
>
> For on-premises Kubernetes deployments, your organization may not allow Kubernetes to pull [Fusion’s Docker images from DockerHub](https://hub.docker.com/u/lucidworks/). See the instructions below for details on using a private Docker registry with Fusion. These are general instructions that may need to be adapted to work within your organization’s security policies:
>
> 1. Transfer the public images from DockerHub to your private Docker registry.
> 2. Establish a workstation that has access to [DockerHub](https://hub.docker.com). This workstation must connect to your internal Docker registry, most likely via VPN connection. In this example, the workstation is referred to as `envoy`.
> 3. Install Docker on `envoy`. You need at least 100GB of free disk for Docker.
> 4. Pull all of the images from DockerHub to `envoy`’s local registry. For example, to pull the query pipeline image, run `docker pull lucidworks/query-pipeline:5.9.0`. See `docker pull --help` for more information about pulling Docker images.
> 5. Establish a connection from `envoy` to the private Docker registry, most likely via a VPN connection. In this example, the private Docker registry is referred to as ``.
> 6. Push the images from `envoy`’s Docker registry to the private registry. This will take a long time.
> 1. You’ll need to re-tag all images for the internal registry. For example, to tag the query-pipeline image, run:
> ```bash theme={"dark"}
> docker tag lucidworks/query-pipeline:5.9.0 /query-pipeline:5.9.0
> ```
> 2. Push each image to the internal repo:
> ```bash theme={"dark"}
> docker push /query-pipeline:5.9.0
> ```
> 7. Install the Docker registry secret in Kubernetes. Create the Docker registry secret in the Kubernetes namespace where you want to install Fusion:
> ```bash theme={"dark"}
> SECRET_NAME=
> REPO=
>
> kubectl create secret docker-registry "${SECRET_NAME}" \
> --namespace "${NAMESPACE}" \
> --docker-server="${REPO}" \
> --docker-username=${REPO_USER} \
> --docker-password=${REPO_PASS} \
> --docker-email=${REPO_USER}
> ```
> For details, see the Kubernetes article [Pull an Image from a Private Registry](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/).
> 8. Update the custom values YAML for your cluster to point to your private registry and secret to allow Kubernetes to pull images. For example:
> ```yaml theme={"dark"}
> query-pipeline:
> image:
> imagePullSecrets:
> - name:
> repository:
> ```
> Repeat the process for all Fusion services.
>
> ### Customize Helm Chart
>
> Every Fusion service allows you to override the `imagePullSecrets` setting using custom values YAML. However, other 3rd party services--including Zookeeper, Pulsar, Prometheus, and Grafana--don’t allow you to supply the pull secret using the custom values YAML.
>
> To patch the default service account for your namespace and add the pull secret, run the following:
>
> ```bash theme={"dark"}
> kubectl patch sa default -n $NAMESPACE \
> -p '"imagePullSecrets": [{"name": "" }]'
> ```
>
> In Windows using PowerShell or another CLI, you might have to escape the double quotes with a backslash (`\`) or reverse the order of single and double quotes:
>
> ```bash theme={"dark"}
> kubectl patch sa default -n $NAMESPACE \
> -p "'imagePullSecrets': [{'name': ''}]"
> ```
>
> > [!TIP]
> >
> > Replace `` with the name of the secret you created in the steps above.
>
> This allows the default service account to pull images from the private registry without specifying the pull secret on the resources directly.
>
> ## Add additional trusted certificate(s) to Fusion’s indexing and querying services *(optional)*
>
> You can add custom trusted certificates to support Fusion’s indexing and querying services. You may want to use custom trusted certificates if, for example, you have specific security requirements for data handling or need to support an existing infrastructure and its security needs. This method involves updating your Helm chart.
>
> If you want to add custom trusted certificates for both the indexing and querying services, follow these instructions twice: once for the indexing service, and once for the querying service. To add different certificates to the indexing and querying services, create one YAML file with the indexing service certificates and one YAML file for the querying service certificates before following these instructions.
>
> > [!TIP]
> >
> > You may use the same YAML file if you want to use the same certificates for both services.
>
> To add custom trusted certificates:
>
> 1. Create a new YAML file for your custom trusted certificates. The `customcerts.yaml` file is the example file in these instructions.
>
> 2. Add the custom certificate(s) in the YAML file created in the previous step. For example:
> ```yaml theme={"dark"}
> trustedCertificates:
> enabled: true
> files:
> some.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE-----
> other.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE---------
> ```
>
> 3. Update the indexing or querying service by running the following Helm command. Replace `EXAMPLE-VALUES-FILE.yaml` with your previous values file.
> ```bash theme={"dark"}
> helm upgrade --install --namespace ${EXAMPLE-NAMESPACE} ${HELM-RELEASE} ${HELM-CHART-PATH} --values EXAMPLE-VALUES-FILE.yaml --values customcerts.yaml
> ```
>
> 4. Verify the indexing or querying pod has a new `init-container` with the name `import-certs`.
>
> ## Add additional trusted certificate(s) for connectors to allow crawling of web resources with SSL/TLS enabled *(optional)*
>
> To crawl a datasource which for some reason is using a self-signed certificate, add arbitrary certificates to connectors. For example:
>
> ```yaml wrap expandable theme={"dark"}
> classic-rest-service:
> trustedCertificates:
> enabled: true
> files:
> some.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE-----
> other.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE---------
> connector-plugin:
> trustedCertificates:
> enabled: true
> files:
> some.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE-----
> other.cert: |-
> -----BEGIN CERTIFICATE-----
> MIIDeTCCAmGgAwIBAgIJAPziuikCTox4MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
> (...)
> EVA0pmzIzgBg+JIe3PdRy27T0asgQW/F4TY61Yk=
> -----END CERTIFICATE---------
> ```
>
> ### Generating the certificate on linux command line
>
> Use the following command to generate a `.crt` file in `$fusion_home/apps/jetty/connectors/etc/yourcertname.crt`:
>
> ```bash theme={"dark"}
> openssl s_client -servername remote.server.net -connect remote.server.net:443 $fusion_home/apps/jetty/connectors/etc/yourcertname.crt
> ```
>
> ### Generating the certificate using Firefox web browser
>
> 1. Navigate to the SharePoint host.
> 2. Click the  in the address bar, then click the  icon.
> 3. Next, navigate to **More Information** > **View Certificate** > **Export**.\
> Save the file to the following folder:
> `$fusion_home/apps/jetty/connectors/etc/yourcertname.crt`
>
> ### Generating the certificate using Chrome web browser
>
> 1. Navigate to **Chrome menu** > **More Tools** > **Developer Tools** > **Security Tab**.
> This will display the **Security overview**.
> 2. Click the **View certificate** button.
> 3. Save the file to the following folder:
>
> `$fusion_home/apps/jetty/connectors/etc/yourcertname.crt`
>
> ### Generating the certificate using powershell
>
> Use the following script to generate a `.crt`` file in `\$fusion\_home\apps\jetty\connectors\etc\yourcertname.crt\`\`:
>
> ```bash theme={"dark"}
> $fusion_home = c:\your\fusion\install\directory
> $webRequest = [Net.WebRequest]::Create("https://your-hostname")
> try { $webRequest.GetResponse() } catch {}
> $cert = $webRequest.ServicePoint.Certificate
> $bytes = $cert.Export([Security.Cryptography.X509Certificates.X509ContentType]::Cert)
> set-content -value $bytes -encoding byte -path "$fusion_home\apps\jetty\connectors\etc\yourcertname.binary.crt"
> certutil -encode "$fusion_home\apps\jetty\connectors\etc\yourcertname.binary.crt" "$fusion_home\apps\jetty\connectors\etc\yourcertname.crt"
> rm "$fusion_home\apps\jetty\connectors\etc\yourcertname.binary.crt" -f
> ```
>
> ## Install Fusion 5 on Kubernetes
>
> At this point, you’re ready to install Fusion 5 using the custom values YAML files and upgrade script. If you used the `customize_fusion_values.sh` script, run it using BASH:
>
> ```bash theme={"dark"}
> ./gke_search_f5_upgrade_fusion.sh
> ```
>
> Once the installation is complete, verify your Fusion installation is running correctly.
>
> ## Monitoring Fusion with Prometheus and Grafana
>
> Lucidworks recommends using Prometheus and Grafana for monitoring the performance and health of your Fusion cluster. Your operations team may already have these services installed. If not, install them into the Fusion namespace.
>
> > [!NOTE]
> >
> > The [Custom values YAML file shown above](#custom-values-yaml-file) activates the Solr metrics exporter service and adds pod annotations so Prometheus can scrape metrics from Fusion services.
>
> 1. Run the `customize_fusion_values.sh` script with the `--prometheus true` option. This creates an extra custom values YAML file for installing Prometheus and Grafana, `___monitoring_values.yaml`. For example: `gke_search_f5_monitoring_values.yaml`.
> 2. Commit the YAML file to version control.
> 3. Review its contents to ensure that the settings suit your needs. For example, decide how long you want to keep metrics. The default is 36 hours.\
> See the [Prometheus documentation](https://github.com/helm/charts/tree/master/stable/prometheus) and [Grafana documentation](https://github.com/helm/charts/tree/master/stable/grafana) for details.
> 4. Run the `install_prom.sh` script to install Prometheus & Grafana in your namespace. Include the provider, cluster name, namespace, and helm release as in the example below:
> ```bash theme={"dark"}
> ./install_prom.sh --provider gke -c search -n f5 -r 5-5-1
> ```
> \[!TIP] Pass the `--help` parameter to see script usage details.
> The Grafana dashboards from [monitoring/grafana](https://github.com/lucidworks/fusion-cloud-native/tree/master/monitoring/grafana) are installed automatically by the `install_prom.sh` script.
### Support for pre-filtering in the Chunking Neural Hybrid Query stage
For parity with the [Neural Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query), the [Chunking Neural Hybrid Query Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/chunking-neural-hybrid-query) now supports pre-filtering.
Pre-filtering can improve performance by reducing the number of chunks that need to be processed.
However, in some cases it can also lead to less accurate facet counts and search results.
Pre-filtering is blocked by default.
You can enable it by unchecking the **Block pre-filtering** checkbox in the Chunking Neural Hybrid Query stage configuration.
### Default Solr data commit parameter changed to autoCommit
Solr's `commitWithin` parameter was removed as the default at the collection level. The default parameter is now `autoCommit`.
Solr offers three methods to determine when newly-indexed documents are made visible in searches. The methods are manual commits, auto commit settings, and the per-update `commitWithin` parameter.
Fusion relies on Solr's commit mechanisms, but adds a Fusion-managed `commitWithin` policy per collection. Fusion's typical commit configuration includes the following parameters:
* The `autoCommit` setting (Solr hard commit) is Fusion's default parameter for Solr data commits, is inherited from the collection's `solrconfig.xml`, and defaults to `15` seconds. This saves the data, but does not force the search results to refresh immediately. With this setting, search performance is not slowed, but the new data may not show in search results until the next refresh. This property can be used instead of the `commitWithin` property.
* The `autoSoftCommit` setting (Solr soft commit) does not save the data, but makes the data visible to searches almost immediately. If the system crashes, that new data is lost because it has not been saved. The default is false, and search visibility is managed using the `commitWithin` setting.
* Solr's `commitWithin` parameter, configured at the collection level with a default of `10000` milliseconds, ensures data is committed and available for searching within 10 seconds. The default for signals collections is `1000` milliseconds. Fusion uses `commitWithin` to avoid relying on specific Solr-side configurations. The `com.lucidworks.apollo.solr.commitWithin` global property defines the default `commitWithin` for all documents added through Fusion. When you create a new collection in Fusion, its per-collection `commitWithin` is initialized from this global default.
For more information, see [Collection configuration properties](/docs/5/fusion/getting-data-in/indexing/collections/overview#collection-configuration-properties) and [various operations in the Collections API](/api-reference/collections/list-all-collections).
## Bug fixes
* Corrected the health reporting behavior for the `job-config` service after ZooKeeper disruptions.\
Fusion now ensures the `/actuator/health` endpoint correctly reflects the actual status of the `job-config` service, even after temporary ZooKeeper unavailability.\
This prevents false `DOWN` reports that could affect monitoring or automated recovery systems.
* Updated the `fusion-spark-3.2.2` image to resolve a Fabric8 token refresh bug.\
The Fabric8 Kubernetes client in this Spark image has been patched to fix a bug that prevented token refresh under OIDC authentication.\
This ensures that Spark jobs using `fusion-spark-3.2.2` run reliably in Kubernetes environments that require token-based authentication.
* Fixed a bug that prevented Web V2 connector jobs from restarting after failure.\
In previous versions, if a job was interrupted (such as by scaling down the connector pod), the connectors-backend service could enter a corrupted state, preventing future runs of the same job with errors like `The state should never be null`.\
Fusion now properly resets internal job state, ensuring that failed jobs can be restarted reliably.
* Fixed Web connector indexing failure caused by corrupted job state.\
Fusion 5.9.13 restores indexing functionality for the Webv2 connector (v2.0.1) by resolving an issue that caused a corrupted job state in the `connectors-backend` service.
Jobs that previously failed with `The state should never be null` can now complete successfully.
* Fixed an issue that prevented schedule changes from persisting for some datasources.\
In Fusion 5.9.12, clicking **Save** after configuring a new schedule for a datasource in the “Run” dialog could fail silently in certain apps, leaving the schedule unsaved with no warning to the user.\
This was due to a `job-config` handling issue that affected pre-existing app configurations.\
Fusion 5.9.13 resolves this issue so that new schedules are reliably saved and acknowledged as expected.
* Fixed permission handling in the `job-config` service to ensure scheduled jobs run as expected.\
Fusion now correctly handles permission checks when creating or modifying scheduled jobs, preventing failures caused by mismatches between user and service account permissions.\
This resolves issues where job could not be scheduled or executed following upgrades.
* Helm charts now support Kubernetes secrets for TLS keystore passwords.\
Fusion 5.9.13 updates the Helm charts to eliminate the use of plaintext passwords for TLS keystores. You can now securely manage the keystorePassword using a Kubernetes secret, aligning with hardened OpenShift and enterprise security policies.
* Upgraded the Spring framework in the `web-apps` service to improve security and ensure compatibility with token authentication behavior on modern Kubernetes platforms.
## Known issues
* Job-config service may appear “down” in UI even when running correctly\
In Fusion 5.9.13, the job-config service may falsely report as “down” in the Fusion UI, particularly during startup or in TLS-enabled deployments.\
This issue is fixed in Fusion 5.9.14.
> [!NOTE]
>
> For the `job-config` service, the **Next Run** value is updated *only after the current job completes*. Because the same job cannot run multiple times simultaneously, if another run is scheduled before the current job completes, that run is not executed.
* Jobs and V2 datasources may fail when Fusion collections are remapped to different Solr collections.\
In Fusion 5.9.13, strict validation in the `job-config` service causes “Collection not found” errors when jobs or V2 datasources target Fusion collections that point to differently named Solr collections.
This issue is fixed in Fusion 5.9.14.
As a workaround, use V1 datasources or avoid using REST call jobs on remapped collections.
* Saving large query pipelines may cause OOM failures under high load.\
In Fusion 5.9.13, saving a large query pipeline during high query volume can result in thread lock, excessive memory use, and eventual OOM errors in the Query service.\
This issue is fixed in Fusion 5.9.14.
* Some S3 and Web datasource jobs cannot be stopped in Fusion 5.9.13.\
Clicking the Stop button has no effect in some cases where the backend job is no longer being tracked. This causes the `job-config` service to ignore the job and prevents the system from updating the job status. A workaround is to issue a `POST {"action": "start"}` to the appropriate job actions endpoint, which aborts the stuck job.\
This issue is fixed in Fusion 5.9.14.
* Spark jobs may disappear from the job list after pod deletion\
In Fusion 5.9.12 and 5.9.13, Spark jobs may vanish from the job list if a Spark driver pod is deleted. This behavior can cause confusion and require a job-launcher restart to restore job visibility.\
This issue is fixed in Fusion 5.9.13.
## Deprecations and removals
For full details, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### Bitnami removal
Fusion 5.9.13 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
### Hybrid Query pipeline stage
The [Hybrid Query pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/hybrid-search-query) is now deprecated.
Instead, use the [Neural Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query), which combines lexical and vector search and includes improvements such as K-Nearest Neighbors (KNN), chunking, and more.
### Container image for `kafka-exporter`
Bitnami stopped supporting `kafka-exporter` and renamed the [docker repository](https://hub.docker.com/r/bitnamilegacy/kafka-exporter-archived) from `bitnami/kafka-exporter` to `bitnami/kafka-exporter-archived`.
If you were using `kafka-exporter`, then you need to update the repository name in your `values.yaml` file:
```yaml theme={"dark"}
kafka.metrics.kafka.image.repository=bitnami/kafka-exporter-archived
```
Changing the repository name will allow you to continue using Kafka metrics evaluation with Prometheus/Grafana.
### Removed deprecated `X-XSS-Protection` header from session API responses
Fusion 5.9.13 removes the deprecated `X-XSS-Protection` HTTP response header from the session API.
This header is no longer supported by modern browsers and has no effect on security behavior.
Its removal helps avoid confusion during security audits and aligns with current web security standards.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.29, 1.30, 1.31, 1.32
* **Microsoft Azure Kubernetes Service (AKS):** 1.29, 1.30, 1.31, 1.32
* **Amazon Elastic Kubernetes Service (EKS):** 1.29, 1.30, 1.31, 1.32
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.29, 1.30, 1.31, 1.32; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.13 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.42.1 |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.14
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.14-release-notes
Fusion 5.9.14 is a
[maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) that
adds official support for Kubernetes 1.33,
introduces the new Local Chunker index stage for Ray-hosted model support,
expands observability and async processing for pipelines, and
improves operational tooling with structured JSON logs.
This release also includes numerous internal security updates and system hardening improvements.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.14-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Fusion now supports Kubernetes 1.33 and kubectl 1.33
Fusion 5.9.14 adds official support for Kubernetes 1.33, including an upgrade to `kubectl` 1.33.
This ensures compatibility with the latest Kubernetes platform features, security patches, and performance improvements.
By aligning with Kubernetes 1.33:
* Platform compatibility is expanded, allowing you to deploy or upgrade Fusion in modern, compliant Kubernetes environments.
* Security posture is improved, as support for current Kubernetes versions ensures you benefit from upstream fixes and hardened defaults.
* Operational reliability is enhanced, reducing friction during upgrades and simplifying lifecycle management.
This update future-proofs your deployment infrastructure and allows DevOps teams to adopt the latest Kubernetes tooling without workarounds.
### New Local Chunker index stage
Fusion 5.9.14 adds a new [Local Chunker index pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/local-chunker-index-stage) that performs document chunking using models hosted in your own [Ray](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/local-chunker-index-stage#develop-and-deploy-a-chunking-machine-learning-model-with-ray) infrastructure as an alternative to SaaS-based Lucidworks AI.
This makes it easier to deploy RAG pipelines in fully self-hosted environments.
This stage gives you control over chunk processing and storage, with the option to include or exclude chunk text depending on your deployment preferences.
By default, it uses the vector context variable as input, aligning with the output of Ray-hosted models.
### Asynchronous processing for LWAI Vectorize Query and LWAI Prediction pipeline stages
To help reduce query latency and improve overall performance, the [LWAI Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) and [LWAI Prediction](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lucidworks-ai-prediction-query-stage) stages now support asynchronous execution.
This enhancement allows more efficient parallel processing in pipelines that use multiple AI-powered stages.
As with other async-enabled stages, you can aggregate results using the [Merge Async Results](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/merge-async-results-query-stage) stage.
### Standardized component logging using structured JSON format
Fusion services can now log in structured JSON format instead of plaintext (Log4j-style) output. This improves compatibility with monitoring tools and log aggregation systems by making logs easier to parse, filter, and analyze.
JSON logging is supported for the following services:
* `admin`
* `apps-manager`
* `connectors`
* `connectors-backend`
* `connectors-classic`
* `distributed-compute` (`job-launcher`, `job-rest-server`)
* `indexing`
* `job-config`
* `ml-model-service` (including `kuberay-operator`, `seldon-webhook-service`)
* `proxy` / `api-gateway`
* `query`
* `solr`
* `templating`
* `webapps`
JSON logging is off by default.
To enable it, you can set `jsonOutput: true` globally or for specific services in the `values.yaml` configuration file.
This update does not affect log formats in the following services:
* `admin-ui`
* `auth-ui`
* `insights`
* `pm-ui`
* `rules-ui`
* `argo`
* `kafka`
* `spark`
* `zookeeper`
### Improved visibility for Solr ingestion errors
Fusion 5.9.14 enhances logging for Solr indexing. These improvements make it easier to identify and address problematic documents without losing valid ones:
* The system logs detailed information about each document that fails to index, including the cause of the error.
* Logs use a structured, machine-readable format, making them easier to parse and monitor.
* Indexing continues for valid documents even when some fail, preventing unnecessary data loss.
These changes help you troubleshoot ingestion issues faster, trace failures to specific documents, and keep indexing pipelines running smoothly in self-hosted Fusion environments.
### Security improvements
Fusion 5.9.14 includes a broad set of internal security fixes and hardening updates. These updates improve the overall security posture of the platform by addressing potential vulnerabilities and ensuring better alignment with secure development best practices.
This ongoing work helps protect your deployments from evolving threats and ensures Fusion continues to meet enterprise-grade security standards.
## Bug fixes
* Fixed an issue where certain datasource jobs could not be stopped.
Fusion 5.9.14 resolves this issue and restores proper job control behavior.
* Fixed excessive debug logging in Spark driver pods.
Fusion 5.9.14 reduces logging verbosity by default.
* Fixed pipeline errors in Commerce Studio caused by empty or invalid collection names.
Fusion 5.9.14 resolves this issue by correcting the thread handling logic, validating collection name inputs, and raising logging levels to warn when invalid configurations are detected, helping you troubleshoot more effectively and avoid unnecessary pipeline failures.
* Fixed an issue where Spark jobs would disappear from Fusion after pod deletion.
Fusion 5.9.14 ensures Spark jobs remain visible and manageable even after pod restarts.
* Fixed out-of-memory errors when saving large query pipelines under high load.
Fusion 5.9.14 resolves this issue by disabling unnecessary JMX monitoring in script engine pools and improving thread synchronization, ensuring pipeline changes no longer disrupt high-RPS environments.
* Fixed job and datasource errors when Fusion collections pointed to remapped Solr collections.
Previously, jobs and V2 datasources failed with "Collection not found" errors when a Fusion collection pointed to a Solr collection with a different name.
Fusion 5.9.14 removes this restriction, allowing jobs and datasources to work with valid Fusion collections regardless of Solr collection naming, restoring expected behavior and improving compatibility with remapped environments.
* Fixed incorrect "down" status reporting in the `job-config` service.
In some cases, the `job-config` service could incorrectly report a "down" status in the Fusion UI, even though the service was healthy and running.
Fusion 5.9.14 corrects this reporting error so the UI reflects the true status of the service, making it easier to monitor system health and avoid unnecessary debugging.
> [!NOTE]
>
> For the `job-config` service, the **Next Run** value is updated *only after the current job completes*. Because the same job cannot run multiple times simultaneously, if another run is scheduled before the current job completes, that run is not executed.
## Known issues
In some asynchronous pipeline stages, the "Asynchronous Execution Config" checkbox is misaligned such that the checkbox is not directly clickable.
To work around this issue, click on the checkbox title, "Asynchronous Execution Config".
The checkbox alignment is fixed in Fusion 5.9.15.
## Removals
### Bitnami removal
Starting August 28, 2025, Bitnami will be removed from Fusion's Helm charts due to changes in how they host images.
Fusion 5.9.14 includes an updated Helm chart with new image references.
Upgrading to this release ensures continued access to container images and prevents deployment issues.
See [Docker Images by Fusion Version](/docs/5/fusion/reference/docker-images-versions) for the complete list of container images.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.29, 1.30, 1.31, 1.32, 1.33
* **Microsoft Azure Kubernetes Service (AKS):** 1.29, 1.30, 1.31, 1.32, 1.33
* **Amazon Elastic Kubernetes Service (EKS):** 1.29, 1.30, 1.31, 1.32, 1.33
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.29, 1.30, 1.31, 1.32, 1.33; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.14 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.15
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.15-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.15-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.15-release-notes
Released on October 16, 2025, Fusion 5.9.15 is a [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) that includes scalability enhancements to LWAI stages, accuracy improvements in the Consumption Dashboard entitlement reporting, expanded monitoring metrics for asynchronous query stages, security fixes, and updated UI behavior.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.15-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
> **Upgrade notes for Stage SDK plugins**
>
> Fusion 5.9.15 upgrades the Stage SDK to v2.0.0.
> Any custom plugins compiled with SDK v1.0.0, such as `query-sample-plugin-stage-0.0.1.zip` and `index-sample-plugin-stage-0.0.1.zip`, will not load after the upgrade.
> Pipelines that reference those stages will be hidden until you install SDK v2.0.0 replacements.
>
> Take these steps before you begin the upgrade process.
>
> 1. Rebuild your plugins against Stage SDK v2.0.0.
> * Example outputs:
> * `2-0-0-query-sample-plugin-stage-0.0.2.zip`
> * `2-0-0-index-sample-plugin-stage-0.0.2.zip`
> > [!WARNING]
> >
> > Do not remove v1.0.0 plugins before installing their 2.0.0 replacements because pipelines still reference the old classes stored in ZooKeeper.
>
> 2. Use Java 11 to recompile the plugins.
>
> 3. Update your `gradle.properties` file to use v2.0.0 of the Stage SDK. For the Query Stage SDK, use:
>
> ```bash theme={"dark"}
> queryStagePluginSDKVersion=2.0.0
> ```
>
> For the Index Stage SDK, use:
>
> ```bash theme={"dark"}
> indexStagePluginSDKVersion=2.0.0
> ```
>
> 4. Verify that the `queryStagePluginSDKVersion` or `indexStagePluginSDKVersion` variable is used in the `build.gradle` task that builds the SDK stage. The following example uses the Query Stage SDK:
>
> ```bash theme={"dark"}
> attributes 'Plugin-SDK-Version': "${queryStagePluginSDKVersion}"
> ```
>
> See the [Query Stage SDK sample stage](https://github.com/lucidworks/query-stage-sdk/blob/master/examples/sample-plugin-stage/build.gradle) for an example.
>
> 5. Audit your pipelines and remove or replace any stages that no longer exist or are changed in the new plugins. If a pipeline still references a removed stage, it will continue to fail deserialization after upgrade.
>
> > [!WARNING]
> >
> > Pipelines using custom stages will be hidden between the moment you upgrade and the moment you install the new plugins.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Consumption Dashboard update
The [Consumption Dashboard](/docs/5/fusion/operations/monitoring-and-reporting/consumption) uses graphs to visually track request and document usage against the allotted consumption for a Fusion license. The hover interaction for **requests per pipeline** graphs now displays a sortable list of pipelines to make it easier to analyze pipeline-level consumption.
Pipelines in a **requests per pipeline** graph can be sorted in the following ways:
* **Value descending**: sort pipelines according to number of requests from most to least.
* **Value ascending**: sort pipelines according to number of requests from least to most.
* **Alphabetically ascending**: sort by pipeline name from A to Z.
* **Alphabetically descending**: sort by pipeline name from Z to A.

Sortable requests per pipeline graph
### Gain deeper insight into asynchronous query performance
Monitoring for asynchronous [query stages](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/overview) is expanded to provide performance insights for async workloads, allowing for better optimization and more efficient troubleshooting.
Structured logs and Grafana dashboards for each async stage let you view metrics, including the following:
* Execution time and trends for how long a job or request takes from start to finish.
* Success rates for percentage of requests and jobs that complete without error.
* Number of retries for how many retry attempts were made after initial failures.
* Queue wait times for the time a job or request spends waiting to be processed.
* Resource usage for consumption of compute/storage/network by workload or tenant.

The monitoring dashboard now includes additional metrics
Prometheus metrics are used across async stages for additional visibility into query behavior, such as query performance comparisons across different filters and per-node monitoring to identify which Fusion node handled a specific query.
Logs can be filtered by:
* Application
* Pipeline
* Profile
* Stage
* Execution status
* Custom time ranges
This visibility makes it easier to detect performance bottlenecks, identify root causes of failures, and tune pipeline behavior across applications and query profiles.
### New Retrieval-Augmented Generation (RAG) query stage
Lucidworks continues expanding RAG capabilities that improve the quality and accuracy of LLM-powered retrieval workflows.
Documents that require chunking tend to be large and cover multiple topics.
Queries return an answer that links to the document, but the answer does not show exactly *where* to find that information in the document.
A [Chunking RAG Bridge Query Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/chunking-rag-bridge) is introduced to evolve RAG from document-level retrieval to chunk-level precision.
With this new stage, each cited source that accompanies a RAG answer also provides a link to the relevant document along with a snippet containing information about where to find the content in the document.
[Chunking RAG Bridge Stage demo](https://app.supademo.com/embed/cmgl2bfjg34kvkrn9e1jppfac?embed_v=2\&utm_source=embed)
### New Batch Vectorize index stage
Fusion 5.9.15 introduces an [LWAI Batch Vectorize Index Stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-batch-vectorize-index-stage) for AI pipelines.
This works the same as the [LWAI Vectorize Field stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-vectorize-field) but delivers faster indexing throughput because it processes your documents in batches before sending those documents to the next stage in your index pipeline. The LWAI Batch Vectorize stage can improve document indexing performance up to ten times the rate of the LWAI Vectorize Field stage.
The LWAI Vectorize stage processes documents one at a time.

Flowchart for single document processing
With the LWAI Batch Vectorization Index stage, Fusion can send multiple documents per API call, reducing API overhead and improving scalability.

Flowchart for batch document processing
This stage includes new properties.
A batch is forwarded to the API as soon as it is full or when the wait time elapses, whichever comes first.
> **Configurable properties added:**
>
> **Maximum Batch Size**
>
> Maximum number of documents per batch (up to 32).
>
> **Maximum Batch Delay**
>
> Maximum time to wait in milliseconds since the first document is buffered before proceeding.
### Restrictive mode for query pipelines
Fusion 5.9.15 introduces restrictive mode, a new way to safeguard query pipelines against unauthorized or risky changes.
When you enable restrictive mode, Fusion enforces stricter query parameter validation and sanitization, blocking unsafe inputs and limiting potentially expensive operations.
This feature helps you improve security and prevent costly mistakes.
See [Restrictive Mode](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/restrictive-mode) for complete details about how restrictive mode works and how to enable it.
### Fusion stage SDKs updated to support JDK 11
The [Index Stage](/docs/5/fusion/dev-portal/index-stage-sdk) and [Query Stage](/docs/5/fusion/dev-portal/query-stage-sdk/overview) SDKs in self-hosted Fusion now support JDK 11.
> [!NOTE]
>
> These updates apply only to self-hosted Fusion and are not supported in Lucidworks Search.
Adding support for JDK 11 does the following:
* Increases runtime success.
* Improves dependency management to build plugins against stable versions.
* Ensures long-term compatibility of critical operational pipelines for plugin developers.
* Enables support for existing search functionality when planning upgrades.
### Fusion Admin UI updates
Several updates to the Fusion Admin UI improve safety and usability:
* A description is added to the JSON Facets stage, clarifying its purpose.

* UI labels are added for Ray model deployment jobs, grouping them under “Model Deployment Jobs” for clarity and discoverability.

* The **Asynchronous Execution Config** checkbox for the AI pipeline stages is now properly aligned with its label for better visual consistency and user experience.

* An optional red banner can be added across the bottom of all production environments as a visual reminder that you are in a production environment. The banner is static and non-dismissible, reducing the risk of accidental misconfiguration.

To enable the banner, add the following to your custom values YAML files.
```yaml theme={"dark"}
admin-ui:
banner:
enabled: true
```
If you would like to customize the text that shows in the UI, you can add parameters to your custom values YAML file.
```yaml theme={"dark"}
admin-ui:
banner:
enabled: true
text: "CUSTOM_BANNER_MESSAGE"
backgroundColor: "#ff4444"
textColor: "#ffffff"
fontSize: "14px"
fontWeight: "bold"
position: "bottom"
```
Configuration parameters:
* `text` (required): the message displayed in the banner
* `backgroundColor`: background color; default is red #ff4444
* `textColor`: text color; default is white #ffffff
* `fontSize`: font size; default is 14px
* `fontWeight`: font weight; default is bold
* `position`: banner position - bottom or top; default is bottom
### Naming conventions for AI-generated fields
Fields generated by Lucidworks AI now include a prefix of `lwai_` when indexed to Solr, making it easier to identify those fields when excluding them or using them for other tasks, such as rules, queries, or reports. Any field names previously generated are still supported and no changes are needed to continue using them.
### Additional Selenium support for the Web V2 connector
For users of the [Web V2 connector](/docs/fusion-connectors/connectors/web-v2) v2.2.1 and later, Fusion 5.9.15 improves support for Selenium Grid. The Selenium service is now installed automatically with the Web V2 connector and removed automatically when the connector is removed, resulting in faster setup and ease of use.
### Smarter hybrid search
Resiliency is improved for searches using the [Neural Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/neural-hybrid-query).
When a hybrid query depends on vectorization, failures in the upstream vectorization stage previously resulted in incomplete or unstable search behavior.
Now Fusion automatically switches to lexical-only search if vectorization is unavailable to ensure uninterrupted results.
Clear indicators and improved logging make it easier to understand when the fallback occurs:
* If no vector is produced, you will see the message: `Input vector value is blank, skipping vector processing`.
* If a vector exists but is empty, you will see the message: `Input vector value is empty, {}, skipping vector processing`.
### Ability added for Prediction API
The Prediction API now supports [image metadata enrichment](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-prediction-api/image-metadata-enrichment). This API use case generates keywords and categories for images. This information can then be used as metadata for SEO, image-based product discovery, and more.
[Image metadata enrichment in the LWAI Prediction API](https://app.supademo.com/embed/cmh52yul62d9ccdwpmb0a8yl3?embed_v=2\&utm_source=embed)
### Enhanced previews for integrated Lucidworks Platform products
A new, system-level API was added to Fusion 5.9.15 that allows Commerce Studio and other Lucidworks Platform products to simulate configuration changes before they are published. This change supports the following improvements:
* **Improved safety:** Test and validate changes without affecting live search traffic, reducing the risk of errors or downtime.
* **Faster iteration:** Experiment and refine configurations in real time, improving development speed and decision-making.
* **Higher confidence in publishing:** Preview query behavior before deployment to increase trust in changes and reduce rollback events.
> [!WARNING]
>
> Beginning with Fusion 5.9.15, all Commerce Studio integrations must have the `POST:/query/*/preview` and `GET,POST,PUT:/query-pipelines/**` permissions assigned to both the `lwp_user` and `lwp_service_account` roles in Fusion. Verify that your roles meet the following requirements:
>
> ```bash lines highlight={3-4} lwp_user theme={"dark"}
> GET,PUT,DELETE,POST,HEAD:/query/experience-manager/**
> GET,POST:/query/*
> POST:/query/*/preview
> GET,POST,PUT:/query-pipelines/**
> GET:/suggestions/**
> GET:/solr/*/terms
> PUT,POST,GET:/apps/*/query-pipelines/**
> GET:/apps/*/query-profiles/**
> GET,PUT:/apps/*
> GET:/solr/*/admin/luke
> GET:/solr/**
> ```
>
> ```bash lines highlight={3-4} lwp_service_account theme={"dark"}
> GET,PUT,DELETE,POST,HEAD:/query/experience-manager/**
> GET,POST:/query/*
> POST:/query/*/preview
> GET,POST,PUT:/query-pipelines/**
> GET:/suggestions/**
> GET:/solr/*/terms
> PUT,POST,GET:/apps/*/query-pipelines/**
> GET:/apps/*/query-profiles/**
> GET,PUT:/apps/*
> GET,DELETE,PATCH,PUT,POST,HEAD:/apps/*/query-rewrite/**
> GET,HEAD:/templating/**
> GET:/solr/*/admin/luke
> GET:/solr/**
> ```
## Bug fixes
* Added a custom module that serializes Nashorn `undefined` values as JSON `null`, preventing serialization errors when such values appear in Java objects. When using the OpenJDK version of Nashorn, an exception was thrown when the context contained keys with undefined JavaScript values. This exception occurred because the class for the undefined values was not visible outside of the OpenJDK Nashorn package. A custom object mapper is added for the class so serialization issues are now resolved when handling `undefined` in JavaScript pipeline to run reliably under Java 17.
* Time zone conversion issues are fixed in the Consumption Dashboard that caused counts to span extra days. The time selector was creating an overlap due to UTC conversion that included counts for both the selected day and the following day. As the API only accepts dates and not times, the time selector was removed to ensure accurate daily totals for entitlement reporting.
* Addressed an issue where jobs are stuck in a running state during an upgrade. Allowing all crawl jobs to complete before performing Fusion upgrades is necessary to maintain data integrity and prevent invalid job states. Now requests to stop jobs during an upgrade process are enhanced to check for invalid states, attempt automatic fixes, and provide detailed status messages.
* Adjusted license checks when apps-manager is unavailable for consistent and predictable license validation behavior. In previous releases, if apps-manager was unavailable or license capabilities could not be verified, the license check could not complete. The addition of broader exception catching when retrieving license capabilities and improved error logging for service unavailability ensures predictable capability behavior while connectivity is restored.
* Fixed a permissions flow in the Fusion indexing path used by V2 connectors. REST calls made from index pipelines using V2 connectors were running without the required permissions. This returned insufficient permissions errors and skipped mapped fields. REST calls in index pipelines now execute as expected when using the required privileges.
* Fixed an error where the Tika asynchronous parser in Fusion 5.9.12 did not index the body field for SharePoint connector documents, such as DOCS, PPTX, and XLSX files. Documents were split into multiple parts, so the body content only ended up in child documents, while the parent document lacked the body field. Now the first parsed part of the document is sent to Fusion using the parent document ID so the body field merges into the expected parent document. This restores expected content extraction and preserves child parts for images and other embeds.
## Known issues
Upgrading to Fusion 5.9.15 moves stage SDKs from v1.0.0 to v2.0.0.
When upgrading, plugins compiled with SDK v1.0.0 do not load.
Pipelines referencing those stages remain hidden until you replace the plugins.
* Before upgrading, rebuild any custom index or query plugins from SDK v1.0.0 using SDK v2.0.0. Also, verify pipelines do not reference stages removed or renamed in the new plugins.
* After upgrading, upload the new plugin ZIP files to the blob store and wait for the installation to complete. At this point, the pipelines will reappear.
See [Upgrade notes for Stage SDK plugins](#upgrade-notes-for-stage-sdk-plugins) above for more details.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### Deprecated jobs
The following jobs are deprecated in this release and will be removed in a future release:
* [Head/Tail Analysis](/docs/5/fusion/reference/config-ref/jobs/head-tail-analysis)
* [Phrase Extraction](/docs/5/fusion/reference/config-ref/jobs/phrase-extraction)
* [Synonym Detection](/docs/5/fusion/reference/config-ref/jobs/synonym-detection)
* [Token and Phrase Spell Correction](/docs/5/fusion/reference/config-ref/jobs/token-and-phrase-spell-correction)
Lucidworks recommends migrating to [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview), which achieves superior relevance compared to these legacy machine learning methods.
Rules previously generated by these jobs and promoted to the `_query_rewrite` collection will remain until you delete them.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.29, 1.30, 1.31, 1.32, 1.33
* **Microsoft Azure Kubernetes Service (AKS):** 1.29, 1.30, 1.31, 1.32, 1.33
* **Amazon Elastic Kubernetes Service (EKS):** 1.29, 1.30, 1.31, 1.32, 1.33
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.29, 1.30, 1.31, 1.32, 1.33; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.15 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.16
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.16-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.16-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.16-release-notes
Released on February 24, 2026, Fusion 5.9.16 is a [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) that focuses on smoother upgrades and more dependable production behavior across connectors, query pipelines, indexing, and security.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
> [!WARNING]
>
> If you use Seldon models or Smart Answers, which depends on Seldon, and override `JAVA_TOOL_OPTIONS` or `javaToolOptions` in your Helm values for `ml-model-service`, `fusion-query`, or `fusion-indexing`, the required protobuf flag is lost when you upgrade to Fusion 5.9.16. Without this flag, Seldon model serving and Smart Answers will fail.
>
> To avoid this:
>
> 1. Locate where you set `JAVA_TOOL_OPTIONS` or `javaToolOptions` in your Helm values.
> 2. Add `-Dcom.google.protobuf.use_unsafe_pre22_gencode` to your Java options.
> 3. Validate Seldon models or Smart Answers after upgrade.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.16-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
> [!NOTE]
>
> Fusion 5.9.16 upgrades the SolrJ library from 8.11.x to 9.4.1. This upgrade changes how Solr resolves naming conflicts between physical collections and aliases. Previously, alias resolution was checked first, so queries against an alias name correctly expanded to the alias's underlying collections. After this upgrade, physical collections take priority over aliases of the same name. If a physical collection and a Solr alias share the same name, queries will be routed to the physical collection rather than the alias.
>
> Before upgrading to 5.9.16, check whether any physical collections in your environment share a name with a Solr alias. If a conflict exists, rename the physical collection to remove the ambiguity and ensure correct query routing after upgrading.
## Key highlights
### Fusion Spell Check query stage
The [Spell Check query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/spell-check-query-stage) lets you invoke a spell checking function that returns relevant spelling suggestions when queries contain misspellings or typing errors.
[Configure the Spell Check query stage](https://app.supademo.com/embed/cmkxfv7q50yd2tw9fqt7jgili?embed_v=2\&utm_source=embed)
If a query doesn't return the minimum number of results you specify, a spell checking function searches dictionaries, indexed data, and files to discover close matches to the terms entered in the query. Using this stage provides the following benefits:
* Enhances your customer's search experience by suggesting relevant terms even if they mistype query terms.
* Improves search relevance by discovering possible matches to terms entered in queries.
* Minimizes zero search result experiences by returning potential matches to mistyped search terms.
You can configure the Spell Check stage to retrieve suggestions based on the results from the following stages:
* Solr Query stage, which is more effective for lexical searches.
* Neural Hybrid Query stage or Chunking Neural Hybrid Query stage, which is more effective for semantic searches.
This example shows the Spell Check Query pipeline configured to use the **Result Count Threshold**, which uses the results from the Solr Query stage.
> [!WARNING]
>
> If you configure both the **Result Count Threshold** field and the **Cutoff margin (NHS)** field in the **same** query pipeline, **only** the **Result Count Threshold** field value that uses Solr Query stage results is used. The **Cutoff margin (NHS)** setting is ignored.

Spell Check query pipeline stage
If you want to configure Spell Check query stages based on the results for both a Solr Query stage and a neural hybrid query stage, the best practice is to set up these pipelines:
* A query pipeline with a Spell Check stage using the Solr Query stage results.
* A different query pipeline with a Spell Check stage that uses the lexical score from either the Neural Hybrid Query stage or Chunking Neural Hybrid Query stage.
After the stage is configured, you can test by entering misspelled search terms in Query Workbench, and reviewing the suggestions returned by the spell check function. For example, if you enter `electronc`, the query does not return any results. The Spell Check stage triggers the spell checking functions, and possible matches display in the **Did you mean?** section.

Spell Check suggestions in the Query Workbench
Spell check suggestions are returned in the query response JSON within the `fusion.spellcheck_stage_suggestions` array:
```json highlight={3} wrap Spell check suggestions theme={"dark"}
{
"fusion": {
"spellcheck_stage_suggestions": ["electronic", "electronics", "electric", "election", "electro"]
}
}
```
Because the spell checking function returns suggestions from your indexed data, you can test terms specific to your organization that customers may commonly mistype. Testing in Query Workbench lets you verify the suggestions and results your customers will see in their search experience.
### Consumption Dashboard update
The consumption dashboard is updated to make entitlement discovery easier and reporting more accurate.
A new **Hide Temporary Pipelines** checkbox streamlines filtering by removing temporary pipelines from view with a single click. Previously, excluding temporary pipelines required manually deselecting each one, which could be cumbersome when dealing with dozens of pipelines.

After

Before
New **Hide Temporary Pipelines** checkbox
Consumption reporting now properly excludes signals and signals aggregations collections from entitlements metrics. These collections were previously included incorrectly, which could inflate indexed record counts and complicate entitlement tracking.
### Customizable annotations and labels for Kubernetes resources
Fusion now supports customizable annotations and labels for all Kubernetes resources through values files, eliminating the need for direct chart template modifications and simplifying upgrades for enterprise deployments.
Previously, if you needed to apply organization-specific annotations and labels to Fusion Kubernetes resources, you had to modify chart templates directly. This approach increased upgrade complexity, introduced maintenance overhead, and created risk during version migrations.
With this enhancement, you can now configure custom annotations and labels through either global values that apply to all services or service-specific values that apply only to individual charts. Common use cases include adding cost allocation labels, ownership labels, monitoring annotations, or service mesh annotations such as controlling Istio sidecar injection.
Global values apply to all Fusion services:
```yaml theme={"dark"}
global:
labels:
owner: search-platform
annotations:
cost-center: fin-1234
```
Service-specific values apply only to that chart:
```yaml theme={"dark"}
fusion-indexing:
labels:
team: platform-search
annotations:
monitoring: enabled
```
The chart automatically merges and renders these values into Kubernetes resource metadata. This improves upgrade supportability by keeping your configurations separate from chart templates, reducing the risk of conflicts during version updates and eliminating the need to reapply and review template modifications on every upgrade.
### Timeout improvements for query pipeline stability and control
Fusion now includes multiple improvements that make query timeouts more consistent and production-friendly, especially under heavy load.
#### Enforcing an end-to-end query pipeline timeout using a request header
Previously, the gateway could time out using the default of 15 seconds while the query pipeline continued running in the background. This decreased stability during load spikes. With this change, Fusion checks the remaining time after each pipeline stage and cancels execution when the timeout is exceeded.
#### Fail pipelines when Solr returns partial results
When Solr exceeds a `timeAllowed` query limit, it can return `HTTP 200` with partial results that can break downstream pipeline stages. Fusion now detects these partial results and fails the pipeline by default to avoid producing incomplete or misleading responses. A new Solr Query stage option of **Process partial results** can be enabled to continue processing when partial results are acceptable.

After

Before
Solr Query stage **Process partial results** option
#### More consistent Solr query limit enforcement across deployments
Fusion improves default query limit enforcements such as `timeAllowed` and `cpuAllowed` and aligns image and configset behavior so limits are applied consistently across deployments. This includes updated defaults with property overrides, a handler with higher limits for analytics workloads, and configuration updates to ensure query limits remain enforced.
### Query pipeline performance and routing improvements
#### Smoother performance under burst traffic
Pipeline creation is meant to be cached after the first request. Previously, if multiple requests arrived before the first initialization completed, each request could trigger its own pipeline initialization. This caused slowdowns and extra resource pressure.
Fusion now synchronizes pipeline initialization so only the first request does the work while concurrent requests wait, reducing request spikes and improving stability under load.
#### More predictable subquery latency
Solr subqueries previously lacked a built-in way to steer requests toward the replica types best suited for low-latency query traffic. Without explicit routing, subqueries could land on replica types, such as TLOG, that can introduce latency spikes and complicate troubleshooting.
Fusion now adds a `preferredReplicaType` option to the Solr Subquery stage, making replica steering easier to configure and more consistently applied—improving tail latency and keeping query routing aligned with operational expectations.
### Collections API now honors replica parameters
Previously, `nrtReplicas`, `tlogReplicas`, and `pullReplicas` could be ignored in Collections API requests, resulting in collections created with defaults instead of the intended architecture. Fusion now passes these parameters through correctly so automated collection creation matches the requested shard and replica strategy.
### Admin UI, APIs, and observability improvements
Fusion 5.9.16 includes several updates that improve UI usability and provide better diagnostics and monitoring.
#### Blob viewer loads faster and avoids unnecessary downloads
The Admin UI Blob viewer previously downloaded full blob content by default, which could cause large downloads and errors, especially for JSON blobs. Fusion now fetches blob metadata by default and only downloads full content when editing is requested, improving responsiveness and reliability.
#### Admin UI search enhanced for reliability and clarity
The Admin UI search has been improved to focus exclusively on Fusion application resources and navigation. This enhancement eliminates unreliable background indexing jobs and provides clearer search results, making it easier to find and manage your collections, pipelines, and other application components.

After

Before
Documentation search removed from Fusion UI
#### Reduced gateway audit log noise
OPTIONS requests are common in CORS flows and often not meaningful for audit purposes.
```text expandable theme={"dark"}
INFO 2025-10-20T18:43:56.544684097Z 2025-10-20T18:43:56.543Z - INFO [reactor-http-epoll-1:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.1 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_navigation 200 0 -
INFO 2025-10-20T18:43:56.546076826Z 2025-10-20T18:43:56.544Z - INFO [reactor-http-epoll-2:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.2 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_megamenu 200 0 -
INFO 2025-10-20T18:43:56.546141917Z 2025-10-20T18:43:56.545Z - INFO [reactor-http-epoll-2:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.3 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_typeahead 200 0 -
INFO 2025-10-20T18:43:56.546448948Z 2025-10-20T18:43:56.544Z - INFO [reactor-http-epoll-3:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.4 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_navigation 200 0 -
INFO 2025-10-20T18:43:56.553131217Z 2025-10-20T18:43:56.552Z - INFO [reactor-http-epoll-4:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.5 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_megamenu 200 0 -
INFO 2025-10-20T18:43:56.554958418Z 2025-10-20T18:43:56.554Z - INFO [reactor-http-epoll-2:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.6 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_megamenu 200 0 -
INFO 2025-10-20T18:43:56.555879448Z 2025-10-20T18:43:56.555Z - INFO [reactor-http-epoll-4:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.7 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_search 200 0 -
INFO 2025-10-20T18:43:56.555968984Z 2025-10-20T18:43:56.555Z - INFO [reactor-http-epoll-4:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.8 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_typeahead 200 0 -
INFO 2025-10-20T18:43:56.556998106Z 2025-10-20T18:43:56.556Z - INFO [reactor-http-epoll-3:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.9 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_megamenu 200 0 -
INFO 2025-10-20T18:43:56.564406315Z 2025-10-20T18:43:56.563Z - INFO [reactor-http-epoll-3:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.10 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_typeahead 200 0 -
INFO 2025-10-20T18:43:56.565558537Z 2025-10-20T18:43:56.565Z - INFO [reactor-http-epoll-1:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.11 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_typeahead 200 0 -
INFO 2025-10-20T18:43:56.565757271Z 2025-10-20T18:43:56.565Z - INFO [reactor-http-epoll-2:c.l.c.g.c.AuditListenerConfiguration@86] - ACCESS anonymous 192.0.2.12 OPTIONS /api/apps/www_EXAMPLE_com/query/www_EXAMPLE_com_megamenu 200 0 -
```
Fusion now excludes OPTIONS requests from gateway audit logging, resulting in cleaner logs and easier investigations.
### Solr backup runner volume mount path change
In Fusion 5.9.16, the `solr-backup-runner` backup volume mount path changed from `/mnt/solr-backups` to `/var/solr/data/solr-backups`. This path aligns with Solr's security manager, which restricts file system access to authorized directories within `/var/solr/data`. The previous path was not within Solr's security policy and caused permission errors that prevented backups from completing successfully.
The `solr-backup-runner` component is disabled by default. This change only affects deployments where it has been explicitly enabled.
> **Solr backup runner upgrade instructions**
>
> If you have `solr-backup-runner` enabled and are upgrading from a previous version, update the following to avoid backup failures after upgrading:
>
> 1. Update your Persistent Volume (PV) and Persistent Volume Claim (PVC) to reference the new backup path: `/var/solr/data/solr-backups`.
> 2. Update any Helm values or backup-related configuration that reference the old path `/mnt/solr-backups`.
> 3. Verify that backups complete successfully after upgrading.
### Operational stability and build reliability
Fusion 5.9.16 includes several improvements that strengthen platform resilience and improve reliability for deployments and integrations.
#### Improved recovery after temporary ZooKeeper outages
When ZooKeeper became unavailable briefly and then recovered, it could trigger downstream service issues, such as blob service behavior or job visibility problems, and often required manual restarts. Fusion now recovers more cleanly after temporary ZooKeeper unavailability, improving resilience during transient infrastructure events and reducing manual intervention.
#### Supported Docker images for monitoring exporters
The Bitnami images used for `jmx-exporter` and `kafka-exporter` were deprecated and relied on older base images. Fusion now provides replacement Docker images for both exporters, improving long-term supportability and reducing risk from upstream deprecations.
#### ETL indexer can automatically trigger Spark jobs after indexing
Many indexing workflows require post-index processing such as enrichment, aggregation, or downstream job execution. Previously, running follow-on Spark jobs often required custom coordination. Fusion 5.9.16 streamlines automation by allowing the ETL indexer to automatically kick off a Spark job after an indexing run.
#### API gateway no longer depends on Kubernetes API availability
During GCP control plane upgrades or Kubernetes API maintenance events, `api-gateway` and `query-pipeline` pods could become unavailable due to readiness and liveness probe failures. These failures prevented pods from recovering during the maintenance window, causing service disruptions.
Fusion now refines the availability checks, reducing the risk of service outages during routine cluster maintenance.
## API Updates
Indexing API:
* Added subscription indexing endpoints for asynchronous document indexing via Kafka: `GET /subscription_indexing/status` and `POST /subscription_indexing/{id}/collections/{collection}/index`.
* Added optional `throwOnError` parameter to `/index/{id}` and `/index/{id}/debug` endpoints. When enabled, indexing operations fail immediately if an error is encountered rather than continuing with partial success.
See [Subscriptions API](/api-reference/subscriptions-api/get-subscription-indexing-status) for complete details.
Query API:
* Removed deprecated endpoint: `/query-stages/lwai-chunking-strategies`.
## Bug fixes
### TLS support added for the `config-sync` service
Fusion deployments can use TLS with the `config-sync` service. Previously, this service could not operate in TLS-enabled Fusion clusters due to hardcoded HTTP URLs for inter-service communication and missing TLS configuration for Solr and ZooKeeper connections.
The `config-sync` service adds HTTPS protocol switching by using `application-tls.yml`, configures ZooKeeper TLS on port `2281` with JVM properties, and configures Solr TLS using Java SSLContext through the truststore.
All sync operations work correctly, including publish, subscribe, and pub/sub.
For more information, see [ConfigSync](/docs/5/fusion/operations/config-sync/overview).
### Parsing and indexing improvements
These fixes improve ingestion reliability, reduce indexing interruptions, and make scaling behavior more predictable in production.
* **Async parsing works correctly even when other parsers are deactivated.**\
Async parsing could fail to run when additional parsers were present in the configuration, even if those parsers were explicitly deactivated. Fusion now ignores deactivated parsers during selection, ensuring async parsing executes reliably regardless of configuration layout.
- **Increased reliability of body extraction for large documents in async parsing.**\
For large, text-heavy files, the async Tika parser could fail to extract body content due to string length constraints. In some cases this happened even when truncation limits were configured, resulting in missing body fields. Fusion now improves async parsing behavior for large documents so body extraction is more reliable and configured limits are respected more consistently.
* **Fixed file descriptor leak in async parsing.**\
A resource leak during filesystem operations could accumulate over time and trigger "Too many open files" errors, interrupting indexing and requiring repeated pod restarts to recover. Fusion now properly closes resources during async parsing file operations, improving long-running stability and reducing ingestion disruptions.
- **Batch partial updates continue even when some document IDs are missing.**\
In incremental indexing workflows, partial update batches could stop processing early if a submitted document ID didn’t exist, preventing valid updates later in the same batch from being applied. Fusion now rejects missing IDs as intended while continuing to process the rest of the batch, improving throughput and reducing the need for manual retries.
* **Partial updates work more reliably with common vector configurations.**\
Using LWAI with partial updates sometimes caused failures when applying vector fields across common formats and configurations. Fusion now improves partial-update indexing workflows to better support these vector setups, reducing failures and making vector enrichment/indexing more dependable.
- **`fusion-query` and `fusion-indexing` have faster startup under HPA.**\
`fusion-query` and `fusion-indexing` could experience a 15-second startup delay due to default polling behavior, slowing scale-up responsiveness under Horizontal Pod Autoscaling. Fusion now reduces unnecessary startup delay by improving service availability polling behavior, enabling faster scaling and better responsiveness during burst traffic.
### Connectors
These fixes improve connector reliability during migrations, increase crawl correctness, and make connector APIs more stable and secure.
* **Web V1 connector now properly indexes documents when using JavaScript evaluation.**\
In Fusion 5.9.14 and 5.9.15, the Web V1 connector referenced two versions of the Selenium library, which caused runtime incompatibilities. Fusion now resolves this Selenium class-path conflict, and V1 JavaScript evaluation works as expected, reducing crawl disruptions.
- **Web V2 connector now dedupes correctly using canonical URLs.**\
The Web V2 connector did not reliably deduplicate pages by canonical URL due to incorrect canonical redirect limit logic, preventing the canonical-handling code path from running as intended. Fusion now corrects canonical URL handling so canonical-based deduplication works properly, reducing duplicate content in the index and improving crawl efficiency.
* **Connector schema responses are now consistently ordered.**\
Connector schema output could appear in inconsistent property order due to loss of insertion order during V2 transformations. Fusion now preserves stable property ordering in connector schema responses, resulting in more predictable API output, cleaner diffs, and easier downstream automation and validation.
### SDKs and services
These fixes improve upgrade safety for custom extensions, reduce service startup disruption, and restore expected runtime behavior for encrypted configurations.
* **Index Stage SDK plugins load more reliably in newer versions.**\
Some Index Stage SDK plugins could fail to load and would not appear in the Fusion UI, blocking plugin installation and upgrades. In particular, certain common Java constructs could cause the plugin framework to fail to generate a valid stages definition, resulting in errors like "no stages definition." Fusion now improves Index Stage SDK plugin loading so stages using these constructs are discovered correctly and no longer block plugin installation.
- **Query Stage SDK plugins must use `CloudLegacySolrClient` for Solr connections.**\
The SolrJ upgrade from 8.11.x to 9.4.1 in Fusion 5.9.16 changes `CloudSolrClient` to use HTTP2 by default. Because HTTP2 connections are not supported by pipeline services in Fusion 5, custom query stages must use `CloudLegacySolrClient` instead of `CloudSolrClient` or `CloudHttp2SolrClient` for Solr connections.
* **`ml-model-service` starts more safely when legacy model types are present.**\
Deployments could fail or crash-loop when unsupported legacy model types, such as OpenNLP or MLeap, were encountered, or when TLS/ingress configurations did not match expected trust material. These failures could disrupt upgrades and cause avoidable downtime. Fusion now handles unsupported legacy model types more safely (instead of failing the entire service), reducing startup disruption and improving operational stability when migrating legacy models to supported approaches.
- **PBL jobs can decrypt configuration secrets again.**\
After upgrades, PBL jobs could fail because encrypted configuration values were no longer being decrypted at runtime. Logs indicated that no `StringDecryptor` implementation was available, preventing secrets from being resolved. Fusion now wires `StringDecryptor` into the job runtime through the Spring application context so encrypted configuration values decrypt correctly, restoring expected job behavior and preventing post-upgrade failures tied to secrets handling.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Microsoft Azure Kubernetes Service (AKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
* **Amazon Elastic Kubernetes Service (EKS):** 1.30, 1.31, 1.32, 1.33, 1.34, 1.35
Support is also offered for Rancher Kubernetes Engine (RKE and RKE2) and OpenShift 4 versions that are based on Kubernetes 1.30, 1.31, 1.32, 1.33, 1.34, 1.35; note that RKE2 may require some Helm chart modification. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| Solr | fusion-solr 5.9.16 *(based on Solr 9.6.1)* |
| ZooKeeper | 3.9.1 |
| Spark | 3.4.1 |
| Ingress Controllers | Nginx, Ambassador (Envoy), GKE Ingress Controller |
| Ray | ray\[serve] 2.46.0 |
| Helm | 3.4.1 |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
# Fusion 5.9.2
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.2-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.2-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.2-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/39hg5n
Released on December 13, 2023, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes an update to Kubernetes 1.27 and improvements to query service replica scaling and the Web V1 (classic) connector library.
To learn more, skip to the [release notes](#improvements).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.27
* **Microsoft Azure Kubernetes Service (AKS):** 1.27
* **Amazon Elastic Kubernetes Service (EKS):** 1.27
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.27. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.1 *(based on Solr 9.1.1)* |
| **ZooKeeper** | 3.7.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Improvements
* Fusion now supports Kubernetes 1.27. This applies to GKE, AKS, and EKS. It also applies to Rancher (RKE) and OpenShift 4 versions that are compatible with Kubernetes 1.27. Refer to Kubernetes documentation for version [1.27](https://kubernetes.io/blog/2023/03/17/upcoming-changes-in-kubernetes-v1-27/).
* Query service replica scaling has been improved.
## Fusion Connectors
* Updated the Web V1 (classic) connector library to resolve issues for certain JavaScript-enabled web pages. While Fusion was not vulnerable to the Common Vulnerabilities and Exposures (CVE) 2023-4863, the connector updates allowed Lucidworks to also acknowledge and resolve that publicly-reported CVE.
## Bug Fixes
* The connectors-backend service no longer fails to start when deploying to OpenShift 4.12.
* Fixed an issue where the Transport Layer Security (TLS) for Fusion Microservices could not be enabled and used.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.9.3
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.3-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.3-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.3-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/lqgbgi
Released on February 26, 2024, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes an update to Kubernetes 1.28.
To learn more, skip to the [release notes](#improvements).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28
* **Microsoft Azure Kubernetes Service (AKS):** 1.28
* **Amazon Elastic Kubernetes Service (EKS):** 1.28
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.3 *(based on Solr 9.1.1)* |
| **ZooKeeper** | 3.7.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Improvements
* Fusion now supports Kubernetes 1.28. This applies to GKE, AKS, and EKS. It also applies to Rancher (RKE) and OpenShift 4 versions that are compatible with Kubernetes 1.28. Refer to Kubernetes documentation at [Kubernetes v1.28](https://kubernetes.io/blog/2023/08/15/kubernetes-v1-28-release/) for more information.
## Bug fixes
* Fixed an issue affecting remote connector datasources where they could enter a state of persistent inability to index following a `No Plugin Activity` timeout error.
* Fixed an issue with the async-parser where large files exceeding the configured memory buffer were repeatedly retried for processing, even though they would ultimately fail. This behavior could lead to unnecessary resource consumption and logging noise. Files that exceed the size configuration are no longer retried.
* Fixed an issue with the async-parser where documents containing empty values were erroneously emitted for indexing, even though the indexing process couldn’t handle them. This behavior led to indexing failures and unnecessary resource consumption.
* Fixed an issue with the Rules UI where very large rule sets could trigger URI errors, preventing the UI from loading or functioning correctly. This required manual deletion of rules to restore functionality.
* Fixed an issue where previously denied and published rules reappeared as new suggestions after running detection jobs.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.9.4
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.4-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.4-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.4-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/kgbb0r
Released on June 25, 2024, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes improvements to Jira and Confluence connectors for GDPR mode support, and access control lists (ACLs) to the Graph Security Trimming query pipeline.
To learn more, skip to the [release notes](#improvements).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.29
* **Microsoft Azure Kubernetes Service (AKS):** 1.29
* **Amazon Elastic Kubernetes Service (EKS):** 1.29
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.29. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.4 *(based on Solr 9.1.1)* |
| **ZooKeeper** | 3.7.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
> [!TIP]
>
> **Looking to upgrade?**
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Improvements
* Fusion now supports Kubernetes 1.29. This applies to GKE, AKS, and EKS. It also applies to Rancher (RKE) and OpenShift 4 versions that are compatible with Kubernetes 1.29. Refer to Kubernetes documentation at [Kubernetes v1.29](https://kubernetes.io/blog/2023/12/13/kubernetes-v1-29-release/) for more information.
* The Jira and Confluence classic connectors now support GDPR mode.
* The Graph Security Trimming query pipeline stage now supports two new types of access control lists (ACLs) in addition to the main ACL represented by the `_lw_acl_ss` field:
* A "deny" ACL list (`_lw_deny_acl_ss`).
* A "share" ACL list (`_lw_share_acl_ss`) for connectors such as SMB that support it.
* The Graph Security Trimming query pipeline stage has built the **Join Method**, **ACL Solr Collection**, and **Join Field** properties directly into the stage. These fields have been removed from the stage, and you no longer have to configure them.
## Bug fixes
* Fixed an issue that caused counters from discarded `query-service` instances to be propagated to subsequent days, leading to inaccurate numbers on the Consumption Dashboard.
* Fixed an issue that caused an NRT replica to be created even when `nrtReplicas` is set to `0`.
* Fixed an issue that caused Kafka poll timeouts and commit errors, primarily impacting the SharePoint Optimized V2 connector.
* This release fixes issues with several V1 connectors:
* Fixed an issue that prevented the Jira Cloud V1 connector from handling `429` errors correctly.
* Fixed an issue that prevented the Jira V1 connector from indexing attachments.
* Fixed an issue that prevented the Salesforce V1 connector from indexing data and applying security trimming.
* Fixed an issue that caused datasource jobs to time out prematurely when data takes some time to process.
* Fixed an issue that sometimes led to connector crawls becoming stuck in an infinite loop.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
* The Fusion Search [Domain-Specific Language (DSL)](/docs/5/fusion/getting-data-out/query-basics/domain-specific-language) is deprecated in this release. Be aware that it can cause significant performance degradation in queries.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.9.5
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.5-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.5-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.5-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/5wtdd9
Released on November 4, 2024, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes the new Neural Hybrid Search capability, as well as upgrades to Solr, Kubernetes, Zookeeper, and some bug fixes.
To learn more, skip to the [release notes](#new-features).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.5 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
> [!WARNING]
>
> Looking to upgrade?
>
> Upgrading to Fusion 5.9.5 has special considerations, due to changes introduced with Solr 9.6.1 and Lucene 9.10.0. Refer to the **Fusion 5 Upgrade from 5.9.x** for specific details and potential mitigation strategies.
>
> Fusion 5.9.5 introduced changes that affect Spark jobs. If you are upgrading from any Fusion version earlier than 5.9.5 to a version later than 5.9.5, Lucidworks recommends first upgrading to Fusion 5.9.5 before proceeding to the target version.
> **Fusion 5 Upgrade from 5.9.x**
>
> This article includes instructions for upgrading Fusion from one version to another. In some cases, the instructions do not vary. Other upgrades require special instructions. Start by checking upgrade details for your target version before continuing to the [General upgrade process](#general-upgrade-process).
>
> Whenever you upgrade Fusion, you must also update your [remote connectors](/docs/fusion-connectors/developers/remote-v2-connectors), if you are running any.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> > [!NOTE]
> >
> > Fusion values change between releases. Check the [example values](https://github.com/lucidworks/fusion-cloud-native/blob/master/customize_fusion_values.yaml.example) and update values as needed.
>
> ## Upgrades from 5.9.x
>
> ### to 5.9.y
>
> Upgrading from 5.9.x to 5.9.y involves using the [General upgrade process](#general-upgrade-process).
>
> > [!WARNING]
> >
> > If you are using horizontal pod autoscaling, follow the [steps in the Fusion 5.8.1 release notes](/docs/5/fusion/release-notes/more/5.8.1-release-notes). If you have already done this as part of a previous upgrade, you can skip this process.
>
> ### to 5.9.12
>
> When upgrading to Fusion 5.9.12, add the following to your `values.yaml` file to avoid a known issue that prevents the `kuberay-operator` pod from launching successfully:
>
> ```yaml theme={"dark"}
> kuberay-operator:
> crd:
> create: true
> ```
>
> ### to 5.9.5
>
> Upgrading to Fusion 5.9.5 has special considerations, due to changes introduced with Solr 9.6.1 and Lucene 9.10.0. All upgrades are susceptible to issues from these changes. Follow the upgrade procedures closely to avoid issues with the upgrade.
>
> See the following sections for an overview of the issues, or [skip to the upgrade process](#upgrade-process).
>
> #### Solr 9.6.1 changes
>
> Prior to Fusion 5.9.5, Fusion utilized Solr 9.1.1 or earlier. Due to changes in Solr 9.3, some Solr configuration and collection configurations are no longer compatible. As Fusion 5.9.5 leverages Solr 9.6.1, it’s imperative to address these compatibility issues during the upgrade process.
>
> To address Solr and collection configuration issues, a Docker utility called `fm-upgrade-apps-to-solr-9`, also known as the Fusion migration script, is included in the Fusion 5.9.5 release. This utility performs the following tasks:
>
> * Removes the unused configuration, ``, from `solrconfig.xml`. Solr no longer supports this configuration.
> * Removes the query response writer of class `solr.XSLTResponseWriter`.
> * Comments out processors of type `solr.StatelessScriptUpdateProcessorFactory`.
> * Removes `` element from request handler.
> * Changes cache class attribute of elements `"filterCache"`, `"cache"`, `"documentCache"`, `"queryResultCache"` to `solr.search.CaffeineCache`.
> * Removes `keepShortTerm` attribute from filter of class `solr.NGramFilterFactory`.
> * Updates collection configurations, as needed.
>
> #### Lucene 9.10.0 changes
>
> A Lucene update to 9.10.0 in Fusion 5.9.5 may cause issues with certain collections in Solr. The change to the FST posting format codec (from `Lucene90PostingsWriterDoc` to `Lucene99PostingsWriterDoc`) in Lucene is incompatible with Solr in Fusion. As a result, Solr will not open a new searcher for collections using the `FST50` postings format.
>
> To identify collections potentially affected by the Lucene codec change, examine the field definitions within your Solr schema. Look for fields that specify the `postingsFormat` attribute with a value of `FST50`. Collections containing such fields may experience compatibility issues. For example:
>
> ```xml theme={"dark"}
>
> ```
>
> The following log excerpt demonstrates a typical error message encountered when an upgrade is impacted by the codec change:
>
> ```java theme={"dark"}
> Caused by: org.apache.lucene.index.CorruptIndexException: codec mismatch: actual codec=Lucene90PostingsWriterDoc vs expected codec=Lucene99PostingsWriterDoc (resource=ByteBufferIndexInput(path="/var/solr/data/acme_query_rewrite_staging_shard1_replica_t9/data/index/_cn_FST50_0.doc"))
> at org.apache.lucene.codecs.CodecUtil.checkHeaderNoMagic(CodecUtil.java:205) ~[?:?]
> at org.apache.lucene.codecs.CodecUtil.checkHeader(CodecUtil.java:194) ~[?:?]
> at org.apache.lucene.codecs.CodecUtil.checkIndexHeader(CodecUtil.java:254) ~[?:?]
> at org.apache.lucene.codecs.lucene99.Lucene99PostingsReader.(Lucene99PostingsReader.java:80) ~[?:?]
> at org.apache.lucene.codecs.memory.FSTPostingsFormat.fieldsProducer(FSTPostingsFormat.java:60) ~[?:?]
> at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsReader.(PerFieldPostingsFormat.java:330) ~[?:?]
> at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat.fieldsProducer(PerFieldPostingsFormat.java:392) ~[?:?]
> at org.apache.lucene.index.SegmentCoreReaders.(SegmentCoreReaders.java:119) ~[?:?]
> at org.apache.lucene.index.SegmentReader.(SegmentReader.java:96) ~[?:?]
> at org.apache.lucene.index.ReadersAndUpdates.getReader(ReadersAndUpdates.java:178) ~[?:?]
> at org.apache.lucene.index.ReadersAndUpdates.getReadOnlyClone(ReadersAndUpdates.java:220) ~[?:?]
> at org.apache.lucene.index.IndexWriter.lambda$getReader$0(IndexWriter.java:542) ~[?:?]
> at org.apache.lucene.index.StandardDirectoryReader.open(StandardDirectoryReader.java:138) ~[?:?]
> at org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:604) ~[?:?]
> at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:112) ~[?:?]
> at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:91) ~[?:?]
> at org.apache.solr.core.StandardIndexReaderFactory.newReader(StandardIndexReaderFactory.java:38) ~[?:?]
> at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:2399) ~[?:?]
> ```
>
> To account for the `postingsFormat="FST50"` codec issue, a Docker utility called `run-the-fm-upgrade-query-rewrite-docker-utility` is provided alongside the Fusion 5.9.5 release. You can pull this image from Docker using `docker pull lucidworks/run-the-fm-upgrade-query-rewrite-docker-utility:2.x`.
>
> This utility performs two actions: `prepare` and `restore`. Use the `prepare` action before the Fusion 5.9.5 upgrade begins. At a high level, the `prepare` action performs the following actions:
>
> 1. Removes `postingsFormat="FST50"` from all collections in the environment.
> 2. Re-indexes documents to new, temporary collections.
> 3. Compares the original collections to the new, temporary collections to ensure data integrity.
>
> Use the `restore` action after the Fusion 5.9.5 upgrade finishes, which must include the Solr 9.6.1 upgrade. The `restore` action performs the following actions:
>
> 1. Restores `postingsFormat="FST50"` to all collections in the environment that were changed with the `prepare` action.
> 2. Re-indexes documents to new, permanent collections. These collections match the original collections that were in place prior to the `prepare` action.
> 3. Compares the restored collections to the temporary collections to ensure data integrity.
>
> #### Upgrade process
>
> This section provides a high-level overview of the steps involved in upgrading to Fusion 5.9.5. Follow each step in the order given:
>
> 1. [Create a full backup of all Fusion collections](#back-up-your-solr-collections). These backups are intended as an emergency failsafe only.
> 2. [Run the `fm-upgrade-apps-to-solr-9` Docker utility](#run-the-fm-upgrade-apps-to-solr-9-docker-utility). This updates the Solr configuration and collections for compatibility with Solr 9.6.1.
> 3. [Run the `run-the-fm-upgrade-query-rewrite-docker-utility` Docker utility](#run-the-fm-upgrade-query-rewrite-docker-utility). Use the `prepare` action to address potential collection compatibility issues with Lucene 9.10.0 codecs.
> 4. [Upgrade your Fusion environment to version 5.9.5](#general-upgrade-process). Use the upgrade scripts or your own upgrade process.
> 5. [Re-run the `run-the-fm-upgrade-query-rewrite-docker-utility` Docker utility](#re-run-the-fm-upgrade-query-rewrite-docker-utility). Use the `restore` action to restore collections to their original state.
> 6. [Validate the upgrade was successful](#validate-the-upgrade). In addition to your usual validations, there are some extra things to check.
>
> To mitigate potential upgrade issues, adhere to the following procedures.
>
> #### Back up your Solr collections
>
> Back up all Solr collections in each environment before continuing with the upgrade. For this upgrade, backups are intended as an emergency failsafe.
>
> > [!WARNING]
> >
> > Performing a rollback after encountering the issue described is a difficult, time-consuming process and is not recommended.
>
> #### Run the `fm-upgrade-apps-to-solr-9` Docker utility
>
> Use the `fm-upgrade-apps-to-solr-9` Docker utility to mitigate issues related to the change from Solr 9.1.1 and earlier to Solr 9.6.1. To begin, run the `fm-upgrade-apps-to-solr-9` Docker utility using the `DRY_RUN` environmental variable:
>
> ```bash theme={"dark"}
> docker run --rm -v $(pwd):/upgrade-work -e ZK_HOST=zk:2181 -e DRY_RUN=1 lucidworks/fm-upgrade-apps-to-solr-9:1.2.0
> ```
>
> The `DRY_RUN` variable prints the changes that would occur to the console without performing those actions. Review the changes thoroughly.
>
> If the changes look correct, run the `fm-upgrade-apps-to-solr-9` Docker utility again without using the `DRY_RUN` environmental variable. The updated config files are saved to the `/upgrade-work/updated-configs` directory. The utility also creates backups for all configs in the `/upgrade-work/backup-configs`.
>
> The `fm-upgrade-apps-to-solr-9` Docker utility has another environmental variable, `REVERT`, that allows you to revert any changes you made. To revert your changes, run:
>
> ```bash theme={"dark"}
> docker run --rm -v $(pwd):/upgrade-work -e ZK_HOST=zk:2181 -e REVERT=1 lucidworks/fm-upgrade-apps-to-solr-9:1.2.0
> ```
>
> #### Run the `fm-upgrade-query-rewrite` Docker utility
>
> Next, mitigate codec issues related to the Lucene 9.10.0 update. Run the `run-the-fm-upgrade-query-rewrite-docker-utility` Docker utility `prepare` action:
>
> ```bash theme={"dark"}
> kubectl run \
> --image="lucidworks/fm-upgrade-query-rewrite:2.x" \
> --restart=Never \
> --env="HELM_RELEASE=FUSION_NAMESPACE" \
> --env="TARGET_SOLR_VERSION=9.6.1" \
> --env="ACTION=prepare" prepare-595-upgrade
> --namespace=FUSION_NAMESPACE
> ```
>
> Change `FUSION_NAMESPACE` to the name of your application namespace for the Fusion installation. You can find this value using `helm list` against your Fusion namespace. Locate the release using the `fusion` chart, and find the value in the `name` column. Typically, the release name is the same as your namespace name.
>
> Including `--namespace=FUSION_NAMESPACE` lets the update pod runs in the correct application namespace.
>
> The `prepare` action removes `postingsFormat="FST50"` from all collections in the environment before re-indexing data to temporary collections. When the `prepare-595-upgrade` pod shows the status `Completed`, the process is finished.
>
> #### Upgrade your Fusion environment
>
> Upgrade Fusion to version 5.9.5. Before beginning, ensure the Fusion admin is running and all collections are healthy. Then, [complete the General upgrade process](#general-upgrade-process) before returning to the [next step in the process](#re-run-the-fm-upgrade-query-rewrite-docker-utility).
>
> Alternatively, your organization may use a custom upgrade process. In either case, ensure you have successfully upgraded to Solr 9.6.1 as part of the Fusion upgrade.
>
> > [!CAUTION]
> >
> > **Do not** make changes to the `signals` collection with the Rules Editor during the upgrade process. For production clusters, upgrade during a maintenance window.
>
> #### Re-run the `fm-upgrade-query-rewrite` Docker utility
>
> Use the `run-the-fm-upgrade-query-rewrite-docker-utility` utility’s `restore` action to restore the data from the temporary collections created by the `prepare` action. Before you begin, verify all collections appended with `_temp_fix` are online and healthy.
>
> ```bash theme={"dark"}
> kubectl run \
> --image="lucidworks/fm-upgrade-query-rewrite:2.x" \
> --restart=Never \
> --env="HELM_RELEASE=FUSION_NAMESPACE" \
> --env="TARGET_SOLR_VERSION=9.6.1" \
> --env="ACTION=restore" restore-595-upgrade
> --namespace=FUSION_NAMESPACE
> ```
>
> Change `FUSION_NAMESPACE` to the name of your application namespace for the Fusion installation. You can find this value using `helm list` against your Fusion namespace. Locate the release using the `fusion` chart, and find the value in the `name` column. Typically, the release name is the same as your namespace name.
>
> Including `--namespace=FUSION_NAMESPACE` lets the update pod runs in the correct application namespace.
>
> When the `restore-595-upgrade` pod shows the status `Completed`, the process is finished.
>
> For a complete summary of what this action does, refer to [Upgrade Utility](#run-the-fm-upgrade-query-rewrite-docker-utility).
>
> #### Validate the upgrade
>
> In addition to your typical validation process, ensure Solr collections are healthy:
>
> 1. Log into Fusion as the admin.
> 2. Access the Solr Admin UI at `https://FUSION_HOST:FUSION_PORT/api/solrAdmin/default/#/`.
> 3. Watch for error messages. For example, the following message reports errors for the query rewrite staging collections Acme1, Acme2, Acme3, and Acme4:
>
> 
> 4. Navigate to the **Cloud graph** screen at `https://FUSION_HOST:FUSION_PORT/api/solrAdmin/default/#/~cloud?view=graph`.
> 5. Review each collection for errors.
>
> After you have completed validations, delete the temporary `prepare` and `restore` pods that were created by the upgrade utility:
>
> ```bash theme={"dark"}
> kubectl delete po prepare-595-upgrade
> kubectl delete po restore-595-upgrade
> ```
>
> #### Resolving post-upgrade issues
>
> If you followed the previous instructions, and you are still experiencing issues with the codec, you need to re-feed the affected data. Contact [Lucidworks Support](https://support.lucidworks.com/hc/en-us) for further support.
>
> ### to 5.10.y
>
> Upgrading from 5.9.x to 5.10.y involves using the [General upgrade process](#general-upgrade-process).
>
> ## General upgrade process
>
> Fusion natively supports deployments on supported Kubernetes platforms, including AKS, EKS, and GKE.
>
> Fusion includes an upgrade script for AKS, EKS, and GKE. This script is not generated for other Kubernetes deployments.
>
> Upgrades differ from platform to platform. See below for more information about upgrading on your platform of choice.
>
> Whenever you upgrade Fusion, you must also update your [remote connectors](/docs/fusion-connectors/developers/remote-v2-connectors), if you are running any.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> ### Natively supported deployment upgrades
>
> | Deployment type | Platform |
> | - | - |
> | **Azure Kubernetes Service (AKS)** | `aks` |
> | **Amazon Elastic Kubernetes Service (EKS)** | `eks` |
> | **Google Kubernetes Engine (GKE)** | `gke` |
>
> Fusion includes upgrade scripts for natively supported deployment types. To upgrade:
>
> 1. Open the `___upgrade_fusion.sh` upgrade script file for editing.
> 2. Update the `CHART_VERSION` to your target Fusion version, and save your changes.
> 3. Run the `___upgrade_fusion.sh` script. The `` value is the same as your namespace, unless you overrode the default value using the `-r` option.
>
> After running the upgrade, use `kubectl get pods` to see the changes applied to your cluster. It may take several minutes to perform the upgrade, as new Docker images are pulled from DockerHub. To see the versions of running pods, do:
>
> ```
> kubectl get po -o jsonpath='{..image}' | tr -s '[[:space:]]' '\n' | sort | uniq
> ```
## New Features
### Neural Hybrid Search
Fusion 5.9.5 introduces [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview), a capability that combines lexical and semantic vector search. This feature includes:
* A new index pipeline to vectorize fields with [Lucidworks AI](/docs/lw-platform/lw-ai/overview). See **Configure the LWAI Vectorize pipeline**.
* A new query pipeline to set up Neural Hybrid Search with Lucidworks AI. See **Configure the LWAI Neural Hybrid Search pipeline**.
* Query and index stages for vectorizing text using Lucidworks AI. See [LWAI Vectorize Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) and [LWAI Vectorize Field stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lwai-vectorize-field).
* Query and index stages for vectorizing text with Seldon. See [Seldon Vectorize Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) and [Seldon Vectorize Field stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/vectorize-field-via-seldon-index-stage).
* A new query stage for hybrid search that works with Lucidworks AI or Seldon. See [Hybrid Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/hybrid-search-query).
* A new service, `lwai-gateway`, provides a secure, authenticated connection between Fusion and your Lucidworks AI-hosted models.\
See [Lucidworks AI Gateway](/docs/lw-platform/lw-ai/lw-ai-gateway) for details.
* Solr config changes to support dense vector dynamic fields.
* A custom Solr plugin containing a new `vectorSimilarity` QParser that will not be available in Apache Solr until 9.7.
> **[Neural Hybrid Search](https://academy.lucidworks.com/neural-hybrid-search-2)**
>
> The course for **Neural Hybrid Search** focuses on how neural hybrid search combines lexical and semantic search to improve the relevance and accuracy of results.
#### Configure use case for embedding
In the LWAI Vectorize Field stage, you can specify the use case for your embedding model.
To learn how to configure your embedding use case, see the following demonstration:
#### Fine tune lexical and semantic settings
The Hybrid Query stage is highly customizable. You can lower the **Min Return Vector Similarity** threshold for vector results to include more semantic results. For example, a lower threshold would return "From Dusk Till Dawn" when querying `night` against a movie dataset. A higher threshold prioritizes high scoring results and in this case only returns movie names with `night` in the title.
To learn how to configure the Hybrid Query stage, see the following demonstration:
#### Vector dimension size
There is no limitation on vector dimension sizes. If you’re setting up vector search and Neural Hybrid Search with an embedding model with large dimensions, simply configure your managed-schema to support the appropriate dimension. See **Configure Neural Hybrid Search**.
> **Configure Neural Hybrid Search**
>
> Neural Hybrid Search combines lexical-semantic search with semantic vector search.
>
> To use semantic vector search in Fusion, you need to configure Neural Hybrid Search.
> Then you can choose the balance between lexical and semantic vector search that works best for your use case.
>
> Before you begin, see [Neural Hybrid Search](/docs/5/fusion/hybrid-search/overview) for conceptual information that can help you understand how to configure this feature.
>
> > [!TIP]
> >
> > This feature is currently only available to clients who have contracted with Lucidworks for features related to Neural Hybrid Search and Lucidworks AI.
>
> > [!NOTE]
> >
> > This feature is available starting in Fusion 5.9.5 and in all subsequent Fusion 5.9 releases.
>
> Lucidworks recommends setting up Neural Hybrid Search with Lucidworks AI, but you can instead use Ray or Seldon vector search. If using Lucidworks AI, you may use the default LWAI Neural Hybrid Search pipeline.
>
> ## Configure vector search
>
> This section explains how to configure vector search using Lucidworks AI, but you can also configure it using Ray or Seldon.
>
> Before you set up the Lucidworks AI index and query stages, make sure you have set up your Lucidworks AI Gateway integration.
>
> ### Configure the LWAI Vectorize Field index stage
>
> To vectorize the index pipeline fields:
>
> 1. Sign in to Fusion and click **Indexing > Index Pipelines**.
>
> 2. Click the pipeline you want to use.
>
> 3. Click **Add a new pipeline stage**.
>
> 4. In the AI section, click **LWAI Vectorize Field**.
>
> 5. In the **Label** field, enter a unique identifier for this stage.
>
> 6. In the **Condition** field, enter a script that results in true or false, which determines if the stage should process.
>
> 7. In the **Account Name** field, select the Lucidworks AI API account name defined in the Lucidworks AI Gateway service.
>
> If you do not see your account name, check that your Lucidworks AI Gateway integration is correctly configured.
>
> 8. In the **Model** field, select the Lucidworks AI model to use for encoding.
>
> If you do not see any models names and you are a non-admin Fusion user, check that you have these permissions: `PUT,POST,GET:/LWAI-ACCOUNT-NAME/**`
>
> Your Fusion account name must match the name of the account that you selected in the **Account Name** dropdown.
>
> For more information about models, see:
>
> * [Pre-trained embedding models](/docs/lw-platform/lw-ai/lw-ai-pre-trained-embedding-models)
> * [Custom embedding model training](/docs/lw-platform/lw-ai/lw-ai-custom-embedding-model-training/overview)
>
> 9. In the **Source** field, enter the name of the string field where the value should be submitted to the model for encoding. If the field is blank or does not exist, this stage is not processed. Template expressions are supported.
>
> 10. In the **Destination** field, enter the name of the field where the vector value from the model response is saved.
>
> If a value is entered in this field, the following information is added to the document:
>
> * `{Destination Field}` is the vector field.
>
> * `{Destination Field}_b` is the boolean value if the vector has been indexed.
>
> 11. In the **Use Case Configuration** section, click the **+** sign to enter the parameter name and value to send to Lucidworks AI. The `useCaseConfig` parameter that is common to embedding use cases is `dataType`, but each use case may have other parameters. The value for the query stage is `query`.
> 12. Optionally, you can use the **Model Configuration** section for any additional parameters you want to send to Lucidworks AI.
> Several `modelConfig` parameters are common to generative AI use cases.
> For more information, see [Prediction API](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-prediction-api/overview).
> 13. Select the **Fail on Error** checkbox to generate an exception if an error occurs while generating a prediction for a document.
> 14. Click **Save**.
> 15. Index data using the new pipeline. Verify the vector field is indexed by confirming the field is present in documents.
>
> For reference information, see [Lucidworks AI Vectorize Field](/docs/lw-platform/lw-ai/lw-ai-stages/vectorize-field-via-lucidworks-ai-index-stage).
>
> ### Configure the LWAI Vectorize Query stage
>
> To vectorize the query in the query pipeline:
>
> 1. Sign in to Fusion and click **Querying > Query Pipelines**.
>
> 2. Select the pipeline you want to use.
>
> 3. Click **Add a new pipeline stage**.
>
> 4. Click **LWAI Vectorize Query**.
>
> 5. In the **Label** field, enter a unique identifier for this stage.
>
> 6. In the **Condition** field, enter a script that results in true or false, which determines if the stage should process.
>
> 7. Select **Asynchronous Execution Config** if you want to run this stage asynchronously. If this field is enabled, complete the following fields:
> 1. Select **Enable Async Execution**. Fusion automatically assigns an **Async ID** value to this stage. Change this to a more memorable string that describes the asynchronous stages you are merging, such as `signals` or `access_control`.
> 2. Copy the **Async ID** value.
>
> > [!NOTE]
> >
> > For detailed information, see [Asynchronous query pipeline processing](/docs/5/fusion/getting-data-out/query-basics/query-pipelines/overview).
>
> 8. In the **Account Name** field, select the name of the Lucidworks AI account.
>
> 9. In the **Model** field, select the Lucidworks AI model to use for encoding.
>
> If you do not see any model names and you are a non-admin Fusion user, verify with a Fusion administrator that your user account has these permissions: `PUT,POST,GET:/LWAI-ACCOUNT-NAME/**`
>
> Your Fusion account name must match the name of the account that you selected in the **Account Name** dropdown.
>
> For more information about models, see:
>
> * [Pre-trained embedding models](/docs/lw-platform/lw-ai/lw-ai-pre-trained-embedding-models)
> * [Custom embedding model training](/docs/lw-platform/lw-ai/lw-ai-custom-embedding-model-training/overview)
>
> 10. In the **Query Input** field, enter the location from which the query is retrieved.
>
> 11. In the **Output context variable** field, enter the name of the variable where the vector value from the response is saved.
>
> 12. In the **Use Case Configuration** section, click the **+** sign to enter the parameter name and value to send to Lucidworks AI. The `useCaseConfig` parameter that is common to embedding use cases is `dataType`, but each use case may have other parameters. The value for the query stage is `query`.
>
> 13. Optionally, you can use the **Model Configuration** section for any additional parameters you want to send to Lucidworks AI.
> Several `modelConfig` parameters are common to generative AI use cases.
> For more information, see [Prediction API](/docs/lw-platform/lw-ai/lw-ai-apis/lw-ai-prediction-api/overview).
>
> 14. Select the **Fail on Error** checkbox to generate an exception if an error occurs during this stage.
>
> 15. Click **Save**.
>
> > [!NOTE]
> >
> > The **Top K** setting is 100 by default, but a value as high as 1000 provides better recall if you have fewer than one million indexed documents.
> > You can raise it even higher, but keep in mind that higher recall also causes higher latency.\
> > When raising this value, we recommend also setting a higher **Min Return Vector Similarity** value, in the 0.7-0.85 range.
>
> This query stage must be placed *before* the **[Solr Query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/solr-query-stage)**.
>
> > [!WARNING]
> >
> > **Using additional pipeline stages**
> >
> > For optimal vector search functionality, use the following stages in the order specified: either the LWAI Vectorize Query or Ray/Seldon Vectorize Field, Query Fields (if present), Neural Hybrid Query, and Solr Query. Other stages can be used, but must be placed in the correct processing order in relation to these stages.
>
> ## Modify Solr managed-schema (5.9.4 and earlier)
>
> This step is required if you’re migrating a collection from a version of Fusion that does not support Neural Hybrid Search. If creating a new collection in Fusion 5.9.5 and later, you can continue to [Configure Hybrid Query stage](#configure-neural-hybrid-queries).
>
> 1. Go to **System** > **Solr Config** and then click **managed-schema** to edit it.
> 2. Comment out `` and add `` below it. This will concatenate and index all `*_t fields`.
> 3. Add the following code block to the **managed-schema** file:
>
> ```xml theme={"dark"}
> hnswMaxConnections="45” name="knn_DIM_vector" similarityFunction="cosine"
> vectorDimension="DIM"/>
> required="false" stored="true" type="knn_DIM_vector"/>
> ```
>
> > [!NOTE]
> >
> > This example uses 512 vector dimension. If your model uses a different dimension, modify the code block to match your model. For example, `_1024v`. There is no limitation on supported vector dimensions.
>
> ## Configure neural hybrid queries
>
> In Fusion 5.9.10 and later, you use the Neural Hybrid Query stage to configure neural hybrid queries.
> In Fusion 5.9.9 and earlier, you use the Hybrid Query stage.
>
> ### Configure Neural Hybrid Query stage (5.9.10 and later)
>
> 1. In the same query pipeline where you configured vector search, click **Add a new pipeline stage**, then select **Neural Hybrid Query**.
>
> 2) In the **Label** field, enter a unique identifier for this stage or leave blank to use the default value.
>
> 3) In the **Condition** field, enter a script that results in true or false, which determines if the stage should process, or leave blank.
>
> 4) In the **Lexical Query Input** field, enter the location from which the lexical query is retrieved. For example, **\**. Template expressions are supported.
>
> 5) In the **Lexical Query Weight** field, enter the relative weight of the lexical query. For example, **0.3**. If this value is **0**, no re-ranking will be applied using the lexical query scores.
>
> 6) In the **Lexical Query Squash Factor** field, enter a value that will be used to squash the lexical query score.
>
> The squash factor controls how much difference there is between the top-scoring documents and the rest.
> It helps ensure that documents with slightly lower scores still have a chance to show up near the top.
> For this value, Lucidworks recommends entering the inverse of the lexical maximum score across all queries for the given collection.
>
> 7) In the **Vector Query Field**, enter the name of the Solr field for k-nearest neighbor (KNN) vector search.
>
> 8) In the **Vector Input** field, enter the location from which the vector is retrieved. Template expressions are supported. For example, a value of `` evaluates the context variable resulting from a previous stage, such as the [LWAI Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) stage.
>
> 9) In the **Vector Query Weight** field, enter the relative weight of the vector query. For example, **0.7**.
>
> 10) In the **Min Return Vector Similarity** field, enter the minimum vector similarity value to qualify as a match from the Vector portion of the hybrid query.
>
> 11) In the **Min Traversal Vector Similarity** field, enter the minimum vector similarity value to use when walking through the graph during the Vector portion of the hybrid query.
>
> 12) When enabled, the **Compute Vector Similarity for Lexical-Only Matches** setting computes vector similarity scores for documents in lexical search results but not in the initial vector search results. Select the checkbox to enable this setting.
>
> 13) If you want to use pre-filtering:
> 1. Uncheck **Block pre-filtering**.
>
> In the Javascript context (`ctx`), the `preFilterKey` object becomes available.
> 2. Add a [Javascript stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/javascript-query-stage) *after* the Neural Hybrid Query stage and use it to configure your pre-filter.
>
> The `preFilter` object adds both the top-level `fq` and `preFilter` to the parameters for the vector query.
> You do not need to manually add the top level `fq` in the javascript stage.
> See the example below:
>
> ```js theme={"dark"}
> var QueryRequestAndResponse = Java.type('com.lucidworks.apollo.pipeline.query.QueryRequestAndResponse');
> if(ctx.hasProperty("preFilterKey")) {
> var preFilter = ctx.getProperty("preFilterKey");
> var wrapper = QueryRequestAndResponse.create(request,response,0)
> preFilter.addFilter(wrapper, 'id:* OR foo_s:bar');
> }
> ```
>
> 14) Click **Save**.
>
> Make sure the **Hybrid Query** stage is ordered before the **Solr Query** stage.
>
> Be aware that the Neural Hybrid Query stage uses new query parsers, so if you are *not* setting up a new collection, the following must be added to `solrconfig.xml` within the `` tag:
>
> ```xml theme={"dark"}
>
>
>
> ```
>
> ### Configure Hybrid Query stage (5.9.9 and earlier)
>
> If you’re setting up Neural Hybrid Search in Fusion 5.9.9 and earlier, use the Hybrid Query stage.
> If you’re using Fusion 5.9.10 or later, use the [Neural Hybrid Query stage](#configure-neural-hybrid-queries).
>
> 1. In the same query pipeline where you configured vector search, click **Add a new pipeline stage**, then select **Hybrid Query**.
>
> 2) In the **Label** field, enter a unique identifier for this stage or leave blank to use the default value.
> 3) In the **Condition** field, enter a script that results in true or false, which determines if the stage should process, or leave blank.
> 4) In the **Lexical Query Input** field, enter the location from which the lexical query is retrieved. For example, **\**. Template expressions are supported.
> 5) In the **Lexical Query Weight** field, enter the relative weight of the lexical query. For example, **0.3**. If this value is **0**, no re-ranking will be applied using the lexical query scores.
> 6) In the **Number of Lexical Results** field, enter the number of lexical search results to include in re-ranking. For example, **1000**. A value is **0** is ignored.
> 7) In the **Vector Query Field**, enter the name of the Solr field for k-nearest neighbor (KNN) vector search.
> 8) In the **Vector Input** field, enter the location from which the vector is retrieved. Template expressions are supported. For example, a value of `` evaluates the context variable resulting from a previous stage, such as the [LWAI Vectorize Query](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) stage.
> 9) In the **Vector Query Weight** field, enter the relative weight of the vector query. For example, **0.7**.
> 10) Select the **Use KNN Query** checkbox to use the **knn** query parser and configure its options. This option cannot be selected if **Use VecSim Query** checkbox is selected. In addition, **Use KNN Query** is used if neither **Use KNN Query** or **Use VecSim Query** is selected.
> 1. If the **Use KNN Query checkbox** is selected, enter a value in the **Number of Vector Results** field. For example, **1000**.
> 11) Select the **Use VecSim Query** checkbox to use the **vecSim** query parser and configure its options. This option cannot be selected if **Use KNN Query** checkbox is selected.
>
> If the **Use VecSim Query** checkbox is selected, enter values in the following fields:
>
> * **Min Return Vector Similarity**. Enter the minimum vector similarity value to qualify as a match from the Vector portion of the hybrid query.
>
> * **Min Traversal Vector Similarity**. Enter the minimum vector similarity value to use when walking through the graph during the Vector portion of the hybrid query. The value must be lower than, or equal to, the value in the Min Return Vector Similarity field.
>
> 12. In the **Minimum Vector Similarity Filter**, enter the value for a minimum similarity threshold for filtering documents. This option applies to all documents, regardless of other score boosting such as rules or signals.
> 13. Click **Save**.
>
> Make sure the **Hybrid Query** stage is ordered before the **Solr Query** stage.
>
> ## Perform hybrid searches
>
> After setting up the stages, you can perform hybrid searches via the [`knn` query parser](https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html#knn-query-parser) as you would with Solr.
> Specify the search vector and include it in the query.
> For example, change the `q` parameter to a `knn` query parser string.
>
> You can also preview the results in the [Query Workbench](/docs/5/fusion/getting-data-out/query-basics/query-workbench).
> Try a few different queries, and adjust the weights and parameters in the Hybrid Query stage to find the best balance between lexical and semantic vector search for your use case.
> You can also disable and re-enable the Neural Hybrid Query stage to compare results with and without it.
>
> > [!NOTE]
> >
> > `XDenseVectorField` is not supported in Fusion 5.9.5 and above. Instead, use `DenseVectorField`.
>
> ## Troubleshoot inconsistent results
>
> Neural Hybrid Search leverages Solr semantic vector search, which has known behaviors which can be inconsistent at query time.
> These behaviors include score fluctuations with re-querying, documents showing and disappearing on re-querying, and (when SVS is configured without Hybrid stages) completely unfindable documents.
> This section outlines possible reasons for inconsistent behavior and resolutions steps.
>
> ### NRT replicas and HNSW graph challenges
>
> Lucidworks recommends using PULL and TLOG replicas. These replica types copy the index of the leader replica, which results in the same HNSW graph on every replica. When querying, the HNSW approximation query will be consistent given a static index.
>
> In contrast, NRT replicas have their own index, so they will also have their own HNWS graph. HNSW is an Approximate Nearest Neighbor (ANN) algorithm, so it will not return exactly the same results for differently constructed graphs. This means that queries performed can and will return different results per HNWS graph (number of NRT replicas in a shard) which can lead to noticeable result shifts. When using NRT replicas, the shifts can be made less noticeable by increasing the `topK` parameter. Variation will still occur, but it should be lower in the documents. Another way to mitigate shifts is to use Neural Hybrid Search with a vector similarity cutoff.
>
> For more information, refer to [Solr Types of Replicas](https://solr.apache.org/guide/solr/latest/deployment-guide/solrcloud-shards-indexing.html#types-of-replicas).
>
> In the case of Neural Hybrid Search, lexical BM25 & TF-IDF score differences that can occur with NRT replicas because of index differences for deleted documents, can also affect combined [Hybrid score](/docs/5/fusion/hybrid-search/overview).
> If you choose to use NRT replicas then it is possible that any lexical and/or semantic vectors variations can and will be exacerbated.
>
> ### Orphaning (Disconnected Nodes)
>
> Solr’s implementation of dense vector search depends on the Lucene implementation of HNSW ANN.
> The Lucene implementation has a known issue where, in some collections, nodes in the HNSW graph become unreachable via graph traversal, essentially becoming disconnected or “orphaned.”
>
> #### Identify orphaning
>
> Run the following command to identify orphaning:
>
> ```bash theme={"dark"}
> curl -sS -u 'USERNAME:PASSWORD' 'https://FUSION_HOST:FUSION_PORT/api/solrAdmin/default/COLLECTION_NAME/select'\
> --form-string 'fl=id,vecSim:$vecSim' \
> --form-string 'rows=1' \
> --form-string 'q=(*:* -{!knn f=VECTOR_FIELD topK=999999 v=$vec})' \
> --form-string 'vecSim=vectorSimilarity(VECTOR_FIELD,$vec)' \
> --form-string 'vec=COMPATIBLE_VECTOR'
> ```
>
> > [!NOTE]
> >
> > If the collection doesn’t have a vector for every document, include a filter so only the documents that have vectors are included. Filter on the boolean vector, as in this example: `--form-string 'fq=VECTOR_FIELD_b:true' \`
>
> Construct a KNN exclusion query where topK is higher than the number of vectors in your collection
> If the number of vectors in your collection exceeds 999,999 then increase the value to be at least equal to that value.
>
> If any are documents returned, there are orphans, and the `ids` you see are the orphans.
> Proceed to [Resolving orphans](#resolving-orphans).
> If no documents are returned, there are likely no orphans.
> You can try a few varying vectors to be certain.
>
> #### Resolving orphans
>
> To resolve orphans, do the following:
>
> 1. Increase the HNSW Solr schema parameters `hnswBeamWidth` and `hnswMaxConnections` per the [Suggested values](#suggested-values) below.
> 2. Save the schema.
> 3. Clear the index.
> 4. Re-index your collection.
>
> ##### Suggested values
>
> | Orphaning rate | `hnswBeamWidth` | `hnswMaxConnections` |
> | - | - | - |
> | 5% or less | 300 | 64 |
> | 5% - 25% | 500 | 100 |
> | 25% or more | 3200 | 512 |
## Improvements
* Fusion now supports Kubernetes 1.30 for GKE. Refer to Kubernetes documentation at [Kubernetes v1.30](https://kubernetes.io/blog/2024/04/17/kubernetes-v1-30-release/) for more information.
* Solr has been upgraded to 9.6.1.
* Zookeeper has been upgraded to 3.9.1.
* The default value for `kafka.logRetentionBytes` is increased to 5 GB. This improvement helps prevent failed datasource jobs due to full disk space. Refer to **Troubleshoot failed datasource jobs**.
> **Troubleshoot failed datasource jobs**
>
> When indexing large files, or large quantities of files, you may encounter issues such as datasource jobs failing or documents not making it into Fusion.
>
> ## Overview
>
> When data flows into Fusion, it passes through a Kafka topic first.
> When the number of documents being created by a connector is large, or when the connector is pulling data into the Kafka topic faster than it can be indexed, the topic fills up and the datasource job fails.
> For example, if your connector is inputting a large CSV file where every row is imported as a separate Solr document, the indexing processing can time out before the document is fully ingested.
>
> ## Identify the cause
>
> If you experience failed datasource jobs or notice your connector isn’t grabbing all the documents it should, check the logs for the Kafka pod.
> Look for a message containing the phrases `resetting offset` and `is out of range`, which indicate data has been dropped.
>
> ```bash theme={"dark"}
> 2024-05-28T11:49:40.812Z - INFO [pool-140-thread-3:org.apache.kafka.clients.consumer.internals.Fetcher@1413] - [Consumer clientId=example_Products-irdcsn, groupId=index-pipeline--example_Products--fusion.connectors.datasource-products_S3_Load] Fetch position FetchPosition{offset=6963199, offsetEpoch=Optional[0], currentLeader=LeaderAndEpoch{leader=Optional[fusion5-kafka-0.fusion5-kafka-headless.fusion5.svc.cluster.local:9092 (id: 0 rack: null)], epoch=0}} is out of range for partition fusion.connectors.datasource-products_S3_Load-2, resetting offset
> ```
>
> ## Adjust indexing settings
>
> If you determine that your datasource job is failing due to an issue in Kafka, there are a few options to try.
>
> ### Adjust retention parameters
>
> One solution is to increase the Kafka data retention parameters to allow for larger documents.
> You can configure these settings in your `values.yaml` file in the Helm chart.
>
> 1. The default value for `kafka.logRetentionBytes` is `1073741824` bytes (1 GB).
>
> Try increasing this value to `2147483648` bytes (2 GB) or `3221225472` (3 GB), or larger depending on the size of your documents.
>
> > [!NOTE]
> >
> > In Fusion 5.9.5, the default value is increased to 5 GB.
>
> You can also set this to `-1` to remove the size limit.
> If you do this, be sure to set an appropriate limit for `logRetentionHours` instead.
> 2. The default value for `kafka.logRetentionHours` is `168` (7 days).
>
> If you increase `kafka.logRetentionBytes` by a significant amount (for example, 20 GB), you might need to decrease this setting to prevent running out of disk space.
> However, because older log entries are deleted when either limit is reached, you should set it high enough to ensure the data remains available until it’s no longer needed.
> 3. In Fusion, go to **Indexing > Datasources** and create a new datasource to trigger a new Kafka topic that incorporates these settings.
>
> ### Adjust fetch settings
>
> Another option is to decrease the values for number of fetch threads and request page size in your datasource settings.
>
> 1. In Fusion, go to **Indexing > Datasources** and click your datasource.
> 2. Click the **Advanced** slider to show more settings.
> 3. Reduce the number of **Fetch Threads**.
>
> 
> 4. Reduce the **Request Page Size**.
>
> 
>
> > [!NOTE]
> >
> > This setting might not be available in every connector.
* There is a new AI category in the **Add a new pipeline stage** dropdown for Query and Index Pipelines. This category contains the new stages for Neural Hybrid Search, as well as existing machine learning and AI stages.

* The Fusion migration script is updated to align with changes from the Solr upgrade. The migration script:
* Removes the unused configuration, ``, from `solrconfig.xml`. Solr no longer supports this configuration.
* Removes the query response writer of class `solr.XSLTResponseWriter`.
* Comments out processors of type `solr.StatelessScriptUpdateProcessorFactory`.
* Removes `` element from request handler.
* Changes cache class attribute of elements `"filterCache"`, `"cache"`, `"documentCache"`, `"queryResultCache"` to `solr.search.CaffeineCache`.
* Removes `keepShortTerm` attribute from filter of class `solr.NGramFilterFactory`.
* Added the parameter `job-expiration-duration-seconds` for remote connectors that lets you configure the timeout value. Refer to **Configure Remote V2 Connectors**.
> **Configure Remote V2 Connectors**
>
> If you need to index data from behind a firewall, you can configure a V2 connector to run remotely on-premises using TLS-enabled gRPC.
>
> ## Prerequisites
>
> Before you can set up an on-prem V2 connector, you must configure the egress from your network to allow HTTP/2 communication into the Fusion cloud. You can use a [forward proxy server](#egress-and-proxy-server-configuration) to act as an intermediary between the connector and Fusion.
>
> The following is required to run V2 connectors remotely:
>
> * The [plugin zip file and the connector-plugin-standalone JAR](https://plugins.lucidworks.com/).
>
> * A configured connector backend gRPC endpoint.
>
> * Username and password of a user with a `remote-connectors` or `admin` role.
>
> * If the host where the remote connector is running is not configured to trust the server’s TLS certificate, you must configure the file path of the trust certificate collection.
>
> > [!NOTE]
> >
> > If your version of Fusion doesn’t have the `remote-connectors` role by default, you can create one. No API or UI permissions are required for the role.
>
> ## Connector compatibility
>
> Only V2 connectors are able to run remotely on-premises.
> You also need the remote connector client JAR file that matches your Fusion version.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> > [!NOTE]
> >
> > Whenever you upgrade Fusion, you must also update your remote connectors to match the new version of Fusion.
>
> The gRPC connector backend is not supported in Fusion environments deployed on AWS.
>
> ## System requirements
>
> The following is required for the on-prem host of the remote connector:
>
> * (Fusion 5.9.0-5.9.10) JVM version 11
> * (Fusion 5.9.11) JVM version 17
> * Minimum of 2 CPUs
> * 4GB Memory
>
> Note that memory requirements depend on the number and size of ingested documents.
>
> ## Enable backend ingress
>
> In your `values.yaml` file, configure this section as needed:
>
> ```yaml theme={"dark"}
> ingress:
> enabled: false
> pathtype: "Prefix"
> path: "/"
> #host: "ingress.example.com"
> ingressClassName: "nginx" # Fusion 5.9.6 only
> tls:
> enabled: false
> certificateArn: ""
> # Enable the annotations field to override the default annotations
> #annotations: ""
> ```
>
> * Set `enabled` to `true` to enable the backend ingress.
> * Set `pathtype` to `Prefix` or `Exact`.
> * Set `path` to the path where the backend will be available.
> * Set `host` to the host where the backend will be available.
> * In Fusion 5.9.6 *only*, you can set `ingressClassName` to one of the following:
> * `nginx` for Nginx Ingress Controller
> * `alb` for AWS Application Load Balancer (ALB)
> * Configure TLS and certificates according to your CA’s procedures and policies.
>
> > [!NOTE]
> >
> > TLS must be enabled in order to use AWS ALB for ingress.
>
> ## Connector configuration example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443 # mandatory
> plain-text: false # optional, false by default.
> proxy-server: # optional - needed when a forward proxy server is used to provide outbound access to the standalone connector
> host: host
> port: some-port
> user: user # optional
> password: password # optional
> trust: # optional - needed when the client's system doesn't trust the server's certificate
> cert-collection-filepath: path1
>
> proxy: # mandatory fusion-proxy
> user: admin
> password: password123
> url: https://fusiontest.com/ # needed only when the connector plugin requires blob store access
>
> plugin: # mandatory
> path: ./fs.zip
> type: #optional - the suffix is added to the connector id
> suffix: remote
> ```
>
> ### Minimal example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443
>
> proxy:
> user: admin
> password: "password123"
>
> plugin:
> path: ./testplugin.zip
> ```
>
> ### Logback XML configuration file example
>
> ```xml theme={"dark"}
>
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
> ${LOGDIR:-.}/connector.log
>
>
> ${LOGDIR:-.}/connector-%d{yyyy-MM-dd}.%i.log.gz
> 50MB
> 10GB
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
>
>
>
>
> ```
>
> ## Run the remote connector
>
> ```java theme={"dark"}
> java [-Dlogging.config=[LOGBACK_XML_FILE]] \
> -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> The `logging.config` property is optional. If not set, logging messages are sent to the console.
>
> ## Test communication
>
> You can run the connector in communication testing mode. This mode tests the communication with the backend without running the plugin, reports the result, and exits.
>
> ```java theme={"dark"}
> java -Dstandalone.connector.connectivity.test=true -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> ## Encryption
>
> In a deployment, communication to the connector’s backend server is encrypted using TLS. You should only run this configuration without TLS in a testing scenario. To disable TLS, set `plain-text` to `true`.
>
> ## Egress and proxy server configuration
>
> One of the methods you can use to allow outbound communication from behind a firewall is a proxy server. You can configure a proxy server to allow certain communication traffic while blocking unauthorized communication. If you use a proxy server at the site where the connector is running, you must configure the following properties:
>
> * **Host.** The hosts where the proxy server is running.
> * **Port.** The port the proxy server is listening to for communication requests.
> * **Credentials.** Optional proxy server user and password.
>
> When you configure egress, it is important to disable any connection or activity timeouts because the connector uses long running gRPC calls.
>
> ## Password encryption
>
> If you use a login name and password in your configuration, run the following utility to encrypt the password:
>
> 1. Enter a user name and password in the connector configuration YAML.
>
> 2. Run the standalone JAR with this property:
>
> ```java theme={"dark"}
> -Dstandalone.connector.encrypt.password=true
> ```
>
> 3. Retrieve the encrypted passwords from the log that is created.
>
> 4. Replace the clear password in the configuration YAML with the encrypted password.
>
> ## Connector restart (5.7 and earlier)
>
> The connector will shut down automatically whenever the connection to the server is disrupted, to prevent it from getting into a bad state. Communication disruption can happen, for example, when the server running in the `connectors-backend` pod shuts down and is replaced by a new pod. Once the connector shuts down, connector configuration and job execution are disabled. To prevent that from happening, you should restart the connector as soon as possible.
>
> You can use Linux scripts and utilities to restart the connector automatically, such as [Monit](https://mmonit.com/monit/).
>
> ## Recoverable bridge (5.8 and later)
>
> If communication to the remote connector is disrupted, the connector will try to recover communication and gRPC calls. By default, six attempts will be made to recover each gRPC call. The number of attempts can be configured with the `max-grpc-retries` bridge parameters.
>
> ## Job expiration duration (5.9.5 only)
>
> The timeout value for irresponsive backend jobs can be configured with the `job-expiration-duration-seconds` parameter. The default value is `120` seconds.
>
> ## Use the remote connector
>
> Once the connector is running, it is available in the Datasources dropdown. If the standalone connector terminates, it disappears from the list of available connectors. Once it is re-run, it is available again and configured connector instances will not get lost.
>
> ## Enable asynchronous parsing (5.9 and later)
>
> To separate document crawling from document parsing, enable Tika Asynchronous Parsing on remote V2 connectors.
* Added additional diagnostics between the `connectors-backend` and `fusion-indexing` services.
* Added more detail to the messages that appear in the Fusion UI when a connector job fails.
* Added the `reset` action parameter to the `subscriptions/{id}/refresh?action=some-action` POST API endpoint. Calling `reset` will clear the subscription indexing topic from pending documents. See the [Indexing API](/api-reference/subscriptions-api/refresh-a-subscription).
## Bug fixes
* Fixed an issue that prevented successful configuration of new Kerberos security realms for authentication of external applications.
## Deprecations and removals
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### Bitnami removal
Fusion 5.9.5 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
### Milvus deprecation
With the release of Solr supported embeddings and Solr Semantic Vector Search, Lucidworks is deprecating Milvus. The following Milvus query stages are deprecated and will be removed in a future release:
* Milvus Ensemble Query Stage
* Milvus Query Stage
* Milvus Response Update Query Stage
Use [Seldon](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/vectorize-query-via-seldon-query-stage) or [Lucidworks AI](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lwai-vectorize-query) vector query stages instead.
For more information, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
# Fusion 5.9.6
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.6-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.6-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.6-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/0j9qej
Released on December 2, 2024,
this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes
the new cloud signals feature, support for Open Nashorn, plus bug fixes and other minor improvements.
To learn more, skip to the [release notes](#new-features).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.6 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
## New Features
### Support for Open Nashorn
Now your pipeline definitions can include your choice of JavaScript engine, either "Nashorn" or "OpenJDK Nashorn".
You can select the JavaScript engine in the pipeline views.
Your JavaScript pipeline stages are interpreted by the selected engine.

> [!NOTE]
>
> While Nashorn is the default option, it is in the process of being deprecated and will eventually be removed, so it is recommended to use OpenJDK Nashorn when possible.
## Improvements
* Fusion’s Remote V2 Connectors now support the Amazon Web Services (AWS) Application Load Balancer (ALB) for ingress.\
See **Configure Remote V2 Connectors** for configuration details.
> **Configure Remote V2 Connectors**
>
> If you need to index data from behind a firewall, you can configure a V2 connector to run remotely on-premises using TLS-enabled gRPC.
>
> ## Prerequisites
>
> Before you can set up an on-prem V2 connector, you must configure the egress from your network to allow HTTP/2 communication into the Fusion cloud. You can use a [forward proxy server](#egress-and-proxy-server-configuration) to act as an intermediary between the connector and Fusion.
>
> The following is required to run V2 connectors remotely:
>
> * The [plugin zip file and the connector-plugin-standalone JAR](https://plugins.lucidworks.com/).
>
> * A configured connector backend gRPC endpoint.
>
> * Username and password of a user with a `remote-connectors` or `admin` role.
>
> * If the host where the remote connector is running is not configured to trust the server’s TLS certificate, you must configure the file path of the trust certificate collection.
>
> > [!NOTE]
> >
> > If your version of Fusion doesn’t have the `remote-connectors` role by default, you can create one. No API or UI permissions are required for the role.
>
> ## Connector compatibility
>
> Only V2 connectors are able to run remotely on-premises.
> You also need the remote connector client JAR file that matches your Fusion version.
> You can download the latest files at [V2 Connectors Downloads](/docs/fusion-connectors/downloads/v2-connectors-downloads).
>
> > [!NOTE]
> >
> > Whenever you upgrade Fusion, you must also update your remote connectors to match the new version of Fusion.
>
> The gRPC connector backend is not supported in Fusion environments deployed on AWS.
>
> ## System requirements
>
> The following is required for the on-prem host of the remote connector:
>
> * (Fusion 5.9.0-5.9.10) JVM version 11
> * (Fusion 5.9.11) JVM version 17
> * Minimum of 2 CPUs
> * 4GB Memory
>
> Note that memory requirements depend on the number and size of ingested documents.
>
> ## Enable backend ingress
>
> In your `values.yaml` file, configure this section as needed:
>
> ```yaml theme={"dark"}
> ingress:
> enabled: false
> pathtype: "Prefix"
> path: "/"
> #host: "ingress.example.com"
> ingressClassName: "nginx" # Fusion 5.9.6 only
> tls:
> enabled: false
> certificateArn: ""
> # Enable the annotations field to override the default annotations
> #annotations: ""
> ```
>
> * Set `enabled` to `true` to enable the backend ingress.
> * Set `pathtype` to `Prefix` or `Exact`.
> * Set `path` to the path where the backend will be available.
> * Set `host` to the host where the backend will be available.
> * In Fusion 5.9.6 *only*, you can set `ingressClassName` to one of the following:
> * `nginx` for Nginx Ingress Controller
> * `alb` for AWS Application Load Balancer (ALB)
> * Configure TLS and certificates according to your CA’s procedures and policies.
>
> > [!NOTE]
> >
> > TLS must be enabled in order to use AWS ALB for ingress.
>
> ## Connector configuration example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443 # mandatory
> plain-text: false # optional, false by default.
> proxy-server: # optional - needed when a forward proxy server is used to provide outbound access to the standalone connector
> host: host
> port: some-port
> user: user # optional
> password: password # optional
> trust: # optional - needed when the client's system doesn't trust the server's certificate
> cert-collection-filepath: path1
>
> proxy: # mandatory fusion-proxy
> user: admin
> password: password123
> url: https://fusiontest.com/ # needed only when the connector plugin requires blob store access
>
> plugin: # mandatory
> path: ./fs.zip
> type: #optional - the suffix is added to the connector id
> suffix: remote
> ```
>
> ### Minimal example
>
> ```yaml theme={"dark"}
> kafka-bridge:
> target: mynamespace-connectors-backend.lucidworkstest.com:443
>
> proxy:
> user: admin
> password: "password123"
>
> plugin:
> path: ./testplugin.zip
> ```
>
> ### Logback XML configuration file example
>
> ```xml theme={"dark"}
>
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
> ${LOGDIR:-.}/connector.log
>
>
> ${LOGDIR:-.}/connector-%d{yyyy-MM-dd}.%i.log.gz
> 50MB
> 10GB
>
>
> %d - %-5p [%t:%C{3.}@%L] - %m{nolookups}%n
> utf8
>
>
>
>
>
>
>
>
> ```
>
> ## Run the remote connector
>
> ```java theme={"dark"}
> java [-Dlogging.config=[LOGBACK_XML_FILE]] \
> -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> The `logging.config` property is optional. If not set, logging messages are sent to the console.
>
> ## Test communication
>
> You can run the connector in communication testing mode. This mode tests the communication with the backend without running the plugin, reports the result, and exits.
>
> ```java theme={"dark"}
> java -Dstandalone.connector.connectivity.test=true -jar connector-plugin-client-standalone.jar [YAML_CONFIG_FILE]
> ```
>
> ## Encryption
>
> In a deployment, communication to the connector’s backend server is encrypted using TLS. You should only run this configuration without TLS in a testing scenario. To disable TLS, set `plain-text` to `true`.
>
> ## Egress and proxy server configuration
>
> One of the methods you can use to allow outbound communication from behind a firewall is a proxy server. You can configure a proxy server to allow certain communication traffic while blocking unauthorized communication. If you use a proxy server at the site where the connector is running, you must configure the following properties:
>
> * **Host.** The hosts where the proxy server is running.
> * **Port.** The port the proxy server is listening to for communication requests.
> * **Credentials.** Optional proxy server user and password.
>
> When you configure egress, it is important to disable any connection or activity timeouts because the connector uses long running gRPC calls.
>
> ## Password encryption
>
> If you use a login name and password in your configuration, run the following utility to encrypt the password:
>
> 1. Enter a user name and password in the connector configuration YAML.
>
> 2. Run the standalone JAR with this property:
>
> ```java theme={"dark"}
> -Dstandalone.connector.encrypt.password=true
> ```
>
> 3. Retrieve the encrypted passwords from the log that is created.
>
> 4. Replace the clear password in the configuration YAML with the encrypted password.
>
> ## Connector restart (5.7 and earlier)
>
> The connector will shut down automatically whenever the connection to the server is disrupted, to prevent it from getting into a bad state. Communication disruption can happen, for example, when the server running in the `connectors-backend` pod shuts down and is replaced by a new pod. Once the connector shuts down, connector configuration and job execution are disabled. To prevent that from happening, you should restart the connector as soon as possible.
>
> You can use Linux scripts and utilities to restart the connector automatically, such as [Monit](https://mmonit.com/monit/).
>
> ## Recoverable bridge (5.8 and later)
>
> If communication to the remote connector is disrupted, the connector will try to recover communication and gRPC calls. By default, six attempts will be made to recover each gRPC call. The number of attempts can be configured with the `max-grpc-retries` bridge parameters.
>
> ## Job expiration duration (5.9.5 only)
>
> The timeout value for irresponsive backend jobs can be configured with the `job-expiration-duration-seconds` parameter. The default value is `120` seconds.
>
> ## Use the remote connector
>
> Once the connector is running, it is available in the Datasources dropdown. If the standalone connector terminates, it disappears from the list of available connectors. Once it is re-run, it is available again and configured connector instances will not get lost.
>
> ## Enable asynchronous parsing (5.9 and later)
>
> To separate document crawling from document parsing, enable Tika Asynchronous Parsing on remote V2 connectors.
## Removals
### Bitnami removal
Fusion 5.9.6 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
## Bug fixes
* Fixed an issue that caused the API Gateway service to return a `401` error code for `400` errors.
* Fixed an issue that passed redacted configuration values to Fusion, resulting in invalid configurations.
* Fixed an issue that sometimes caused intermittent errors in Machine Learning stages.
* Fixed an issue where the `sourceType` query parameter was not being conveyed to Lucidworks AI.
* Fixed an issue that prevented the correct display of some UI panels for non-admin users.
* Fixed an issue where the names of some of the configuration checkboxes for the Web connector were truncated.
* Fixed an issue with the Web 1.4.0 connector that, in rare cases, prevented the client secret from being saved.
* Fixed an issue that caused a `Class cannot be created (missing no-arg constructor)` error when a response document contained an undefined value.
# Fusion 5.9.7
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.7-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.7-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.7-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/cpx717
Released on December 10, 2024,
this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) includes new generative AI features and some bug fixes.
To learn more, skip to the [release notes](#new-features).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.7 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
## New Features
New Lucidworks AI pipeline stages are introduced in this release to enrich your index and search with [Generative AI](/docs/lw-platform/lw-ai/lw-ai-generative-ai) predictions:
* The [LWAI Prediction index stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lucidworks-ai-prediction-index-stage) allows for asynchronous and synchronous enrichment that add predictions when indexing your data.\
See **Configure the LWAI Prediction index Stage** for more detailed instructions about configuring this stage.
* The [LWAI Prediction query stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/lucidworks-ai-prediction-query-stage) fetches synchronous predictions to add to your query response.
See [Generative AI](/docs/lw-platform/lw-ai/lw-ai-generative-ai) for more details about Lucidworks AI’s Generative AI capabilities, including pre-trained models hosted by Lucidworks.
You can also use [LWAI custom trained embedding](/docs/lw-platform/lw-ai/lw-ai-custom-embedding-model-training/overview) and [LWAI hosted pre-trained models](/docs/lw-platform/lw-ai/lw-ai-pre-trained-embedding-models) with these new stages.
A new API endpoint, `/index-pipelines/{id}/async-enrichment/skip-pending`, can be used to clear the queue of outstanding asynchronous prediction index requests if needed.
## Removals
### Bitnami removal
Fusion 5.9.7 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
## Bug fixes
* Fixed an issue where some collections were not displayed in the Collections Manager if the system contained one or more orphaned child collections.\
Note that orphaned child collections are not displayed in the Collections Manager by design, but they are discoverable using the API or the Object Manager.
# Fusion 5.9.8
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.8-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.8-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.8-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/en43zu
Released on January 7, 2025, Fusion 5.9.8 brings powerful enhancements to streamline your workflows and prepare your systems for future innovations. This release enables seamless synchronization of Fusion configurations across environments, provides compatibility with upcoming solutions, and resolves key issues to ensure a smoother experience.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Commerce Studio support
Fusion 5.9.8 is fully compatible with Commerce Studio, Lucidworks' solution for enhancing e-commerce experiences.
Commerce Studio will be generally available at the end of January, 2025. Accompanying that release will be documentation and training materials.
> **[What is Commerce Studio?](https://academy.lucidworks.com/what-is-commerce-studio)**
>
> The course for **What is Commerce Studio?** focuses on how to tailor your user’s search and browse experiences through powerful rule building, merchandising, audience segmentation, and more.
### ConfigSync
Automatically keep your Fusion configuration settings consistent and up-to-date across different environments with the new [ConfigSync](/docs/5/fusion/operations/config-sync/overview) feature. By leveraging GitHub’s version control capabilities, ConfigSync eliminates manual synchronization, provides a historical record of your environments, and enables seamless rollbacks and forward changes. Highly customizable, it simplifies environment management while saving time and ensuring consistency.
ConfigSync supports:
* Polling or event-driven synchronization
* Multiple synchronization modes:
* **Publisher mode:** Monitors Fusion for changes and pushes them to a Git repository.
* **Subscriber mode:** Polls a Git repository for changes and applies them to Fusion.
* **Pub/Sub mode:** Combines the features of both Publisher and Subscriber modes.
* Locking the configuration to a specific commit
* Rolling back configurations to a previous state
* Storing and synchronizing Fusion secrets securely in your GitHub repository
* Metrics for monitoring, such as `resource_update_errors_total`, `out_of_sync`, `sync_seconds`, and `sync_seconds_max`
ConfigSync is turned off by default and requires preparation of a GitHub repository. Learn how to turn on ConfigSync in your Fusion 5.9.8 cluster with the [ConfigSync deployment guide](/docs/5/fusion/operations/config-sync/deployment).
> **[ConfigSync](https://academy.lucidworks.com/configsync-course)**
>
> The course for **ConfigSync** focuses on how to set up ConfigSync, choose a synchronization mode, and apply filters.
## Bug fixes
* Fixed an issue with Predictive Merchandiser that prevented saving new fields in templates.
* Fixed an issue that prevented the data model field dropdown from displaying in the Data Model Mapping index pipeline stage.
## Known issues
* An issue prevents segment-based rule filtering from working correctly in Commerce Studio. This issue is fixed in Fusion 5.9.12.
* An issue causes the Fusion Helm chart with Transport Layer Security (TLS) enabled to throw an error with Kafka during installation. To avoid this, the `helm install` command used to [install Fusion with TLS](/docs/5/fusion/reference/microservices#transport-layer-security-tls) should include the flags `--set global.zkReplicaCount=3` and `--set kafka.auth.clientProtocol=tls`.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
As part of our ongoing commitment to providing a modern, efficient, and secure product, Lucidworks is officially deprecating support for the Nashorn JavaScript engine in Fusion 5.9.8. Users are advised to use the OpenJDK Nashorn engine, a robust and actively maintained alternative, for all JavaScript pipeline stages.
The deprecation aligns with industry trends and ensures compatibility with modern tools and frameworks. OpenJDK Nashorn provides enhanced performance, improved support, and ongoing updates, making it the ideal replacement.
> [!CAUTION]
>
> **FAQ**
>
> How long will Lucidworks continue to support Nashorn?
>
> Nashorn will remain available for at least 6 months from the release of Fusion 5.9.8. All Nashorn-related features and integrations will be removed in a release after this 6-month period.
To prepare for the eventual removal of Nashorn in a future release, Lucidworks strongly recommends beginning the migration of your pipelines to OpenJDK Nashorn:
* **Audit your code.** Identify all areas where Nashorn is used in your applications.
* **Plan your migration.** Transition your JavaScript pipelines from Nashorn to OpenJDK Nashorn. Be sure to thoroughly test compatibility with your configurations to ensure a smooth transition.
* **Seek support.** Lucidworks is available to assist with any migration questions or challenges. Please contact your Client Excellence team if you have any questions.
We appreciate your understanding and cooperation in this transition. Thank you for ensuring the continued evolution and efficiency of your workflows.
> [!TIP]
>
> You can select the OpenJDK Nashorn engine in the pipeline views or in the workbenches:
>
> 
## Removals
### Bitnami removal
Fusion 5.9.8 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.8 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
# Fusion 5.9.9
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9/5.9.9-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.9.9-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.9.9-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/hga40k
Released on January 29, 2025, this [maintenance release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#maintenance-release-support-policy) delivers essential security enhancements, including the latest updates for Kafka and key improvements for future-ready protection, plus bug fixes.
Upgrading to the latest version of Fusion 5.9 offers several key benefits:
* **Access to latest features:** Stay current with the latest features and functionality to ensure compatibility and optimal performance.
* **Simplified process:** Fusion 5.9.5 and later use an in-place upgrade strategy, making upgrades easier than ever.
* **Extended support:** Upgrading keeps you up-to-date with the latest supported Kubernetes versions, as outlined in the [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle) policy.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
> [!CAUTION]
>
> **Security patch available for api-gateway: Netty request smuggling vulnerabilities**
>
> A patch is available for the `api-gateway` service to address critical Netty request smuggling vulnerabilities (CVE-2026-42581, CVE-2026-42585, CVE-2026-42587). These vulnerabilities allow attackers to smuggle HTTP requests through the gateway, potentially bypassing security controls.
>
> > **Instructions for applying the patch**
> >
> > The `api-gateway` service requires the Netty security patch.
> >
> > Follow these steps to apply the patched image:
> >
> > 1. Open your Fusion Helm values file.
> >
> > 2. Add or update the `api-gateway` image configuration:
> >
> > ```yaml theme={"dark"}
> > api-gateway:
> > image:
> > repository: lucidworks
> > name: api-gateway
> > tag: 5.9.9-SUST-1634-patch
> > imagePullPolicy: IfNotPresent
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > Replace `NAMESPACE` with your Kubernetes namespace, `RELEASE_NAME` with your Helm release name, and `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the `api-gateway` pods to restart and verify they are using the patched image.
> [!CAUTION]
>
> **Urgent action required by November 26, 2025**
>
> A patch is required by November 26, 2025 for all self-hosted Fusion deployments running on Amazon Elastic Kubernetes Service (EKS). Certain Java versions used by Fusion components reach end of life on this date. Failure to apply the patch will result in compatibility issues.
>
> > **Instructions for applying the patch**
> >
> > The following Fusion services require the `cgroupv2` patch:
> >
> > | Service | Affected Fusion versions | Patch tag |
> > | - | - | - |
> > | `insights` | 5.9.4 to 5.9.15 | `lucidworks/insights:5.9-cgroupv2-patch` |
> > | `spark-solr-etl` | 5.9.4 to 5.9.11 | `lucidworks/spark-solr-etl:5.9-cgroupv2-patch` |
> > | `keytool-utils` | 5.9.4 to 5.9.10 | `lucidworks/keytool-utils:5.9-cgroupv2-patch` |
> >
> > Follow these steps to apply the patched images:
> >
> > 1. Open your Fusion Helm values file. For Fusion Cloud Native deployments, use the values file for your current deployment. For Helm deployments, use the values file you used to create the deployment.
> >
> > 2. For each service listed in the following table that applies to your Fusion version, add or update the image configuration:
> >
> > **Fusion 5.9.4 to 5.9.10**
> >
> > > [!TIP]
> > >
> > > Expand the following code snippet for the complete image configuration list.
> >
> > ```yaml expandable theme={"dark"}
> > global:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > sql-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > reverse-search:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > solr:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > kafka:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > zookeeper:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > ml-model-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-admin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-indexing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > query-pipeline:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > async-parsing:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > admin-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > api-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > auth-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > classic-rest-service:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > fusion-resources:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-config:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > insights:
> > image:
> > imagePullPolicy: Always
> > name: insights
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-launcher:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > job-rest-server:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connector-plugin:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > connectors-backend:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > rules-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > pm-ui:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > lwai-gateway:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > webapps:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > apps-manager:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > templating:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > tikaserver:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > seldon-core-operator:
> > keytoolUtils:
> > image:
> > repository: lucidworks
> > name: "keytool-utils"
> > tag: "5.9-cgroupv2-patch"
> > imagePullPolicy: "IfNotPresent"
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: Always
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > utilitiesTag: 5.9.11
> > ```
> >
> > **Fusion 5.9.11**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: 5.9-cgroupv2-patch
> >
> > argo-common-workflows:
> > image:
> > imagePullPolicy: IfNotPresent
> > repository: lucidworks
> > sparkSolrEtlTag: 5.9-cgroupv2-patch
> > ```
> >
> > **Fusion 5.9.12 to 5.9.15**
> >
> > ```yaml theme={"dark"}
> > insights:
> > image:
> > name: insights
> > pullPolicy: IfNotPresent
> > repository: lucidworks
> > tag: insights:5.9-cgroupv2-patch
> > ```
> >
> > 3. Save the values file.
> >
> > 4. For Fusion Cloud Native deployments, run the `upgrade_fusion.sh` script you used for your current deployment. For Helm deployments, run the following command:
> >
> > ```bash theme={"dark"}
> > helm upgrade --namespace NAMESPACE RELEASE_NAME PATH_TO_VALUES
> > ```
> >
> > > [!TIP]
> > >
> > > Replace `NAMESPACE` with your Kubernetes namespace. Replace `RELEASE_NAME` with your Helm release name. Replace `PATH_TO_VALUES` with the path to your updated values file.
> >
> > 5. Wait for the affected service pods to restart and verify they are using the patched images.
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
For supported Kubernetes versions and key component versions, see [Platform support and component versions](#platform-support-and-component-versions).
## Key highlights
### Enhanced security and future-ready safeguards
With the Fusion 5.9.9 release, we’ve upgraded Kafka to version 3.7.0, incorporating the latest security updates to strengthen your platform’s resilience. Additionally, we’ve implemented critical updates for Fusion’s Webapps, Templating, and API Gateway services, ensuring robust protection for your data.
Looking ahead, we’ve introduced enhancements to streamline and expedite the delivery of future security updates, providing you with a safer Fusion environment.
### Secure deployments with immutable root file system
Fusion now supports a read-only root file system to safeguard against unauthorized modifications, protecting your deployment against malicious software and other attacks.
Most services operate efficiently in this mode, and for components that need write access, a separate writable mount is available using specific helm configurations.
Read-only mode is enabled by default for some Fusion services.
See **Enable Read-Only Root File System** for a list of services that support it or have it enabled by default, along with examples of how to configure it in your Fusion deployment.
It should only be enabled for services that do not require CRUD access.
> **Enable Read-Only Root File System**
>
> This topic describes how to configure a read-only root file system for a Fusion deployment.
> Read-only mode safeguards your file system against unauthorized changes, such as by malicious software or other attacks.
> Enabling this feature entails configuring the `readOnlyRootFilesystem` attribute in the Fusion Helm chart.
>
> > [!NOTE]
> >
> > This feature is available starting in Fusion 5.9.9 and in all subsequent Fusion 5.9 releases.
>
> Beginning with Fusion 5.9.10, all of [Fusion’s services](/docs/5/fusion/reference/microservices) are designed to work with a read-only root file system, but some external services may require write access to the file system.
> In that case, you can configure a read-only root file system and mount a separate writable file system for these services.
>
> The examples below show how to configure a read-only root file system for various Fusion services.
>
> ## Solr
>
> ```yaml theme={"dark"}
> fusion:
> solr:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml theme={"dark"}
> fusion:
> solr:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Zookeeper
>
> ```yaml theme={"dark"}
> fusion:
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml theme={"dark"}
> fusion:
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> exporters:
> jmx:
> enabled: true
> zookeeper:
> enabled: true
> jobs:
> chroots:
> enabled: true
> config:
> create:
> - /root-read-only
> ```
>
> ## Kafka
>
> ```yaml theme={"dark"}
> fusion:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> **With optional services:**
>
> ```yaml expandable theme={"dark"}
> fusion:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> volumePermissions:
> enabled: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> metrics:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> jmx:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> externalAccess:
> enabled: true
> autoDiscovery:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> provisioning:
> enabled: true
> topics:
> - name: test
> partitions: 1
> replicationFactor: 1
> ## https://kafka.apache.org/documentation/#topicconfigs
> config:
> max.message.bytes: 64000
> flush.messages: 1
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> ```
>
> ## ML Model Service
>
> ```yaml expandable theme={"dark"}
> fusion:
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> With optional services:
> fusion:
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> prometheusExporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> metrics:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> cluster:
> enabled: false
> mishards:
> securityContext:
> readOnlyRootFilesystem: true
> admin:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Argo
>
> ```yaml theme={"dark"}
> fusion:
> argo:
> minio:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Seldon Core Operator
>
> ```yaml theme={"dark"}
> fusion:
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Argo Common Workflows
>
> ```yaml theme={"dark"}
> fusion:
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Question Answering
>
> ```yaml theme={"dark"}
> fusion:
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Classification
>
> ```yaml theme={"dark"}
> fusion:
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## All-in-one values.yaml example
>
> ```yaml expandable theme={"dark"}
> fusion:
> solr:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> solr-managed:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> ml-model-service:
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> argo:
> minio:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## All-in-one values.yaml with optional services example
>
> ```yaml expandable theme={"dark"}
> fusion:
> argo:
> minio:
> persistence:
> enabled: false
> containerSecurityContext:
> readOnlyRootFilesystem: true
> extraVolumes:
> - name: config-dir
> emptyDir: {}
> - name: certs-dir
> emptyDir: {}
> extraVolumeMounts:
> - name: config-dir
> mountPath: /.minio
> - name: certs-dir
> mountPath: /etc/minio/certs
> server:
> securityContext:
> readOnlyRootFilesystem: true
> controller:
> securityContext:
> readOnlyRootFilesystem: true
> mainContainer:
> securityContext:
> readOnlyRootFilesystem: true
> executor:
> securityContext:
> readOnlyRootFilesystem: true
> solr:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> # tls:
> # enabled: true
> solr-managed:
> exporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> enableExternalFiles: true
> enabledStorage:
> - gcs
> processRaw:
> image:
> repository: fusion-dev-docker.ci-artifactory.lucidworks.com
> cloudRoot: gs://lw-managed-fusion-data/tmp
> gcs:
> secret: gcs-key
> secretFieldName: key.json
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> # tls:
> # enabled: true
> zookeeper:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> exporters:
> jmx:
> enabled: true
> zookeeper:
> enabled: true
> jobs:
> chroots:
> # enabled: true
> config:
> create:
> - /root-read-only
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> volumePermissions:
> enabled: true
> image:
> repository: "fusion-dev-docker.ci-artifactory.lucidworks.com/os-shell"
> containerSecurityContext:
> readOnlyRootFilesystem: true
> metrics:
> kafka:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> jmx:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> externalAccess:
> enabled: true
> autoDiscovery:
> enabled: true
> containerSecurityContext:
> enabled: true
> readOnlyRootFilesystem: true
> provisioning:
> enabled: true
> topics:
> - name: test
> partitions: 1
> replicationFactor: 1
> ## https://kafka.apache.org/documentation/#topicconfigs
> config:
> max.message.bytes: 64000
> flush.messages: 1
> containerSecurityContext:
> readOnlyRootFilesystem: true
> enabled: true
> ml-model-service:
> enabled: true
> ambassador:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> prometheusExporter:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> milvus:
> mysql:
> metrics:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> containerSecurityContext:
> readOnlyRootFilesystem: true
> cluster:
> enabled: false
> mishards:
> securityContext:
> readOnlyRootFilesystem: true
> admin:
> enabled: true
> securityContext:
> readOnlyRootFilesystem: true
> securityContext:
> readOnlyRootFilesystem: true
> seldon-core-operator:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> argo-common-workflows:
> containerSecurityContext:
> readOnlyRootFilesystem: true
> question-answering:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> classification:
> containersSecurityContext:
> readOnlyRootFilesystem: true
> ```
>
> ## Supported services
>
> The table below lists the services that support a read-only root file system, the ones that have it enabled by default, and the Fusion release in which support was added:
>
> | Chart Name | Pod Name | Container Name | Supported | Default enabled | Supported version |
> | - | - | - | - | - | - |
> | admin-ui | admin-ui | admin-ui | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | init/api-gateway | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | api-gateway | ✅ | ✅ | 5.9.9+ |
> | api-gateway | api-gateway | generate-jks | ✅ | ✅ | 5.9.9+ |
> | apps-manager | apps-manager | apps-manager | ✅ | ✅ | 5.9.9+ |
> | argo | argo-server | argo-server | ✅ | ❌ | 5.9.10+ |
> | argo | argo-executor | executor | ✅ | ❌ | 5.9.10+ |
> | argo | argo-mainContainer | mainContainer | ✅ | ❌ | 5.9.10+ |
> | argo | argo-controller | controller | ✅ | ✅ | 5.9.10+ |
> | argo/minio | minio | minio | ✅ | ❌ | 5.9.10+ |
> | argo/minio | minio | minio | ✅ | ❌ | 5.9.10+ |
> | argo/minio | make-bucket-job | minio-mc | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | delete-model | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | deploy-model | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | milvus-maintenance | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | argo-common-workflows | upload-model-to-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | async-parsing | async-parsing | tika-server | ✅ | ✅ | 5.9.9+ |
> | async-parsing | async-parsing | async-parsing | ✅ | ✅ | 5.9.9+ |
> | auth-ui | auth-ui | auth-ui | ✅ | ✅ | 5.9.9+ |
> | classic-rest-service | classic-rest-service | init/import-certs | ✅ | ✅ | 5.9.10+ |
> | classic-rest-service | classic-rest-service | classic-rest-service | ✅ | ✅ | 5.9.9+ |
> | classification | argo/classification | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | connector-plugin | connector-plugin | init/import-certs | ✅ | ❌ | 5.9.10+ |
> | connector-plugin | connector-plugin | connector-plugin | ✅ | ✅ | 5.9.9+ |
> | connectors | connectors | connectors | ✅ | ✅ | 5.9.9+ |
> | connectors-backend | CRD | | ✅ | ✅ | 5.9.9+ |
> | connectors-backend | connectors-backend | connectors-backend | ✅ | ✅ | 5.9.9+ |
> | fusion-admin | fusion-admin | admin | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-admin | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-api-gateway | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-indexing | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-kafka | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-logstash | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-pulsar | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | setup-keystore-and-properties | ✅ | ✅ | 5.9.9+ |
> | fusion-commons | | check-zk | ✅ | ✅ | 5.9.9+ |
> | fusion-config-sync | fusion-config-sync | fusion-config-sync | ✅ | ✅ | 5.9.9+ |
> | fusion-data-augmentation | argo/data-augmentation/volume-fix | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/init-workspace | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/write-job-configs | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/write-io-configs | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/add-zkhost | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/pull-data-training-and-metadata | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/pull-data-training-and-metadata-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/volume-fix2 | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/synonym-list | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/download-synonym-dictionary | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/keystroke-list | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/download-keystroke-blob | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/augment | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/push-augmented-data | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-data-augmentation | argo/data-augmentation/push-augmented-data-cloud | init/main/wait | ✅ | ❌ | 5.9.10+ |
> | fusion-indexing | fusion-indexing | fusion-indexing | ✅ | ✅ | 5.9.9+ |
> | fusion-resources | fusion-resources-secret-hook | setup-keystore-and-properties | ✅ | ✅ | 5.9.10+ |
> | insights | insights | insights | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher | job-launcher | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | job-launcher | job-launcher-spark-cleanup | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | job-launcher | spark-kubernetes-driver | spark-kubernetes-driver | ✅ | ❌ | 5.9.10+ |
> | job-launcher | spark-kubernetes-executor | spark-kubernetes-executor | ✅ | ❌ | 5.9.10+ |
> | job-rest-server | job-rest-server | job-rest-server | ✅ | ✅ | 5.9.9+ |
> | kafka | kafka-metrics | kafka-exporter-archived | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka-provisioning | init/wait-for-available-kafka | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka-provisioning | kafka-provisioning | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | kafka | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | jmx-exporter | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | init/check-zk | ✅ | ✅ | 5.9.9+ |
> | kafka | kafka | init/auto-discovery | ✅ | ❌ | 5.9.10+ |
> | kafka | kafka | init/volume-permissions | ✅ | ❌ | 5.9.10+ |
> | lwai-gateway | lwai-gateway | lwai-gateway | ✅ | ✅ | 5.9.9+ |
> | ml-model-service | ml-model-service | java-service | ✅ | ✅ | 5.9.9+ |
> | ml-model-service | ml-model-service-namespace-hook | kubectl-runner | ✅ | ✅ | 5.9.9+ |
> | ml-model-service/ambassador | ambassador | ambassador | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/ambassador | ambassador | prometheus-exporter | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | milvus | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-writable | init/create-for-share-storage | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-admin | admin | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus | milvus-admin | init/wait-for-milvus | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | init/wait-for-mysql | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus | milvus-mishards | mishards | ✅ | ❌ | 5.9.10+ |
> | ml-model-service/milvus/mysql | mysql | init/remove-lost-found | ✅ | ✅ | 5.9.10+ |
> | ml-model-service/milvus/mysql | mysql | mysql | ✅ | ❌ | 5.9.10+ |
> | pm-ui | pm-ui | pm-ui | ✅ | ✅ | 5.9.9+ |
> | query-pipeline | query-pipeline | query-pipeline | ✅ | ✅ | 5.9.9+ |
> | question-answering | argo/qna-coldstart/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/add-zkHost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/pull-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/pull-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/post-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-coldstart/apply-seldon-deployment | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/pull-qa-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/pull-qa-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/train-with-texts | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/post-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-supervised/apply-seldon-deployment | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/list-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/pull-eval-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/pull-eval-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/evaluate | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/push-eval-results-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | question-answering | argo/qna-evaluation/push-eval-results | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/pull-data-training-and-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/pull-data-training-and-metadata-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/train-with-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/train-without-metadata | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/push-recommendations | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/push-recommendations-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/add-default-exclude-query | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-user/init-workspace | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/copy-model | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/write-job-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/write-io-configs | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/add-zkhost | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/pull-data | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/pull-data-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/train | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/push-content | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/push-content-cloud | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/add-default-exclude-query | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | recommender | argo/item-recommender-content/delete-old-content-recommendations | init/wait/main | ✅ | ❌ | 5.9.10+ |
> | reverse-search | reverse-search | init/set-reverse-search-zone | ✅ | ✅ | 5.9.10+ |
> | reverse-search | reverse-search | init/check-zk | ✅ | ✅ | 5.9.9+ |
> | reverse-search | reverse-search | init/enable-tls-in-reverse-search | ✅ | ✅ | 5.9.10+ |
> | reverse-search | reverse-search | reverse-search | ✅ | ❌ | 5.9.10+ |
> | rules-ui | rules-ui | rules-ui | ✅ | ✅ | 5.9.9+ |
> | seldon-core-operator | seldon-controller-manager | manager | ✅ | ❌ | 5.9.10+ |
> | seldon-core-operator | seldon-spartakus-volunteer | seldon-spartakus-volunteer | ✅ | ❌ | 5.9.9+ |
> | seldon-core-operator | crd/SeldonDeployment | | ✅/❌ | ❌ | 5.9.9+ |
> | solr | solr | init/set-solr-zone | ✅ | ✅ | 5.9.10+ |
> | solr | solr | init/enable-tls-in-solr | ✅ | ✅ | 5.9.10+ |
> | solr | configset-bootstrap | configset-bootstrap | ✅ | ✅ | 5.9.10+ |
> | solr | solr | solr | ✅ | ❌ | 5.9.10+ |
> | solr | solr-exporter | exporter | ✅ | ❌ | 5.9.10+ |
> | solr | solr-exporter | init/solr-init | ✅ | ✅ | 5.9.10+ |
> | solr-managed | configset-bootstrap | configset-bootstrap | ✅ | ✅ | 5.9.10+ |
> | solr-managed | exporter | exporter | ✅ | ❌ | 5.9.10+ |
> | solr-managed | exporter | init/solr-init | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | init/set-solr-zone | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | init/enable-tls-in-solr | ✅ | ✅ | 5.9.10+ |
> | solr-managed | solr | solr | ✅ | ❌ | 5.9.10+ |
> | solr-managed | solr | process-raw | ✅ | ❌ | 5.9.10+ |
> | solr-backup-runner | solr-backup-runner-backup | solr-backups | ✅ | ❌ | 5.9.10+ |
> | solr-backup-runner | solr-backup-runner-prune | solr-prune | ✅ | ❌ | 5.9.10+ |
> | templating | templating | templating | ✅ | ✅ | 5.9.9+ |
> | webapps | webapps | webapps | ✅ | ✅ | 5.9.9+ |
> | zookeeper | zookeeper | zookeeper | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper | jmx-exporter | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper | zookeeper-exporter | ✅ | ❌ | 5.9.10+ |
> | zookeeper | zookeeper-chroots | main | ✅ | ❌ | 5.9.10+ |
## Bug fixes
* This release addresses an issue in Fusion 5.9.2 and up, where enabling Transport Layer Security (TLS) during installation resulted in the following error:
```
Error: INSTALLATION FAILED: ... at <.tls.certSecret.name>: nil pointer evaluating interface {}.name
```
With this fix, Fusion can now be successfully installed with TLS enabled.
* This release improves compatibility between Solr and Fusion’s [LWAI Prediction index pipeline stage](/docs/5/fusion/reference/config-ref/pipeline-stages/index-stages/lucidworks-ai-prediction-index-stage) to prevent errors about incompatible characters in field names.
* The Fusion API realm can now authenticate when an API key is passed via an `apiKey` parameter.\
Previously, the key could only be passed in the header, as in these examples:
```bash wrap theme={"dark"}
curl -H "x-api-key: API_KEY" "https://FUSION_HOST/api/query/status"
curl -H "apiKey: API_KEY" "https://FUSION_HOST/api/query/status"
```
Now you can also pass the key as a parameter, like this:
```bash theme={"dark"}
curl https://FUSION_HOST/api/query/status?apiKey=API_KEY
```
* The [Configurations](/api-reference/configurations/get-configurations-service-status) and [ZooKeeper Import/Export](/api-reference/zookeeper/get-zookeeper-data) APIs are now accessible only to authorized users from within your Fusion cluster or through Kubernetes port forwarding.
* The API Gateway now includes an optional Kubernetes health check. To enable this check, edit your `values.yaml` file, and add `-Dspring.cloud.kubernetes.loadbalancer.mode=POD` to the API Gateway’s `javaToolOptions`. For example:
```yaml theme={"dark"}
fusion:
api-gateway:
javaToolOptions: "-Dspring.cloud.kubernetes.loadbalancer.mode=POD"
```
When enabled, if the health check fails during pod discovery, Kubernetes will restart the pod.
## Known issues
* Saving large query pipelines may cause OOM failures under high load.\
In Fusion versions 5.9.9 through 5.9.13, saving a large query pipeline during high query volume can result in thread lock, excessive memory use, and eventual OOM errors in the Query service.\
This issue is fixed in Fusion 5.9.14.
* An issue prevents segment-based rule filtering from working correctly in Commerce Studio. This issue is fixed in Fusion 5.9.12.
* After upgrading, the `config-sync` pod sometimes fails due to authorization errors. If this pod is not required by your setup, you can disable it by setting the `enabled` flag to `false` in your Helm chart configuration, saving the configuration, and rerunning the upgrade script.
```yaml theme={"dark"}
fusion-config-sync:
enabled: false
```
* Jobs or pipelines that serialize or deserialize `JSONResponse` objects may fail with an error of `Cannot instantiate class java.util.Collections$SingletonMap with Kryo`.\
The issue was fixed in Fusion 5.9.10 and backported into Fusion 5.9.9.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
As part of our ongoing initiative to replace our V1 (Classic) connectors with our more secure, flexible, and scalable V2 (Plugin) connectors, the following V1 connectors are deprecated in this release:
* [Windows Share SMB 2/3 V1](/docs/fusion-connectors/connectors/v1/windows-share-smb-2-3)
* [File Upload V1](/docs/fusion-connectors/connectors/v1/fileupload)
Learn more about [V1 and V2 connectors](/docs/fusion-connectors/concepts/v1-v2-connectors).
> [!CAUTION]
>
> **FAQ**
>
> How long will Lucidworks continue to support these connectors?
>
> These connectors will remain available for at least 6 months from the release of Fusion 5.9.9 and will be removed in a release after this 6-month period.
To prepare for the eventual removal of these connectors in a future release, Lucidworks strongly recommends beginning the migration of your datasources to the following V2 connectors:
* [Windows Share SMB 2/3 V2](/docs/fusion-connectors/connectors/windows-share-smb-2-3-v2)
* [File Upload V2](/docs/fusion-connectors/connectors/fileupload-v2)
## Removals
### Bitnami removal
Fusion 5.9.8 will be re-released with the same functionality but updated image references.
In the meantime, Lucidworks will self-host the required images while we work to replace Bitnami images with internally built open-source alternatives.
If you are a self-hosted Fusion customer, *you must upgrade before August 28* to ensure continued access to container images and prevent deployment issues.
You can reinstall your current version of Fusion or upgrade to Fusion 5.9.14, which includes the updated Helm chart and prepares your environment for long-term compatibility.
See [Prevent image pull failures due to Bitnami deprecation in Fusion 5.9.5 to 5.9.13](https://support.lucidworks.com/hc/en-us/articles/33966125467799-Prevent-image-pull-failures-due-to-Bitnami-deprecation-in-Fusion-5-9-5-to-5-9-13) for more information on how to prevent image pull failures.
## Platform support and component versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.29, 1.30
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.29, 1.30
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.29, 1.30
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.29, 1.30. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.9.9 *(based on Solr 9.6.1)* |
| **ZooKeeper** | 3.9.1 |
| **Spark** | 3.2.2 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
# Fusion 5.10.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/more/5.10.0-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.10.0-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.10.0-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/ce6szc
Released on September 28, 2023, this [rapid release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#rapid-release-support-policy) includes new features and improvements, including Adobe Experience Manager (AEM) V2 connector, updates to Solr and Consumption Dashboard, and new user roles.
To learn more, skip to the [release notes](#new-features).
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.25 and 1.26
* **Microsoft Azure Kubernetes Service (AKS):** 1.25 and 1.26
* **Amazon Elastic Kubernetes Service (EKS):** 1.25 and 1.26
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.25 and 1.26. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.10.0 *(based on Solr 9.3.0)* |
| **ZooKeeper** | 3.8.1 |
| **Spark** | 3.4.1 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## New Features
### Fusion Connectors
* The new Adobe Experience Manager (AEM) V2 connector has been added alongside the Fusion 5.10.0 release. The AEM V2 connector is compatible with Fusion 5.5.1 and later and works with AEM version 6.5. For more information, including configuration details, see [AEM V2 Connector Configuration Reference](/docs/fusion-connectors/connectors/aem).
## Improvements
### Fusion
* Solr has been upgraded to 9.3.
* The consumption dashboard now features a summary section that displays your total entitlements, requests, and records. You can also view your usage over your contract year.
* New user roles for Fusion have been created to enhance security. Each of these roles should be combined with the developer role in order to work.
* The spark-developer role can create, edit, and delete Spark jobs.
* The script-developer role can create, modify, and delete JavaScript code in the querying and indexing pipelines.
* The stage-plugin-developer role can create, edit, and delete custom index and query pipeline stages.
* The GraalVM JavaScript stage has been added to the index and query pipelines. It is available in Nashorn compatibility mode, but full backwards compatibility is not available. The Nashorn JavaScript library is still the default option. To use the GraalVM library, select **GraalVM** from the Javascript engine dropdown in the Fusion UI.\
This is an experimental feature and should not be used in production. Remote calls to other services are not available.
* The [Graph Security Trimming stage](/docs/5/fusion/reference/config-ref/pipeline-stages/query-stages/security-trimming-graph-query-stage) has new default values for `aclSolrCollection`, `joinField`, and `joinMethod`. Previously deprecated fields `crossCollection` and `dvWithScore` are removed.
* Lucidworks Search only: The reverse search saved-query stage now removes any `partition_filter` fields from saved query documents that consist of the empty string.
## Bug Fixes
* Fixed a bug where a non-admin user with the proper permissions could not type in the pipeline configuration source code editor.
* Fixed a bug where the Context object used when posting each document in an array to an index pipeline was the same object.
* Fixed a bug where asynchronous parsing was unable to push documents to Kafka when TLS is enabled.
## Deprecations
* MLeap support has been deprecated. MLeap was used for machine learning tasks in Fusion, including SpaCy and SparkNLP deployments and certain ML models. Instead, refer to the **Develop and Deploy a Machine Learning Model** guide.
> **Develop and Deploy a Machine Learning Model**
>
> This tutorial walks you through deploying your own model to Fusion with Seldon Core.
>
> ## Prerequisites
>
> * A Fusion instance with an app and indexed data
> * An understanding of Python and the ability to write Python code
> * [Docker](https://docs.docker.com/get-docker/) installed locally, plus a private or public Docker repository
> * Seldon-core installed locally: `pip install seldon-core`
> * Code editor; you can use any editor, but Visual Studio Code is used in the example
> * Model: [paraphrase-multilingual-MiniLM-L12-v2 from Hugging Face](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2)
> * Docker image: [example\_sbert\_model](https://hub.docker.com/r/jstrmec/example_sbert_model/)
>
> ## Tips
>
> * Always test your Python code locally before uploading to Docker and then Fusion.
> This simplifies troubleshooting significantly.
>
> * Once you’ve created your Docker you can also test locally by doing `docker run` with a specified port, like 9000, which you can then `curl` to confirm functionality in Fusion.
> See the testing example below.
>
> > **[Intro to Machine Learning in Fusion](https://academy.lucidworks.com/intro-to-machine-learning-in-fusion)**
> >
> > The course for **Intro to Machine Learning in Fusion** focuses on using machine learning to infer the goals of customers and users in order to deliver a more sophisticated search experience.
>
> ## Local testing example
>
> The examples in this section use the following models:
>
> * [multilingual miniLM model](https://colab.research.google.com/drive/1LeCGl57_Evn_PCL25NJAt1MzP6GYH4j2)
>
> * [e5-model](https://colab.research.google.com/drive/15WOHqqMBng5abUsWJYdElxgVLdAoJdn2)
>
> 1. Docker command:
> ```bash theme={"dark"}
> docker run -p 127.0.0.1:9000:9000
> ```
> 2. Curl to hit Docker:
> ```bash theme={"dark"}
> curl -X POST -H 'Content-Type: application/json' -d '{"data": { "ndarray": ["Sentence to test"], "names":["text"]} }' https://localhost:9000/api/v1.0/predictions
> ```
> 3. Curl model in Fusion:
> ```bash theme={"dark"}
> curl -u $FUSION_USER:$FUSION_PASSWORD -X POST -H 'Content-Type: application/json' -d '{"text": "i love fusion"}' https://.lucidworks.com:6764/api/ai/ml-models//prediction
> ```
> 4. See all your deployed models:
> ```bash theme={"dark"}
> curl -u USERNAME:PASSWORD http://FUSION_HOST:FUSION_PORT/api/ai/ml-models
> ```
>
> ## Download the model
>
> This tutorial uses the [paraphrase-multilingual-MiniLM-L12-v2](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) model from Hugging Face, but any pre-trained model from [https://huggingface.co](https://huggingface.co) will work with this tutorial.
>
> If you want to use your own model instead, you can do so, but your model must have been trained and then saved though a function similar to the PyTorch’s `torch.save(model, PATH)` function.
> See [Saving and Loading Models](https://pytorch.org/tutorials/beginner/saving_loading_models.html) in the PyTorch documentation.
>
> ## Format a Python class
>
> The next step is to format a Python class which will be invoked by Fusion to get the results from your model.
> The skeleton below represents the format that you should follow.
> See also [Packaging a Python model for Seldon Core using Docker](https://docs.seldon.ai/seldon-core-1/configuration/wrappers-and-sdks/python-language-wrapper/python_wrapping_docker) in the Seldon Core documentation.
>
> ```python wrap expandable theme={"dark"}
> class MyModel(object):
> """
> Model template. You can load your model parameters in __init__ from a
> location accessible at runtime
> """
>
> def __init__(self):
> """
> Add any initialization parameters. These will be passed at runtime
> from the graph definition parameters defined in your seldondeployment
> kubernetes resource manifest.
> """
> print("Initializing")
>
> def predict(self,X,features_names,**kwargs):
> """
> Return a prediction.
>
> Parameters
> ----------
> X : array-like
> feature_names : array of feature names (optional)
> """
> print("Predict called - will run identity function")
> return X
>
> def class_names(self):
> return ["X_name"]
> ```
>
> A real instance of this class with the Paraphrase Multilingual MiniLM L12 v2 model is as follows:
>
> ```python wrap expandable theme={"dark"}
> import logging
> import os
>
> from transformers import AutoTokenizer, AutoModel
> from torch.nn import functional as F
> from typing import Iterable
> import numpy as np
> import torch
>
> log = logging.getLogger()
>
> class mini():
> def __init__(self):
> self.tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
> self.model= AutoModel.from_pretrained('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
>
> #Mean Pooling
> def mean_pooling(self, model_output, attention_mask):
> token_embeddings = model_output[0] #First element of model_output contains all token embeddings
> input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
> return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
>
> def predict(self, X:np.ndarray, names=None, **kwargs):
> # In Fusion there are several variables passed in the numpy array with the Milvus Query stage,
> # Encode to Milvus index stage, and Vectorize Seldon index and query stage:
> # [pipeline, bool, and text]. Text is what variable will be encoded, so that is what will be set to 'text'
> # When using the Machine Learning stage, the input map keys should match what what is in this file.
>
> model_input = dict(zip(names, X))
> text = model_input["text"]
>
> with torch.inference_mode(): # Allows torch to run more quickly
> # Tokenize sentences
> encoded_input = self.tokenizer(text, padding=True, truncation=True, return_tensors='pt')
> log.debug('encoded input',str(encoded_input))
> model_output = self.model(**encoded_input)
> log.debug('model output',str(model_output))
>
> # Perform pooling. In this case, max pooling.
> sentence_embeddings = self.mean_pooling(model_output, encoded_input['attention_mask'])
> # Normalize embeddings, because Fusion likes it that way.
> sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=-1)
> # Fixing the shape of the emebbedings to match (1, 384).
> final = [sentence_embeddings.squeeze().cpu().detach().numpy().tolist()]
> return final
>
> def class_names(self) -> Iterable[str]:
> return ["vector"]
> ```
>
> In the above code, an additional function has been added in the class; this is completely fine to do.
> Logging has also been added for debugging purposes.
>
> Two functions are non-negotiable:
>
> * `init`: The `init` function is where models, tokenizers, vectorizers, and the like should be set to self for invoking.\
> It is recommended that you include your model’s trained parameters directly into the Docker container rather than reaching out to external storage inside `init`.
>
> * `predict`: The `predict` function processes the field or query that Fusion passes to the model.\
> The `predict` function must be able to handle any text processing needed for the model to accept input invoked in its `model.evaluate()`, `model.predict()`, or equivalent function to get the expected model result.
>
> If the output needs additional manipulation, that should be done before the result is returned.\
> For embedding models the return value must have the shape of (1, DIM), where DIM (dimension) is a consistent integer, to enable Fusion to handle the vector encoding into Milvus or Solr.
>
> > [!NOTE]
> >
> > Use the *exact* name of the class when naming this file.
>
> For the example, above the Python file is named `mini.py` and the class name is `mini()`.
>
> ## Create a Dockerfile
>
> The next step is to create a Dockerfile. The Dockerfile should follow this general outline; read the comments for additional details:
>
> ```dockerfile wrap expandable theme={"dark"}
> #It is important that python version is 3.x-slim for seldon-core
> FROM python:3.10-slim
> # Whatever directory(folder)the python file for your python class, Dockerfile, and
> # requirements.txt is in should be copied then denoted as the work directory.
> COPY . /app
> WORKDIR /app
>
> # The requirements file for the Docker container
> COPY requirements.txt requirements.txt
> RUN pip install --upgrade pip && pip install --no-cache-dir -r requirements.txt
>
> # Copy source code
> COPY . .
>
> # GRPC - Allows Fusion to do a Remote Procedure Call
> EXPOSE 5000
>
> # Define environment variable for seldon-core
> # !!!MODEL_NAME must be the EXACT same as the python file & python class name!!!
> ENV MODEL_NAME=mini
> ENV SERVICE_TYPE=MODEL
> ENV PERSISTENCE=0
>
> # Changing active directory folder (same one as above on lines 5 & 6) to default user, required for Fusion
> RUN chown -R 8888 /app
>
> # Command to wrap python class with seldon-core to allow it to be usable in Fusion
> CMD ["sh", "-c", "seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE --persistence $PERSISTENCE"]
>
> # You can use the following if You need shell features like environment variable expansion or
> # You need to use shell constructs like pipes, redirects, etc.
> # See https://docs.docker.com/reference/dockerfile/#cmd for more details.
> # CMD exec seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE --persistence $PERSISTENCE
> ```
>
> ## Create a requirements file
>
> The `requirements.txt` file is a list of installs for the `Dockerfile` to run to ensure the Docker container has the right resources to run the model.\
> For the Paraphrase Multilingual MiniLM L12 v2 model, the requirements are as follows:
>
> ```text theme={"dark"}
> seldon-core
> torch
> transformers
> numpy
> ```
>
> In general, if an item was used in an `import` statement in your Python file, it should be included in the requirements file.
>
> An easy way to populate the requirements is by using in the following command in the terminal, inside the directory that contains your code:
>
> ```bash theme={"dark"}
> pip freeze > requirements.txt
> ```
>
> > [!NOTE]
> >
> > If you use `pip freeze`, you must manually add `seldon-core` to the requirements file because it is not invoked in the Python file but is required for containerization.
>
> ## Build and push the Docker image
>
> After creating the `.py`, `Dockerfile`, and `requirements.txt` files, you need to run a few Docker commands.
> Run the commands below in order:
>
> ```bash theme={"dark"}
> DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build . -t [DOCKERHUB-USERNAME]/[REPOSITORY]:[VERSION-TAG]
> ```
>
> ```bash theme={"dark"}
> docker push [DOCKERHUB USERNAME]/[REPOSITORY]:[VERSION-TAG]
> ```
>
> Using the example model, the terminal commands would be as follows:
>
> ```bash theme={"dark"}
> DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build . -t jstrmec/example_sbert_model:0.14; docker push jstrmec/example_sbert_model:0.14
> ```
>
> This repository is public and you can visit it here: [example\_sbert\_model](https://hub.docker.com/r/jstrmec/example_sbert_model/)
>
> ## Deploy the model in Fusion
>
> Now you can go to Fusion to deploy your model.
>
> 1. In Fusion, navigate to **Collections** > **Jobs**.
> 2. Add a job by clicking the **Add+** Button and selecting **Create Seldon Core Model Deployment**.
> 3. Fill in each of the text fields:
>
> 
>
> | Parameter | Description |
> | - | - |
> | Job ID | A string used by the Fusion API to reference the job after its creation. |
> | Model name | A name for the deployed model. This is used to generate the deployment name in Seldon Core. It is also the name that you reference as a `model-id` when making predictions with the ML Service. |
> | Model replicas | The number of load-balanced replicas of the model to deploy; specify multiple replicas for a higher-volume intake. |
> | Docker Repository | The public or private repository where the Docker image is located. If you’re using Docker Hub, fill in the Docker Hub username here. |
> | Image name | The name of the image with an optional tag. If no tag is given, `latest` is used. |
> | Kubernetes secret | If you’re using a private repository, supply the name of the Kubernetes secret used for access. |
> | Output columns | A list of column names that the model’s `predict` method returns. |
> 4. Click **Save**, then **Run** and **Start**.
>
> 
>
> When the job finishes successfully, you can proceed to the next section.
>
> Now that the model is in Fusion, it can be utilized in either index or query pipelines, depending on the model’s purpose.
> In this case the model is a word vectorizer or semantic vector search implementation, so both pipelines must invoke the model.
>
> ## Apply an API key to the deployment
>
> These steps are only needed if your model utilizes any kind of secret, such as an API key.
> If not, skip this section and proceed to the next.
>
> 1. Create and modify a `_sdep.yaml` file.\
> In the first line, `kubectl get sdep` gets the details for the currently running Seldon Deployment job and saves those details to a YAML file. `kubectl apply -f open_sdep.yaml` adds the key to the Seldon Deployment job the next time it launches.
> ```yaml theme={"dark"}
> kubectl get sdep -o yaml > _sdep.yaml
> # Modify _sdep.yaml to add
> - env:
> - name: API_KEY
> value: "your-api-key-here"
> kubectl apply -f _sdep.yaml
> ```
> 2. Delete `sdep` before redeploying the model. The currently running Seldon Deployment job does not have the key applied to it. Delete it before redeploying and the new job will have the key.
> ```bash theme={"dark"}
> kubectl delete sdep
> ```
> 3. Lastly, you can [encode into Milvus](/docs/5/fusion/intro/fusion-stack/milvus).
>
> ## Create a Milvus collection
>
> 1. In Fusion, navigate to **Collections** > **Jobs**.
> 2. Click the **Add+** Button and select **Create Collections in Milvus**.\
> This job creates a collection in Milvus for storing the vectors sent to it.
> The job is needed because a collection does not automatically spawn at indexing or query time if it does not already exist.
> 3. Name the job and the collection.
> 4. Click **Add** on the right side of the job panel.\
> The key to creating the collection is the **Dimension** text field; this must exactly match the shape value your output prediction has.\
> In our example the shape is (1,384), so 384 will be in the collections **Dimension** field:
>
> 
>
> The **Metric** field should typically be left at the default of `Inner Product`, but this also depends on use case and model type.
> 5. Click **Save**, then **Run** and **Start**.
>
> ## Configure the Fusion pipelines
>
> Your real-world pipeline configuration depends on your use case and model, but for our example we will configure the index pipeline and then the query pipeline.
>
> **Configure the index pipeline**
>
> 1. Create a new index pipeline or load an existing one for editing.
> 2. Click **Add a Stage** and then **Encode to Milvus**.
> 3. In the new stage, fill in these fields:
> * The name of your model
> * The output name you have for your model job
> * The field you’d like to encode
> * The collection name
> 4. Save the stage in the pipeline and index your data with it.
>
> **Configure the query pipeline**
>
> 1. Create a new query pipeline or load an existing one for editing.
> 2. Click **Add a Stage** and then **Milvus Query**.
> 3. Fill in the configuration fields, then save the stage.
> 4. Add a **Milvus Ensemble Query** stage.\
> This stage is necessary to have the Milvus collection scores taken into account in ranking and to weight multiple collections.
> The **Milvus Results Context Key** from the Milvus Query Stage is used in this stage to preform math on the Milvus result scores.
> One (1) is a typical multiplier for the Milvus results but any number can be used.
> 5. Save the stage and then run a query by typing a search term.
> 6. To verify the Milvus results are correct, use the **Compare+** button to see another pipeline without the model implementation and compare the number of results.
>
> You have now successfully uploaded a Seldon Core model to Fusion and deployed it.
## Removals
For full details on removals, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
* The Forked Apache Tika parser stage has been removed. Use [asynchronous Tika parsing](/docs/5/fusion/getting-data-in/indexing/asynchronous-tika-parsing) instead.
* The Analytics Catalog query stage has been removed.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.11.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/more/5.11.0-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.11.0-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.11.0-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/dmayvi
Released on January 3, 2024, this [rapid release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#rapid-release-support-policy) includes new features and improvements, including the App Manager API that generates information for Consumption Dashboard and updates to Solr and Kubernetes.
To learn more, skip to the [release notes](#new-features).
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.27
* **Microsoft Azure Kubernetes Service (AKS):** 1.27
* **Amazon Elastic Kubernetes Service (EKS):** 1.27
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.27. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
## Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.11.0 *(based on Solr 9.4.0)* |
| **ZooKeeper** | 3.9.0 |
| **Spark** | 3.4.1 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
**More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).**
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## New Features
### Fusion
* The [App Manager API](/api-reference/license/get-the-fusion-license) provides programmatic access to information about your Fusion license, entitlements, and usage data. This data is also used to generate usage statistics in the [Consumption Dashboard](/docs/5/fusion/operations/monitoring-and-reporting/consumption).
For example, send a request to the `/apps-manager/entitlements/current` endpoint to retrieve general entitlements usage data:
**Input**
```bash wrap theme={"dark"}
curl -u USERNAME:PASSWORD https://FUSION_HOST:FUSION_PORT/apps-manager/entitlements/current
```
**Output**
```json theme={"dark"}
{
"contractDuration":{
"years":3,
"months":0,
"days":0
},
"info":{
"start":"2022-12-23",
"end":"2023-12-23",
"requests":10000000,
"records":5000000
},
"usage":{
"requests":2863,
"requestsPercentage":0,
"records":565672,
"recordsPercentage":11
}
}
```
## Improvements
### Fusion
* Solr has been upgraded to 9.4. For details about changes in Solr 9.4, see [Apache Solr Release Notes](https://solr.apache.org/guide/solr/latest/upgrade-notes/major-changes-in-solr-9.html#solr-9-4).
* Fusion now supports Kubernetes 1.27. This applies to GKE, AKS, and EKS. It also applies to Rancher (RKE) and OpenShift 4 versions that are compatible with Kubernetes 1.27. Refer to Kubernetes documentation at [Kubernetes v1.27](https://kubernetes.io/blog/2023/04/11/kubernetes-v1-27-release/) for more information.
* Fusion safeguards against indexing overload with an ingestion flow control system. This system prevents timeouts by:
* Logging all Kafka topics used for indexing to aid in diagnosing performance issues.
* Monitoring the rate of data production and consumption for each Kafka topic across all indexing jobs.
* Automatically throttling producers to ensure consumers can keep up.
* The [Consumption Dashboard](/docs/5/fusion/operations/monitoring-and-reporting/consumption) has been updated to restore three charts.
* The Fusion UI is updated with improved messaging around Fusion license renewal and expiration dates.\
License details

License expiration notice

* The Fusion API Gateway now includes an optional Kubernetes health check. To enable this check, edit your `values.yaml` file, and add `-Dspring.cloud.kubernetes.loadbalancer.mode=POD` to the API Gateway’s `javaToolOptions`. For example:
```yaml theme={"dark"}
fusion:
api-gateway:
javaToolOptions: "-Dspring.cloud.kubernetes.loadbalancer.mode=POD"
```
When enabled, if the health check fails during pod discovery, Kubernetes will restart the pod.
* The fusion-solr Helm chart now accepts user-defined system properties that are set in `values.yaml`. In the `values.yaml` file, populate the `solrEnvExtra` array with entries for each desired variable. Each variable requires a name and either a direct value or a value source (`valueFrom`). These variables will be included in the final configuration in the order you provide them, following any variables dynamically generated by the Helm chart templates. For more information on Kubernetes environment variables, see [Define Dependent Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-interdependent-environment-variables/).
* The Fusion migration script is updated to align with changes from the Solr upgrade. The migration script:
* Removes the unused configuration, ``, from `solrconfig.xml`. Solr no longer supports this configuration.
* Detects if `StatelessScriptUpdateProcessorFactory` is found in `solrconfig.xml`. The migration script will update the configuration, if possible, and provide guidance on actions you must take.
## Fusion connectors
* The default number of fetch threads for V2 connectors is now 5. Previously, the default was 20. This default setting was reduced because some Fusion environments experienced failed datasource crawls as a result of too many requests in a short period of time.
## Bug Fixes
* The [Configurations](/api-reference/configurations/get-configurations-service-status) and [ZooKeeper Import/Export](/api-reference/zookeeper/get-zookeeper-data) APIs are now accessible only to authorized users from within your Fusion cluster or through Kubernetes port forwarding.
* The Fusion API realm can now authenticate when an API key is passed via an `apiKey` query parameter. Previously, this only worked via the `x-api-key` header.
* The ZooKeeper Docker image is updated to use [Logback](https://logback.qos.ch/) for logging instead of log4j. This change fixes a bug that forced all Zookeeper log messages to use the DEBUG level.
* Fixed a bug that sometimes resulted in an HTTP 431 error when using the Fusion admin UI.
* Fixed a bug that sometimes resulted in an HTTP 414 error when using the Rules UI.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
* Fusion has deprecated the Webapps service. In previous versions of Fusion, you could use this service to deploy an App Studio WAR file into Fusion. As of Fusion 5.11.0, you should instead **Deploy App Studio Enterprise to a Fusion 5 Cluster (GKE)**.
> **Deploy App Studio Enterprise to a Fusion 5 Cluster (GKE)**
>
> This article explains how to deploy [App Studio Enterprise](/docs/5/fusion/dev-portal/appkit/concepts/app-studio-enterprise/overview) (ASE) to an existing Fusion 5 cluster in Google Kubernetes Engine (GKE) without using the Webapps service.
>
> Before completing this guide, ensure that your `fusion.conf` file points to the IP or URI and port of the proxy service.
>
> Run the App Studio Enterprise application locally and verify functioning security and search features with the cluster you are deploying to.
>
> ## Prepare the package
>
> 1. Package your app into a single JAR file:
>
> ```
> ./app-studio package
> ```
>
> 2. App Studio Enterprise includes a `dockerfile`. Create the App Studio Enterprise Docker image:
>
> ```
> docker build PATH -t APP_NAME
> ```
>
> Set or replace `APP_NAME` with the name of your application. Replace `PATH` with the path to build from.
>
> 3. You can test the Docker image locally with the following command:
>
> ```
> docker run -it -p LOCAL_PORT:8080 APP_NAME
> ```
>
> Set or replace `LOCAL_PORT` with the port on your local machine that can access the app. Replace `APP_NAME` with the ASE application name.
>
> ## Publish the image
>
> You can publish the Docker image anywhere that supports Docker images. This section explains how to publish a Docker image to Google Kubernetes Engine.
>
> 1. Tag your container for the registry:
>
> ```
> docker tag APP_NAME gcr.io/PROJECT_NAME/APP_NAME
> ```
> 2. Push your Docker image to the Google Container Registry:
>
> ```
> docker push gcr.io/PROJECT_NAME/APP_NAME
> ```
> 3. Verify the image:
>
> ```
> gcloud compute instances list
> ```
>
> ## Deploy the app to a cluster
>
> After publishing your ASE Docker image, deploy the image to a cluster. Your existing Fusion 5 cluster is a good choice.
>
> 1. Switch the context to your Fusion 5 cluster:
>
> ```
> gcloud container clusters get-credentials CLUSTER_NAME
> ```
>
> Replace `CLUSTER_NAME` with your existing Fusion 5 cluster’s name.
> 2. Create a deployment in your cluster using the image you published:
>
> ```
> kubectl create deployment APP_NAME --image=gcr.io/PROJECT_NAME/APP_NAME:latest
> ```
>
> ## Create an Ingress resource
>
> After deploying the app, create an Ingress resource for your ASE instance. If you require more Ingress rules, your Ingress resource will look different. Learn more about [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/).
>
> 1. Use the following command to create a minimal Ingress resource:
>
> ```
> cat < apiVersion: networking.k8s.io/v1beta1
> kind: Ingress
> metadata:
> name: ase-ingress
> spec:
> backend:
> serviceName: $AppName
> servicePort: 80
> EOF
> ```
> 2. Verify the Ingress resource:
>
> ```
> kubectl get ingress ase-ingress
> ```
## Removals
For full details on removals, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
* The previously non-functional Subscriptions UI has been removed. This is related to the removal of the [Subscriptions API](/docs/5/fusion/release-notes/more/5.6.0-release-notes) in Fusion 5.6.0.
* MLeap is removed from the ml-model service. MLeap was deprecated in Fusion 5.2.0 and was no longer used by Fusion.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.12.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/more/5.12.0-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.12.0-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.12.0-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/2sq5ks
Released on March 28, 2024, this [rapid release](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#rapid-release-support-policy) includes several new features, including the asynchronous parsing service and the JSON viewer, as well as key improvements to the datasource job history.
To learn more, skip to the [release notes](#new-features).
## Platform Support and Component Versions
### Kubernetes platform support
Lucidworks has tested and validated support for the following Kubernetes platforms and versions:
* **Google Kubernetes Engine (GKE):** 1.28, 1.27, and 1.26
* **Microsoft Azure Kubernetes Service (AKS):** 1.28, 1.27, and 1.26
* **Amazon Elastic Kubernetes Service (EKS):** 1.28, 1.27, and 1.26
Support is also offered for Rancher Kubernetes Engine (RKE) and OpenShift 4 versions that are based on Kubernetes 1.28, 1.27, and 1.26. OpenStack and customized Kubernetes installations are *not* supported.
For more information on Kubernetes version support, see the [Kubernetes support policy](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support).
### Component versions
The following table details the versions of key components that may be critical to deployments and upgrades.
| Component | Version |
| - | - |
| **Solr** | fusion-solr 5.12.0 *(based on Solr 9.4.0)* |
| **ZooKeeper** | 3.9.0 |
| **Spark** | 3.4.1 |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), and GKE Ingress Controller. Istio is not supported. |
For additional component information, see [Docker Images by Fusion Version](/docs/5/fusion/reference/docker-images-versions).
## New Features
### Fusion
#### JSON viewer for Fusion objects
A new JSON viewer has been introduced in Fusion, providing a user-friendly interface to inspect the JSON configuration of key objects like index pipelines, query pipelines, jobs, and datasources. This viewer allows users to:
* **Visualize configuration:** View the complete JSON representation of the selected object’s configuration in a clear and well-formatted manner. For example, a basic datasource configuration resembles the following:
```json theme={"dark"}
{
"id": "mens-products",
"created": "2024-02-12T15:08:29.332Z",
"modified": "2024-02-12T15:08:29.332Z",
"connector": "lucid.fileupload",
"type": "fileupload",
"pipeline": "Documentation",
"parserId": "_system",
"properties": {
"collection": "Documentation",
"fileId": "mens-products.csv",
"mediaType": "application/octet-stream"
}
}
```
* **Facilitate operations:** Easily copy the displayed JSON for use in essential activities such as API calls.
* **Download for reference:** Download the JSON configuration as a file for backup or collaboration.
To learn how to use the JSON viewer, see the following demonstration:
> **[JSON Viewer](https://academy.lucidworks.com/json-viewer)**
>
> The quick learning for **JSON Viewer** focuses on how to incorporate the JSON viewer into your daily workflow.
#### Asynchronous parsing service
An asynchronous parsing service for connectors, Apache Tika Container, has been added. This stage is now required when using asynchronous parsing for connectors.
To use asynchronous parsing for connectors, be sure that the **Async Parsing** is checked in the datasource and the Apache Tika Container parser stage is enabled in the index pipeline.
> [!NOTE]
>
> Other parsers, such as HTML and JSON, are now supported by the asynchronous parsing service. By enabling asynchronous parsing, the parser configuration linked to your datasource is used.
To learn how to start using the new asynchronous parsing service, see the following demonstration:
### Lucidworks Search
#### Cloud signal storage for Lucidworks Search
Lucidworks Search now offers the flexibility to store signals data in Google Cloud Storage or Amazon S3, providing an alternative to the default Solr storage. Cloud signal storage minimizes the storage burden on your Solr cluster, potentially leading to improved performance and resource optimization.

All signal types, including custom types, are fully supported for cloud storage. Additionally, customization of the default signal schema remains available. Signals data files are automatically compacted over time into larger files, resulting in significant storage space savings and simplified file management.
Cloud signal storage is enabled during initial deployment. For more information, see [Cloud signal storage for Lucidworks Search](/docs/lucidworks-search/07-improve-your-queries/signals/cloud-signal-storage-59).
## Improvements
* Introduced significant improvements to job status reporting within Fusion. A dedicated job function microservice, `job-config`, has been added to control job execution and store job history. This microservice requires no configuration from the client. In addition, to optimize communication efficiency, synchronous calls have been replaced with asynchronous communication through Kafka. As a result of these changes, job reports are now far more accurate and reliable than before.
> [!NOTE]
>
> These changes do not impact Fusion API usage or user workflows.
* Introduced a configurable timeout for datasource jobs, in case the connection to the backend job is lost. Previously, the job was stopped after a fixed duration of 100 seconds.
* Previously query pipeline pods could restart due to scaling or other reasons, leading to 503 errors in the API gateway. This release introduces a configurable retry setting for the api-gateway service that will automatically attempt to reconnect to the query pipeline pods. This addresses the previously observed 503 errors under sustained query load.
* Pre-packaged configurations for commonly used dimensionalities (64, 384, 512, and 768) in vector search operations within Solr are added to Fusion. These configurations leverage a naming convention that incorporates dimensionality into dynamic field names, simplifying setup and management for users. For example:
```xml theme={"dark"}
```
* Introduced automated management of Kafka topic partitions for indexing subscriptions within Fusion. Fusion now intelligently determines the optimal number of partitions, creates the topics with appropriate configurations, and initiates the subscription process.
## Bug Fixes
* Fixed a bug that prevented remote connector datasources from indexing data after encountering a "No Plugin Activity" error. Previously, affected datasources required recreation with a different name despite maintaining identical specifications.
* Fixed a bug that caused a Solr syntax error when attempting to delete an aclDocument using the SDK method `newDeleteGraphAccessControlItem` if the ID of the document contained special characters.
* Fixed a bug that sometimes resulted in a `ConcurrentModificationException` error during high-load testing of query pipelines utilizing Solr Subquery and Merge Async Results stages.
* Addressed a race condition impacting dynamic pricing functionality. Previously, concurrent user requests for the same external file could lead to the second request encountering an error. The fix ensures proper handling of concurrent requests, eliminating the potential for this error.
* Fixed a bug that caused a `ConcurrentModificationException` error during the `.RawPull` replication process within Solr.
* Fixed a bug in the UI login process where attempting to log in with an incorrect password after an expired session resulted in no error message being displayed on the UI.
## Deprecations
For full details on deprecations, see [Deprecations and Removals](/docs/5/fusion/deprecations-and-removals).
### V1 Fusion connectors
In Fusion 5.12.0, all V1 connectors are deprecated. This means they are no longer being actively developed and will be removed in the next major release, Fusion 6.
* **Some V1 connectors already have a direct replacement available.** You can find the replacement connector on the [Fusion Connectors Deprecations and Removals page](/docs/fusion-connectors/deprecations-and-removals).
* **For all other V1 connectors, a replacement is still under development.** The documentation is updated when the replacement is available.
If you are using a V1 connector, you must migrate to the replacement connector or a supported alternative before upgrading to Fusion 6. Migrate to the replacement connector as soon as possible to avoid any disruption to your workflows.
### Banana dashboards
Banana, the open source browser visualization tool that previously powered Fusion’s Banana Dashboards, is deprecated for Fusion. It is scheduled for removal in Fusion 5.13.0. While Banana will no longer be included with Fusion, users who require continued use can leverage a separate Docker deployment option. This alternative deployment method will be available in Fusion 5.13.0.
If you would like to explore the open source project, see [Banana on GitHub](https://github.com/lucidworks/banana).
### Other deprecations
* App Insights and the insights microservice are deprecated and will be removed in a future release.
* The Parsers CRUD API from the indexing service is deprecated and will be removed in a future release. Use `/async-parsing/` instead.
* The Train a Smart Answers cold start model job is deprecated and will be removed in a future release. Use one of the pre-trained models or the supervised training job instead.
* The Data Augmentation job is deprecated and will be removed in a future release.
## Known issues
* New Kerberos security realms cannot be configured successfully in this version of Fusion.
# Fusion 5.5.0
Source: https://doc.lucidworks.com/docs/5/fusion/release-notes/more/5.5.0-release-notes
[localhost link]: http://localhost:3000/docs/5/fusion/release-notes/5.5.0-release-notes
[mintlify link]: https://doc.lucidworks.com/docs/5/fusion/release-notes/5.5.0-release-notes
[old doc.lw link]: https://doc.lucidworks.com/fusion/5.9/301ya6
**Release date:** March 18, 2022
**Component versions:**
| Component | Version |
| - | - |
| **Solr** | 8.11.1 |
| **ZooKeeper** | 3.6.2 |
| **Spark** | 2.4.5 |
| **Kubernetes** | GKE, AKS, EKS 1.22 Rancher (RKE) and OpenShift 4 compatible with Kubernetes 1.22 OpenStack and customized Kubernetes installs not supported. See [Kubernetes support](/docs/policies/lifecycle-policies/lw-version-support-lifecycle#kubernetes-support) for end of support dates. |
| **Ingress Controllers** | Nginx, Ambassador (Envoy), GKE Ingress Controller Istio not supported. |
More information about support dates can be found at [Lucidworks Fusion Product Lifecycle](/docs/policies/lifecycle-policies/lw-version-support-lifecycle).
> [!TIP]
>
> **Looking to upgrade?**
>
> See [Fusion 5 Upgrades](/docs/5/fusion/operations/fusion-5-upgrades) for detailed instructions.
## Improvements
* Fusion 5.5 adds support for Rancher. See **Deploy Fusion 5 on Other Kubernetes Platforms** for more information.
> **Deploy Fusion 5 on Other Kubernetes Platforms**
>
> The [`setup_f5_k8s.sh` script](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_k8s.sh) in the [`fusion-cloud-native`](https://github.com/lucidworks/fusion-cloud-native) repository provides deployment support for any Kubernetes platform, including on-premise, private cloud, public cloud, and hybrid platforms.
>
> This script is used by the [`setup_f5_gke.sh`](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_gke.sh), [`setup_f5_eks.sh`](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_eks.sh), and [`setup_f5_aks.sh`](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_aks.sh) scripts, which provide additional platform-specific support for Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS), and Azure Kubernetes Service (AKS).
>
> This topic explains how to deploy a Fusion cluster in Kubernetes using the [`setup_f5_k8s.sh` script](https://github.com/lucidworks/fusion-cloud-native/blob/master/setup_f5_k8s.sh) in the [`fusion-cloud-native`](https://github.com/lucidworks/fusion-cloud-native) repository.
>
> If you’re deploying on-premises or using a localized repository, you’ll need to use a private repository for Docker images.
>
> ## Prerequisites
>
> This section covers prerequisites and background knowledge needed to help you understand the structure of this document and how the Fusion installation process works with Kubernetes.
>
> ### Release Name and Namespace
>
> Before installing Fusion, you need to choose a [https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) Kubernetes namespace to install Fusion into.
> Think of a K8s namespace as a virtual cluster within a physical cluster. You can install multiple instances of Fusion in the same cluster *in separate namespaces*.
> However, please *do not* install more than one Fusion release in the same namespace.
>
> > [!NOTE]
> >
> > All Fusion services must run in the same namespace, i.e. you should not try to split a Fusion cluster across multiple namespaces.\_\_
>
> Use a short name for the namespace, containing only letters, digits, or dashes (no dots or underscores). The setup scripts in this repo use the namespace for the Helm release name by default.
>
> ### Install Helm
>
> Helm is a package manager for Kubernetes that helps you install and manage applications on your Kubernetes cluster.
> Regardless of which Kubernetes platform you're using, you need to install *`helm`* as it is required to install Fusion for any K8s platform.
> On MacOS, you can do:
>
> ```bash theme={"dark"}
> brew install kubernetes-helm
> ```
>
> If you already have helm installed, make sure you're using the latest version:
>
> ```bash theme={"dark"}
> brew upgrade kubernetes-helm
> ```
>
> For other OS, please refer to the Helm installation docs: [https://helm.sh/docs/using\_helm/](https://helm.sh/docs/using_helm/)
>
> The Fusion helm chart requires that helm is greater than version `3.0.0`; check your Helm version by running `helm version --short`.
>
> #### Helm User Permissions
>
> If you require that fusion is installed by a user with minimal permissions, instead of an admin user, then the role and cluster role that will have to be assigned to the user within the namespace that you wish to install fusion in are documented in the `install-roles` directory.
>
> > [!NOTE]
> >
> > When working with Kubernetes on the command-line, it's useful to create a shell alias for `kubectl`, e.g.:
> >
> > ```bash theme={"dark"}
> > alias k=kubectl
> > ```
>
> To use these role in a cluster, as an admin user first create the namespace that you wish to install fusion into:
>
> ```bash theme={"dark"}
> k create namespace fusion-namespace
> ```
>
> Apply the `role.yaml` and `cluster-role.yaml` files to that namespace
>
> ```bash theme={"dark"}
> k apply -f cluster-role.yaml
> k config set-context --current --namespace=$NAMESPACE
> k apply -f role.yaml
> ```
>
> Then bind the rolebinding and clusterolebinding to the install user:
>
> ```bash wrap theme={"dark"}
> k create --namespace fusion-namespace rolebinding fusion-install-rolebinding --role fusion-installer --user
> k create clusterrolebinding fusion-install-rolebinding --clusterrole fusion-installer --user
> ```
>
> You will then be able to run the `helm install` command as the ``
>
> ### Clone fusion-cloud-native from GitHub
>
> You should clone this repo from github as you'll need to run the scripts on your local workstation:
>
> ```bash theme={"dark"}
> git clone https://github.com/lucidworks/fusion-cloud-native.git
> ```
>
> You should get into the habit of pulling this repo for the latest changes before performing any maintenance operations on your Fusion cluster to ensure you have the latest updates to the scripts.
>
> ```bash theme={"dark"}
> cd fusion-cloud-native
> git pull
> ```
>
> Cloning the github repo is preferred so that you can pull in updates to the scripts, but if you are not a git user, then you can download the project: [https://github.com/lucidworks/fusion-cloud-native/archive/master.zip](https://github.com/lucidworks/fusion-cloud-native/archive/master.zip).
> Once downloaded, extract the zip and cd into the `fusion-cloud-native-master` directory.
>
> ## Deployment
>
> If you're not running on a managed K8s platform like GKE, AKS, or EKS, you can use Helm to install the Fusion chart to an existing Kubernetes cluster.
>
> Fusion version 5.5 now includes support for the Rancher Kubernetes Engine (RKE) platform. Before deploying Fusion to RKE, you must download and install the [latest RKE software](https://rancher.com/docs/rke/latest/en/). After configuring your cluster, you can proceed with the Helm v3 installation.
>
> > [!NOTE]
> >
> > You must have a working cluster configured before performing the Helm v3 installation.
>
> ### Use Helm v3 to Install Fusion
>
> You should upgrade to the latest version of Helm v3 for working with Fusion. If you need to keep Helm V2 for other clusters,
> ensure Helm V3 is ahead of Helm V2 in your working shell's PATH before proceeding.
>
> #### Customize Fusion Chart Settings
>
> Fusion aims to be well-configured out-of-the-box, but you can customize any of the built-in settings using a custom values `YAML` file. If you use one of our setup scripts, such as `setup_f5_gke.sh`, then it will create a custom values YAML file for you the first time you run it using [https://github.com/lucidworks/fusion-cloud-native/blob/master/customize\_fusion\_values.yaml.example](https://github.com/lucidworks/fusion-cloud-native/blob/master/customize_fusion_values.yaml.example) as a template.
>
> If you're working with Helm directly and not using one of our setup scripts, then run the [https://github.com/lucidworks/fusion-cloud-native/blob/master/customize\_fusion\_values.sh](https://github.com/lucidworks/fusion-cloud-native/blob/master/customize_fusion_values.sh) script to create a custom values YAML file from our [https://github.com/lucidworks/fusion-cloud-native/blob/master/customize\_fusion\_values.yaml.example](https://github.com/lucidworks/fusion-cloud-native/blob/master/customize_fusion_values.yaml.example) template as a starting point:
>
> ```bash theme={"dark"}
> ./customize_fusion_values.sh -c -n \
> --provider --num-solr 1 --node-pool ""
> ```
>
> > [!NOTE]
> >
> > Pass `--help` for usage details.
>
> In this example:
>
> * `` is the K8s platform you're running on, such as `gke`
>
> * `` is the name of your cluster
>
> * `` is the K8s namespace where you plan to install Fusion
>
> > [!NOTE]
> >
> > The `--node-pool` option specifies the node selector label for determining which nodes to run Fusion pods. You can pass `"{}"` to let Kubernetes decide which nodes to schedule pods on.
>
> This file is referred to as `${MY_VALUES}` in the commands belo. Replace the filename with the correct filename for your environment. Keep this file handy, as you'll need it to customize Fusion settings and upgrade to a newer version.
>
> Review the settings in the custom values YAML file to ensure the defaults are appropriate for your environment, including the number of Solr and Zookeeper replicas.
>
> Add the Lucidworks Helm repo:
>
> ```bash theme={"dark"}
> helm repo add lucidworks https://charts.lucidworks.com
> ```
>
> The `customize_fusion_values.sh` script creates an upgrade script to install/upgrade Fusion into Kubernetes using Helm. Look in the directory where you ran `customize_fusion_values.sh` for a script named like:
> `___upgrade_fusion.sh`. Run this script to install Fusion.
>
> ## Verifying the Fusion Installation
>
> In this section, we provide some tips on how to verify the Fusion installation.
>
> > [!TIP]
> >
> > Check if the Fusion Admin UI is available at `\https://:6764/admin/`.
>
> Let's review some useful kubectl commands.
>
> ### Enhance the K8s Command-line Experience
>
> Here is a list of tools we found useful for improving your command-line experience with Kubernetes:
>
> * krew (kubectl plugin mgr): [https://github.com/kubernetes-sigs/krew/](https://github.com/kubernetes-sigs/krew/)
> * kube-ps1 (show current context on command line prompt): [https://github.com/jonmosco/kube-ps1](https://github.com/jonmosco/kube-ps1)
> * kubectx / kubens (switch between clusters / namespaces): [https://github.com/ahmetb/kubectx](https://github.com/ahmetb/kubectx)
>
> ### Useful kubectl commands
>
> kubectl reference: [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)
>
> Set the namespace for `kubectl` if not using the default:
>
> ```bash theme={"dark"}
> kubectl config set-context --current --namespace=