mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-26 18:08:36 +00:00
[DOCS] Add example to "avoid scripts" advice (#54719)
Adds a detailed example to the "Avoid scripts" section of the "Tune for search speed" docs. The detail outlines how a script used to transform indexed data can be moved to ingest. The update also removes an outdated reference to supported script languages.
This commit is contained in:
parent
8b1e87cb61
commit
9569a8eb13
@ -164,8 +164,164 @@ include::../mapping/types/numeric.asciidoc[tag=map-ids-as-keyword]
|
||||
[float]
|
||||
=== Avoid scripts
|
||||
|
||||
In general, scripts should be avoided. If they are absolutely needed, you
|
||||
should prefer the `painless` and `expressions` engines.
|
||||
If possible, avoid using <<modules-scripting,scripts>> or
|
||||
<<request-body-search-script-fields,scripted fields>> in searches. Because
|
||||
scripts can't make use of index structures, using scripts in search queries can
|
||||
result in slower search speeds.
|
||||
|
||||
If you often use scripts to transform indexed data, you can speed up search by
|
||||
making these changes during ingest instead. However, that often means slower
|
||||
index speeds.
|
||||
|
||||
.*Example*
|
||||
[%collapsible]
|
||||
====
|
||||
An index, `my_test_scores`, contains two `long` fields:
|
||||
|
||||
* `math_score`
|
||||
* `verbal_score`
|
||||
|
||||
When running searches, users often use a script to sort results by the sum of
|
||||
these two field's values.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
GET /my_test_scores/_search
|
||||
{
|
||||
"query": {
|
||||
"term": {
|
||||
"grad_year": "2020"
|
||||
}
|
||||
},
|
||||
"sort": [
|
||||
{
|
||||
"_script": {
|
||||
"type": "number",
|
||||
"script": {
|
||||
"source": "doc['math_score'].value + doc['verbal_score'].value"
|
||||
},
|
||||
"order": "desc"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
----
|
||||
// TEST[s/^/PUT my_test_scores\n/]
|
||||
|
||||
To speed up search, you can perform this calculation during ingest and index the
|
||||
sum to a field instead.
|
||||
|
||||
First, <<indices-put-mapping,add a new field>>, `total_score`, to the index. The
|
||||
`total_score` field will contain sum of the `math_score` and `verbal_score`
|
||||
field values.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
PUT /my_test_scores/_mapping
|
||||
{
|
||||
"properties": {
|
||||
"total_score": {
|
||||
"type": "long"
|
||||
}
|
||||
}
|
||||
}
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
Next, use an <<ingest,ingest pipeline>> containing the
|
||||
<<script-processor,`script`>> processor to calculate the sum of `math_score` and
|
||||
`verbal_score` and index it in the `total_score` field.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
PUT _ingest/pipeline/my_test_scores_pipeline
|
||||
{
|
||||
"description": "Calculates the total test score",
|
||||
"processors": [
|
||||
{
|
||||
"script": {
|
||||
"source": "ctx.total_score = (ctx.math_score + ctx.verbal_score)"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
To update existing data, use this pipeline to <<docs-reindex,reindex>> any
|
||||
documents from `my_test_scores` to a new index, `my_test_scores_2`.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
POST /_reindex
|
||||
{
|
||||
"source": {
|
||||
"index": "my_test_scores"
|
||||
},
|
||||
"dest": {
|
||||
"index": "my_test_scores_2",
|
||||
"pipeline": "my_test_scores_pipeline"
|
||||
}
|
||||
}
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
Continue using the pipeline to index any new documents to `my_test_scores_2`.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
POST /my_test_scores_2/_doc/?pipeline=my_test_scores_pipeline
|
||||
{
|
||||
"student": "kimchy",
|
||||
"grad_year": "2020",
|
||||
"math_score": 800,
|
||||
"verbal_score": 800
|
||||
}
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
These changes may slow indexing but allow for faster searches. Users can now
|
||||
sort searches made on `my_test_scores_2` using the `total_score` field instead
|
||||
of using a script.
|
||||
|
||||
[source,console]
|
||||
----
|
||||
GET /my_test_scores_2/_search
|
||||
{
|
||||
"query": {
|
||||
"term": {
|
||||
"grad_year": "2020"
|
||||
}
|
||||
},
|
||||
"sort": [
|
||||
{
|
||||
"total_score": {
|
||||
"order": "desc"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
////
|
||||
[source,console]
|
||||
----
|
||||
DELETE /_ingest/pipeline/my_test_scores_pipeline
|
||||
----
|
||||
// TEST[continued]
|
||||
|
||||
[source,console-result]
|
||||
----
|
||||
{
|
||||
"acknowledged": true
|
||||
}
|
||||
----
|
||||
////
|
||||
====
|
||||
|
||||
We recommend testing and benchmarking any indexing changes before deploying them
|
||||
in production.
|
||||
|
||||
[float]
|
||||
=== Search rounded dates
|
||||
|
Loading…
x
Reference in New Issue
Block a user