elasticsearch 文本字段未针对需要每个文档字段数据的操作进行优化

ujv3wf0j  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(3)|浏览(180)

从Elasticsearch切换到Opensearch后,我的应用程序现在无法运行以下简单查询:
文本字段未针对需要每个文档字段数据得操作(如聚合与排序)进行优化,因此默认情况下禁用这些操作.请改用关键字字段.或者,在[status]上设置fielddata=true,以便通过取消反转倒排索引来加载字段数据.请注意,这会占用大量内存.
有一个关于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文档在“高级Map”(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
          }

但是,同样的问题仍然存在。我也尝试了一些类似的链接后显示的东西,例如。

mappings: {
      properties: {
        name: {
          type: "text",
          fielddata: true,
          fields: {
            keyword: {
              type: "keyword"
            }
          }
        }
      }
    }

......但同样没有运气。
有人能建议如何解决这个问题吗?

roqulrg3

roqulrg31#

通过更改用于聚合的所有字段来处理眼前的问题,而不是:

aggs = %w(field1 field2 field3 ...)

...在上面的搜索查询中。我使用了:

aggs = %w(field1.keyword field2.keyword field3.keyword ...)
jhdbpxl9

jhdbpxl92#

这与使用Opensearch无关,而是使用的索引方法导致索引生成不正确。
请参阅:Searchkick memory leak

wfauudbj

wfauudbj3#

如果在删除索引时Tomcat运行ElasticSearch,则会触发此错误。
停止你的tomcat,再次删除你的索引,你就可以走了。
希望这对某人有帮助

相关问题