简体   繁体   English

在elasticsearch中设置关键字字段

[英]Setting keyword field in elasticsearch

I upgraded Rails from 4 to 5.2 and have also updated elasticsearch from 2.4 to 6.8. 我将Rails从4升级到5.2,并且还将弹性搜索从2.4更新到6.8。

The following is the error I'm getting. 以下是我得到的错误。

[400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [activity_type] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}]

This is what the request* looks like: 这就是请求*的样子:

activity_types=>{:terms=>{:field=>"activity_type"}}

Take a look at the activity_search.rb: 看一下activity_search.rb:

class ActivitySearch < Search::Model
  include DateSearch
  apply_date_filters
  apply_date_aggregations

  filters :activity_types, type: :terms, field: :activity_type, aggregate: false

  aggregates :activity_types, :subject_ids, :levels

  ....

Take a look at the model.rb: 看一下model.rb:

module Search
  class Model
    def add_aggregation(name, opts={})
      self._aggregations = _aggregations.deep_merge({name.to_sym => opts})
      return if method_defined? "aggregate_#{name}" 
      define_method "aggregate_#{name}" do |config={}|
      type = config.delete(:type){ :terms }
      field = config.delete(:field){ name.to_s.singularize }
      Search::Aggregation.new(type, field, opts)
    end

    def response
      @response ||= Search::Response.new(search.response)
    end

    def request
      @request ||= build_request
    end

    def search
      @search ||= run_search
    end

    private

    def run_search
      search_class.search(request.params)
    end

    def search_class
      self.class.name.demodulize.gsub('Search', '').safe_constantize
    end

    def build_request
      request = Search::Request.new
      request.query(*queries)
      request.filter(*filters)
      request.aggregate(aggregations)
      request.sort(*sorts)
      request
    end
  end

The activity_search_facade.rb: activity_search_facade.rb:

class Companies::ActivitySearchFacade < SimpleDelegator
  delegate :aggregations, to: :response
end

Can someone help solve this error? 有人可以帮助解决这个错误吗?

Please note the elasticsearch-rails gem version is 6.0.0. 请注意, elasticsearch-rails gem版本是6.0.0。

Let me know if you need any more code. 如果您需要更多代码,请告诉我们。

* How do I change this request so that it runs correctly with version 6? *如何更改此请求以使其在版本6中正确运行?

UPDATE UPDATE

Could it be something around this based on the error I'm getting? 根据我得到的错误,它可能是这个吗?

curl -X GET 'localhost:9200/development_activities'

  "activity_type":{"type":"text" }

How do I change this to type: "keyword" ? 如何更改此type: "keyword" ^ ^

Please check your elasticsearch version, as the elasticsearch-rails gem versions follow the elasticsearch version number and when you update elasticsearch-rails it may not work well with earlier elastic-search version. 请检查您的elasticsearch版本,因为elasticsearch-rails gem版本遵循elasticsearch版本号,当您更新elasticsearch-rails它可能不适用于早期的弹性搜索版本。

check here 检查一下

So the activity model looked like: 所以活动模型看起来像:

class Activity < ApplicationRecord
  include SearchCommon

this is what search_common.rb looked like: 这就是search_common.rb的样子:

module SearchCommon
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model

    after_commit on: [:create, :update] do
      __elasticsearch__.index_document
    end

    after_commit on: [:destroy] do
      __elasticsearch__.delete_document
    end

    index_name [Rails.env, model_name.collection].join('_')
  end
end

So I just added: 所以我刚补充说:

module SearchCommon
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model

    after_commit on: [:create, :update] do
      __elasticsearch__.index_document
    end

    after_commit on: [:destroy] do
      __elasticsearch__.delete_document
    end

    mapping do # ADDITION 
     indexes :activity_type, type: 'keyword' # ADDITION
    end # ADDITION 

    index_name [Rails.env, model_name.collection].join('_')
  end
end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM