Curations
editCurations
editCurations allow search operators to customize search results for specific queries.
Use promoted documents to ensure that specified documents always match a query and receive the highest relevance scores. Imagine an ecommerce store with featured product results or a support forum with pinned results for the most popular queries. Similarly, use hidden documents to exclude particular documents from results.
Since 7.16.0, you can enable the new adaptive relevance feature to receive suggestions from App Search based on ongoing analysis of query and click data. These suggestions improve your curations and deliver more relevant results. Accept or reject each suggestion manually, or allow App Search to manage your curations automatically.
Readers familiar with curations and adaptive relevance can find solutions to specific problems within the sections under Using curations. Readers new to curations may want to begin with the Curations reference and Curations examples.
For API users, an API reference is available.
Using curations
edit- Manage curations using Kibana
- Manage curations using the Enterprise Search API
- Enable or disable adaptive relevance suggestions for an engine
- Manage adaptive relevance suggestions using Kibana
- Manage adaptive relevance suggestions using the Enterprise Search API
- Accept all adaptive relevance suggestions for an engine
- Manage adaptive relevance settings
- View adaptive relevance history
- View adaptive relevance events logs
- Convert an automated curation to a manual curation
- Convert a manual curation to an automated curation
Manage curations using Kibana
editManage curations using Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Create, list, view, update, and delete curations.
Watch the following video tutorial for details:
Manage curations using the Enterprise Search API
editManage curations using the Enterprise Search API: Curations API reference.
Use the API to list, view, create, update, and delete curations.
Enable or disable adaptive relevance suggestions for an engine
editEnable or disable adaptive relevance suggestions for curations for each engine. This choice is stored as an adaptive relevance setting.
Use Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Choose the Settings tab, then select or de-select Enable suggestions.
Alternatively, use the Enterprise Search API to manage adaptive relevance settings. See Settings within the adaptive relevance API reference.
Manage adaptive relevance suggestions using Kibana
editManage adaptive relevance suggestions for your curations using Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Choose the Overview tab if it isn’t already selected, and locate the Suggestions section.
- List and view adaptive relevance suggestions for your curations.
- Select a query from the list to view a specific suggestion.
- Accept, reject, automate, or disable suggestions for that query.
Manage adaptive relevance suggestions using the Enterprise Search API
editManage adaptive relevance suggestions for your curations using the Enterprise Search API.
Use the adaptive relevance API operations: Adaptive relevance API reference (beta).
-
To limit results to curations suggestions, request suggestions for an engine where
type
iscuration
. - List suggestions or view specific suggestions.
- For each suggestion: accept, reject, automate, or disable suggestions for that query.
Alternatively, use the curations API operations: Curations API reference.
- List curations or view specific curations.
- Each curation result includes suggestions information when present on the curation.
Accept all adaptive relevance suggestions for an engine
editApp Search can automatically accept all adaptive relevance suggestions for your curations after creating each suggestion. In this mode, all new curations within the engine will be automated curations. This choice is stored as an adaptive relevance setting.
Use Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Choose the Settings tab, then select or de-select Automatically accept new suggestions.
Alternatively, use the Enterprise Search API to manage adaptive relevance settings. See Settings within the adaptive relevance API reference.
Manage adaptive relevance settings
editManage adaptive relevance settings for each engine.
Manage some settings using Kibana:
Manage all settings using the Enterprise Search API. See Settings within the adaptive relevance API reference.
View adaptive relevance history
editView the following adaptive relevance history information:
- Recent adaptive relevance changes
- Recently rejected suggestions
- Ignored queries
Use Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Choose the History tab, and locate any of the sections listed above.
Alternatively, view the adaptive relevance events logs. See View adaptive relevance events logs
View adaptive relevance events logs
editYou can either use Kibana Logs or Kibana Discover:
Use Kibana Logs:
- Open: Observability → Logs
-
In the search bar, select the search-relevance-suggestions dataset:
event.dataset: search-relevance-suggestions
- Press enter, and you’ll see the filtered log stream for adaptive relevance suggestions related messages.
Use Kibana Discover:
Create an index pattern in Kibana for the adaptive relevance related indexes:
- Open: Stack Management → Kibana / Index Patterns → Create Index Pattern
- Click on "Advanced Settings" to check "Allow hidden and system indices".
-
Set as "Name" the value
.ent-search-search-relevance-suggestions-ecs-ilm-logs-*
. -
Select
@timestamp
in the "Timestamp field" dropdown. - Click "Create index pattern".
See create index patterns guide for more details.
Now you can select the newly created index pattern in Discover:
- Open Discover in the Kibana menu.
-
Select the created index pattern (
.ent-search-search-relevance-suggestions-ecs-ilm-logs-*
) in the "Change index pattern" combo if it is not already displayed.
For a complete reference of all events, see Adaptive relevance events logs reference.
Convert an automated curation to a manual curation
editConvert an automated curation to a manual curation.
Use Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Select a curation to view its details, and choose Convert to manual curation.
Convert a manual curation to an automated curation
editTo convert a manual curation to an automated curation, you must wait for App Search to suggest a change to the curation.
Use Kibana:
- Open: Enterprise Search → App Search → Engines → engine → Curations
- Choose the Overview tab if it isn’t already selected, and locate the Suggestions section.
- Choose the suggestion that applies to the curation to visit its details screen.
- Choose ⋮ to expand the options menu, and choose Automate - always accept new suggestions for this query.
Curations reference
editFor API users, an API reference is available.
Curation
editA curation is an object, associated with an engine, that represents customizations to the search results for one or more queries.
Each curation has the following attributes:
-
id
-
An opaque token created by App Search. Used for some API operations.
-
queries
(required) -
An array of strings, where each string is a search query whose results are modified by the curation.
Each query can belong to only one curation.
If adaptive relevance suggestions are enabled, use only one query per curation. App Search will suggest changes to only those curations that have a single query.
-
promoted
-
An array of strings, where each string is a document ID representing a promoted document.
To add a document to the promoted documents, it must exist within the engine.
When specifying documents for a curation on a meta engine, you must scope each document ID to its source engine. See Document IDs for meta engines.
Required when
hidden
is omitted. -
hidden
-
An array of strings, where each string is a document ID representing a hidden document.
To add a document to the hidden documents, it must exist within the engine.
When specifying documents for a curation on a meta engine, you must scope each document ID to its source engine. See Document IDs for meta engines.
Required when
promoted
is omitted.
To manage curations, see:
App Search may create adaptive relevance suggestions for curations. In that context, it’s useful to distinguish between manual curations and automated curations. And it’s possible to convert between the two types. See:
Promoted documents
editEach curation may include a collection of promoted documents. These documents are always returned within the results for each query belonging to the curation, even if the documents do not match the query.
Promoted documents also receive higher _score
values than any other results.
Therefore, when results are sorted by _score
(the default sort), promoted documents appear before all other results.
The promoted documents collection is ordered.
When results are sorted by _score
, promoted documents appear in the order in which they are stored on the curation, before all other results.
When results are sorted on a field other than _score
, promoted documents are always included in the results, but their positions are determined by their value for the given sort
field.
Similarly, when results are grouped on a field, promoted documents are always included in the results, but their positions are determined by their value for the given group
field.
See Curations examples for examples that demonstrate promoted documents.
Hidden documentsedit
Each curation may include a collection of hidden documents. In contrast to promoted documents, hidden documents are never returned within the results for each query belonging to the curation, even if the documents match the query.
Since hidden documents are excluded from search results, the order of the collection is not important.
See Curations examples for examples that demonstrate hidden documents.
Adaptive relevance
editAdaptive relevance is a beta feature. Beta features are subject to change and are not covered by the support SLA of general release (GA) features. Elastic plans to promote this feature to GA in a future release.
Adaptive relevance is not available at all Elastic subscription levels. Refer to the Elastic subscriptions pages for Elastic Cloud and self-managed deployments.
Since 7.16.0, curations are powered by adaptive relevance. Enable this feature to receive suggestions from App Search based on ongoing analysis of query and click data.
App Search can create adaptive relevance suggestions that create, update, or delete your engines' curations. Accept these suggestions to improve your curations and deliver more relevant results.
You can enable, disable, and customize these suggestions using adaptive relevance settings.
Learn more about curations powered by adaptive relevance:
Use curations powered by adaptive relevance:
- Enable or disable adaptive relevance suggestions for an engine
- Manage adaptive relevance suggestions using Kibana
- Manage adaptive relevance suggestions using the Enterprise Search API
- Accept all adaptive relevance suggestions for an engine
- Manage adaptive relevance settings
- View adaptive relevance history
- View adaptive relevance events logs
- Convert an automated curation to a manual curation
- Convert a manual curation to an automated curation
Adaptive relevance suggestions
editEnterprise Search 7.16.0 introduced curations powered by adaptive relevance. Enable this feature to receive suggestions from App Search to improve your curations and deliver more relevant results. Or, allow App Search to manage your curations automatically.
When enabled, App Search routinely analyzes queries within recent history with sufficient clicks. Based on that analysis, App Search creates suggestions to create, update, or delete curations that add or remove specific promoted documents.
Each suggestion applies to a specific query, so App Search will suggest changes only to those curations with a single query.
Each suggestion begins in a pending
status.
Search operators can manage each suggestion using Kibana. Operators can:
- Accept the suggestion. A curation will be created or updated with the suggestion.
- Reject the suggestion. No curation will be created or updated. Updates to the suggestion will be highlighted again for approval.
- Accept the suggestion and accept all future suggestions for the same curation. This converts the curation into an automated curation.
- Disable the suggestion. The suggestion will be discarded and future suggestions for the same query will not be considered.
Alternatively, search operators can use the Enterprise Search API to directly manipulate the status of each suggestion. The possible statuses are:
-
pending
: The suggestion is waiting to be accepted or discarded. -
applied
: The suggestion has been accepted and a curation has been created or updated with the suggestion. -
automated
: The suggestion has been accepted, and any future updates on the suggestion will be applied automatically. -
rejected
: The suggestion was rejected. Future updates to the suggestion will bring it back topending
state. -
disabled
: The suggestion has not been applied, and any future updates to the suggestion will be ignored.
Also refer to the following statuses diagram:
A pending
suggestion may override a curation that has been created or modified manually if applied
(or automated
). When that would happen, a field override_manual_curation
with value true
will be returned as part of the suggestion information to warn about this.
Search operators can manage adaptive relevance settings to customize details of the algorithm or schedule for adaptive relevance suggestions. Search operators can also accept all suggestions for an engine to allow App Search to manage all new curations automatically.
To use adaptive relevance suggestions:
- Your deployment must match the required Elastic subscription level. Refer to the Elastic subscriptions pages for Elastic Cloud and self-managed deployments.
- Adaptive relevance suggestions must be enabled for the engine. See Enable or disable adaptive relevance suggestions for an engine.
- Analytics logging must be enabled for the engine. See Log settings.
To manage adaptive relevance suggestions for an engine, see:
To view the adaptive relevance history for an engine, see:
Adaptive relevance settings
editEnterprise Search 7.16.0 introduced curations powered by adaptive relevance. Adaptive relevance settings are settings stored with each engine that allow search operators to customize the behavior of adaptive relevance suggestions for that engine. Use these settings to enable or disable adaptive relevance suggestions for an engine, accept all suggestions for an engine, or customize details of the algorithm or schedule for adaptive relevance suggestions for an engine.
Search operators can manage some settings using Kibana and all settings using the Enterprise Search API. See:
For a complete settings reference, see Settings within the adaptive relevance API reference.
Adaptive relevance events logs
editThe adaptive relevance events logs record all events associated with adaptive relevance suggestions, including those that apply to curations. Use the logs to audit automated changes to your curations.
View the adaptive relevance events logs using Kibana Logs or Discover. See View adaptive relevance events logs.
Alternatively, view adaptive relevance history for curations using Kibana Curations. See View adaptive relevance history.
Automated curation
editAn automated curation is a curation whose adaptive relevance suggestions have been pre-approved. App Search therefore applies new suggestions automatically as soon as they are obtained.
Search operators cannot change queries
or promoted
for an automated curation.
These are managed exclusively by App Search.
However, search operators can change hidden
.
To change queries
or promoted
of an automated curation, first convert it to a manual curation.
See Convert an automated curation to a manual curation.
Manual curation
editA manual curation is a curation whose adaptive relevance suggestions are not pre-approved. This is the default, standard curation type.
App Search may create adaptive relevance suggestions for a manual curation. Search operators may accept each suggestions manually, or they may pre-approve all future suggestions for a given curation. Pre-approving all suggestions converts the curation to an automated curation.
Curations examples
editThe following sections use an ecommerce use case to demonstrate curations, promoted documents, and hidden documents.
An ecommerce analyst discovers that customers who search for winter coat usually buy the products Hooded parka and Down winter jacket. However, Hooded parka does not appear in the search results at all, and Down winter jacket is scored less relevant than a product that is purchased infrequently. Furthermore, the search results include a hat, which is not what searchers are looking for.
A search operator uses a curation to customize the results for the query winter coat. The curation ensures that Hooded parka is always returned and has the highest relevance score. The curation also scores Down winter jacket higher than the less popular product, Winter field coat. Finally, the curation excludes Knit winter hat from the results, since searchers consider it not relevant.
The following sections implement this scenario and also demonstrate the affect of sorting and grouping on curated results.
Within each section, expand the collapsed portions to view the relevant API requests and responses.
Create engine, schema, and documents
editCreate an engine with name products
to store documents representing products.
Create engine
POST <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines { "name": "products" }
Define a schema for the documents within engine products
.
Documents in this engine have the following fields:
Field name | Field type | Description |
---|---|---|
|
|
A user-supplied ID for the product. |
|
|
The name of the product. |
|
|
The price of the product. |
|
|
The average customer rating of the product.
One of: |
Create schema
POST <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/schema { "name": "text", "price": "number", "rating": "number" }
Save the following documents within the products
engine to use for the examples.
ID | Name | Price | Rating |
---|---|---|---|
winter-field-coat |
Winter field coat |
75 |
4 |
down-winter-jacket |
Down winter jacket |
200 |
4 |
knit-winter-beanie |
Knit winter beanie |
10 |
5 |
hooded-parka |
Hooded parka |
150 |
5 |
Save documents
POST <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/documents [ { "id": "winter-field-coat", "name": "Winter field coat", "price": 75, "rating": 4 }, { "id": "down-winter-jacket", "name": "Down winter jacket", "price": 200, "rating": 4 }, { "id": "knit-winter-beanie", "name": "Knit winter beanie", "price": 10, "rating": 5 }, { "id": "hooded-parka", "name": "Hooded parka", "price": 150, "rating": 5 } ]
View search results
editSearch for winter coat
before curating the results.
The search returns the following documents (with scores):
-
Winter field coat (
6.537158
) -
Down winter jacket (
0.49185246
) -
Knit winter beanie (
0.3164503
)
Search for winter coat
before curating results
GET <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/search { "query": "winter coat" }
See full response (formatted)
{ "meta": { "alerts": [], "warnings": [], "precision": 2, "page": { "current": 1, "total_pages": 1, "total_results": 3, "size": 10 }, "engine": { "name": "products", "type": "default" }, "request_id": "TPyQN9kIQOObgm8HU1Fjlg" }, "results": [ { "price": { "raw": 75 }, "name": { "raw": "Winter field coat" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 6.537158, "id": "winter-field-coat" }, "id": { "raw": "winter-field-coat" } }, { "price": { "raw": 200 }, "name": { "raw": "Down winter jacket" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 0.49185246, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" } }, { "price": { "raw": 10 }, "name": { "raw": "Down winter jacket" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 0.49185246, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" } }, { "price": { "raw": 10 }, "name": { "raw": "Knit winter beanie" }, "rating": { "raw": 5 }, "_meta": { "engine": "products", "score": 0.3164503, "id": "knit-winter-beanie" }, "id": { "raw": "knit-winter-beanie" } } ] }
Curate results
editRecall the following suggestions from the ecommerce analyst to improve search results for winter coat
:
- Always return Hooded parka
- Assign Hooded parka the highest relevance score
- Assign Down winter jacket a higher relevance score than Winter field coat
- Never return Knit winter hat
Create a curation with the following attributes:
Queries | Promoted | Hidden |
---|---|---|
|
|
|
Create curation for query winter coat
POST <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/curations { "queries": [ "winter coat" ], "promoted": [ "hooded-parka", "down-winter-jacket" ], "hidden": [ "knit-winter-beanie" ] }
Now, search again to see how the curation affects the results:
-
Hooded parka (
1.7014124e+38
) -
Down winter jacket (
1.7014122e+38
) -
Winter field coat (
6.537158
)
The following has changed:
- Hooded parka is included
- Knit winter hat is excluded
- Hooded parka and Down winter jacket have higher scores than Winter field coat
Search for winter coat
after curating results
GET <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/search { "query": "winter coat" }
See full response (formatted)
{ "meta": { "alerts": [], "warnings": [], "precision": 2, "page": { "current": 1, "total_pages": 1, "total_results": 3, "size": 10 }, "engine": { "name": "products", "type": "default" }, "request_id": "qQq_gg9PT_migDYWsTIPyw" }, "results": [ { "price": { "raw": 150 }, "name": { "raw": "Hooded parka" }, "rating": { "raw": 5 }, "_meta": { "engine": "products", "score": 1.7014124e+38, "id": "hooded-parka" }, "id": { "raw": "hooded-parka" } }, { "price": { "raw": 200 }, "name": { "raw": "Down winter jacket" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 1.7014122e+38, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" } }, { "price": { "raw": 75 }, "name": { "raw": "Down winter jacket" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 1.7014122e+38, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" } }, { "price": { "raw": 75 }, "name": { "raw": "Winter field coat" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 6.537158, "id": "winter-field-coat" }, "id": { "raw": "winter-field-coat" } } ] }
Sort curated results
editThe following example demonstrates the affect of sorting on curated results.
Sort the results by price
, ascending (low to high):
-
Winter field coat (
75
) -
Hooded parka (
150
) -
Down winter jacket (
200
)
Observe the following:
- Hooded parka is still included, despite not matching the query
-
Hooded parka and Down winter jacket now appear after Winter field coat, because the documents are sorted by
price
rather than_score
Sort curated results
GET <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/search { "query": "winter coat", "sort": { "price": "asc" } }
See full response (formatted)
{ "meta": { "alerts": [], "warnings": [], "precision": 2, "page": { "current": 1, "total_pages": 1, "total_results": 3, "size": 10 }, "engine": { "name": "products", "type": "default" }, "request_id": "PjSYjwuETQ2YyC05VmynHw" }, "results": [ { "price": { "raw": 75 }, "name": { "raw": "Winter field coat" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": null, "id": "winter-field-coat" }, "id": { "raw": "winter-field-coat" } }, { "price": { "raw": 150 }, "name": { "raw": "Hooded parka" }, "rating": { "raw": 5 }, "_meta": { "engine": "products", "score": null, "id": "hooded-parka" }, "id": { "raw": "hooded-parka" } }, { "price": { "raw": 200 }, "name": { "raw": "Down winter jacket" }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": null, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" } } ] }
Group curated results
editThe following example demonstrates the affect of grouping on curated results.
Group the results by rating
:
5
:
- Hooded parka
4
:
- Winter field coat
- Down winter jacket
Observe the following:
- Hooded parka is still included, despite not matching the query
-
Down winter jacket now appears after Winter field coat, because the documents are organized in groups by their
rating
rather than sorted byscore
Group curated results
GET <ENTERPRISE_SEARCH_BASE_URL>/api/as/v1/engines/products/search { "query": "winter coat", "group": { "field": "rating" } }
See full response (formatted)
{ "meta": { "alerts": [], "warnings": [], "precision": 2, "page": { "current": 1, "total_pages": 1, "total_results": 2, "size": 10 }, "engine": { "name": "products", "type": "default" }, "request_id": "XegjDUewRWOj-5sr70DBYw" }, "results": [ { "name": { "raw": "Hooded parka" }, "price": { "raw": 150 }, "rating": { "raw": 5 }, "_meta": { "engine": "products", "score": 1.7014124e+38, "id": "hooded-parka" }, "id": { "raw": "hooded-parka" }, "_group": [], "_group_key": 5 }, { "name": { "raw": "Down winter jacket" }, "price": { "raw": 200 }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 1.7014122e+38, "id": "down-winter-jacket" }, "id": { "raw": "down-winter-jacket" }, "_group": [ { "name": { "raw": "Winter field coat" }, "price": { "raw": 75 }, "rating": { "raw": 4 }, "_meta": { "engine": "products", "score": 6.537158, "id": "winter-field-coat" }, "id": { "raw": "winter-field-coat" } } ], "_group_key": 4 } ] }