默认情况下,在文本字段上禁用Fielddata。设置fielddata = true

问题描述 投票:2回答:3

这是完整的错误消息:

Searchkick :: InvalidQueryError:Searchkick :: InvalidQueryError:[400] {“error”:{“root_cause”:[{“type”:“illegal_argument_exception”,“reason”:“默认情况下,文本字段禁用Fielddata。设置fielddata =在[foo_name]上为true,以便通过反转索引来加载内存中的fielddata。请注意,这可以使用大量内存。“}],”type“:”search_phase_execution_exception“,”reason“:”所有分片都失败“,”相 “:” 查询”, “分组”:真 “failed_shards”:[{ “碎片”:0, “指数”: “foos_test”, “节点”: “k0yYkVnIQzaXbvpAG_rKgw”, “理由”:{ “类型”: “illegal_argument_exception”,“reason”:“默认情况下,在文本字段上禁用Fielddata。在[foo_name]上设置fielddata = true,以便通过反转索引来加载内存中的fielddata。但是请注意,这可能会占用大量内存。”} }],“caused_by”:{“type”:“illegal_argument_exception”,“reason”:“默认情况下,在文本字段上禁用Fielddata。在[foo_name]上设置fielddata = true,以便通过反转倒置来加载内​​存中的fielddata指数。请注意,这可能会占用大量内存。“}},”状态“:400}

当我在索引操作中添加以下代码时,我收到此错误(此错误仅在minitest中显示):

order: {foo_name: :asc}

这是我的完整索引代码:

def index
  query = params[:q].presence || "*"
  @foos = Foo.search(
    query,
    page: params[:page], per_page: 25,
    order: {foo_name: :asc}
    )
  end
end

我正在使用Searchkick。

ruby-on-rails elasticsearch searchkick
3个回答
2
投票

这是一个讨厌的;我们很幸运能够找到解决方案。我假设你的模型看起来像这样:

class Foo
  attr_accessor :foo_name

  searchkick # some settings

  def search_data
    { foo_name: foo_name }
  end
end

您需要做的是定义一个foo_name_sort字段,其值与foo_name相同,但设置为filterable:

class Foo
  attr_accessor :foo_name

  searchkick # some settings,
             filterable [:foo_name_sort]

  def search_data
    { foo_name: foo_name,
      foo_name_sort: foo_name }
  end
end

然后搜索:

@foos = Foo.search(
  query,
  page: params[:page], per_page: 25,
  order: {foo_name_sort: :asc}
  )

0
投票

试试这个

def index
  query = params[:q].presence || "*"
  @foos = Foo.search(
    query,
    page: params[:page], per_page: 25,
    aggs: {foo_name: {order: {"_term" => "asc"}}}
   )
end

0
投票

像这样写下你的订单:

order: {'foo_name.keyword' => 'asc'}
© www.soinside.com 2019 - 2024. All rights reserved.