【问题标题】:Fielddata is disabled on text fields by default. Set fielddata=true默认情况下,在文本字段上禁用 Fielddata。设置 fielddata=true
【发布时间】:2017-02-10 03:40:25
【问题描述】:

这是完整的错误信息:

Searchkick::InvalidQueryError: Searchkick::InvalidQueryError: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","re​​ason":"Fielddata 默认情况下在文本字段上禁用。设置 fielddata=true on [foo_name] 为了通过不反转将字段数据加载到内存中 倒排索引。请注意,这可能会使用显着的 内存。"}],"type":"search_phase_execution_exception","re​​ason":"all 碎片 失败","阶段":"查询","分组":true,"failed_shards":[{"shard":0,"index":"foos_test","node":"k0yYkVnIQzaXbvpAG_rKgw","re​​ason":{ "type":"illegal_argument_exception","re​​ason":"Fielddata 默认情况下在文本字段上禁用。设置 fielddata=true on [foo_name] 为了通过不反转将字段数据加载到内存中 倒排索引。请注意,这可能会使用显着的 内存。"}}],"caused_by":{"type":"illegal_argument_exception","re​​ason":"Fielddata 默认情况下在文本字段上禁用。设置 fielddata=true on [foo_name] 为了通过不反转将字段数据加载到内存中 倒排索引。请注意,这可能会使用显着的 内存。"}},"状态":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


    【解决方案1】:

    这很糟糕;我们很幸运偶然发现了解决方案。我假设您的模型看起来像这样:

    class Foo
      attr_accessor :foo_name
    
      searchkick # some settings
    
      def search_data
        { foo_name: foo_name }
      end
    end
    

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

    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}
      )
    

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

        【解决方案3】:

        这样写你的订单:

        order: {'foo_name.keyword' => 'asc'}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多