文本字段未针对需要每个文档字段数据的操作进行优化
Text fields are not optimised for operations that require per-document field data
从 Elasticsearch 切换到 Opensearch 后,我的应用程序现在无法 运行 一个简单的查询:
"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."
在 Searchkick / Elasticsearch Error: Please use a keyword field instead. Alternatively, set fielddata=true on [name] 有一个关于相同错误的问题,但那里的问题只影响测试,我只在开发模式下遇到这个问题(到目前为止)。
这里的查询是 运行:
::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}
如果我去掉 aggs 则搜索没问题,但它们对于应用程序来说是必不可少的。从聚合字段列表中删除 :status
会导致将数组中的下一个字段命名为问题的错误。因此,我大概需要为聚合中使用的每个字段指定正确的类型。但是怎么办?
Searchkick 文档在“高级映射”(https://github.com/ankane/searchkick) 下建议此示例:
class Product < ApplicationRecord
searchkick mappings: {
properties: {
name: {type: "keyword"}
}
}
end
所以,我尝试了这个:
# in models/Record.rb
mapping_properties = {}
aggregation_fields.each do |af|
mapping_properties[af] = { type: 'keyword' }
end
searchkick mappings: {
properties: mapping_properties
}
但是,同样的问题仍然存在。我还尝试了类似于链接 post 中显示的内容,例如
mappings: {
properties: {
name: {
type: "text",
fielddata: true,
fields: {
keyword: {
type: "keyword"
}
}
}
}
}
...但同样没有运气。
谁能建议如何解决这个问题?
通过更改用于聚合的所有字段来解决眼前的问题,而不是:
aggs = %w(field1 field2 field3 ...)
...在上面的搜索查询中。
我用过:
aggs = %w(field1.keyword field2.keyword field3.keyword ...)
这与使用 Opensearch 无关。相反,使用的索引方法导致索引生成不正确。
参见:Searchkick memory leak
从 Elasticsearch 切换到 Opensearch 后,我的应用程序现在无法 运行 一个简单的查询:
"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."
在 Searchkick / Elasticsearch Error: Please use a keyword field instead. Alternatively, set fielddata=true on [name] 有一个关于相同错误的问题,但那里的问题只影响测试,我只在开发模式下遇到这个问题(到目前为止)。
这里的查询是 运行:
::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}
如果我去掉 aggs 则搜索没问题,但它们对于应用程序来说是必不可少的。从聚合字段列表中删除 :status
会导致将数组中的下一个字段命名为问题的错误。因此,我大概需要为聚合中使用的每个字段指定正确的类型。但是怎么办?
Searchkick 文档在“高级映射”(https://github.com/ankane/searchkick) 下建议此示例:
class Product < ApplicationRecord
searchkick mappings: {
properties: {
name: {type: "keyword"}
}
}
end
所以,我尝试了这个:
# in models/Record.rb
mapping_properties = {}
aggregation_fields.each do |af|
mapping_properties[af] = { type: 'keyword' }
end
searchkick mappings: {
properties: mapping_properties
}
但是,同样的问题仍然存在。我还尝试了类似于链接 post 中显示的内容,例如
mappings: {
properties: {
name: {
type: "text",
fielddata: true,
fields: {
keyword: {
type: "keyword"
}
}
}
}
}
...但同样没有运气。
谁能建议如何解决这个问题?
通过更改用于聚合的所有字段来解决眼前的问题,而不是:
aggs = %w(field1 field2 field3 ...)
...在上面的搜索查询中。 我用过:
aggs = %w(field1.keyword field2.keyword field3.keyword ...)
这与使用 Opensearch 无关。相反,使用的索引方法导致索引生成不正确。
参见:Searchkick memory leak