Having switched from Elasticsearch to Opensearch, my application now fails to run a simple query with:
"Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [status] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
There's a question concerning the same error at Searchkick / Elasticsearch Error: Please use a keyword field instead. Alternatively, set fielddata=true on [name], but there the problem was only affecting tests and I only get the problem (so far) in development mode.
Here's the query being run:
::Record.search(q ? q : "*",
where: where_clause,
fields: fields,
match: :word_middle,
per_page: max_per_page(per_page) || 30,
page: page || 1,
order: sort_clause,
aggs: aggs,
misspellings: {below: 5}
If I take out aggs then the search is fine, but they're essential for the application. Removing :status
from the list of aggregation fields causes the error to name the next field in the array as the problem. So, I presumably need to specify the correct type for each field used in aggregations. But how?
The Searchkick docs suggest this example under "Advanced Mapping" (https://github.com/ankane/searchkick):
class Product < ApplicationRecord
searchkick mappings: {
properties: {
name: {type: "keyword"}
}
}
end
So, I tried this:
# in models/Record.rb
mapping_properties = {}
aggregation_fields.each do |af|
mapping_properties[af] = { type: 'keyword' }
end
searchkick mappings: {
properties: mapping_properties
}
But, the same problem persists. I also tried something similar to that shown in the linked post, e.g.
mappings: {
properties: {
name: {
type: "text",
fielddata: true,
fields: {
keyword: {
type: "keyword"
}
}
}
}
}
...but similarly without luck.
Can anyone suggest how this might be fixed?
aggs
, can you do this from fresh and it should work, might be requirted change isn't applied to your mapping, you can check that using_mapping
Api of Elasticsearch, OS should have similar api to check mapping of index – Perot