Elasticsearch-rails完成建议器,映射数据,创建索引,建议方法

时间:2015-06-23 10:00:41

标签: ruby-on-rails ruby elasticsearch elasticsearch-rails

我正在使用elasticsearch-modelelasticsearch-rails宝石。

在我的个人资料模型中,我有

settings index: { number_of_shards: 3 } do
    mappings dynamic: 'false'  do
      indexes :profile_type, analyzer: 'keyword'
      indexes :profile do |p|
        indexes :name, type: 'multi_field' do
          indexes :name, analyzer: 'snowball'
          indexes :tokenized, analyzer: 'keyword'
        end
      end
    end
 end

我尝试添加suggest字段

settings index: { number_of_shards: 3 } do
    mappings dynamic: 'false'  do
      indexes :profile_type, analyzer: 'keyword'
      indexes :suggest, type: 'suggest' # not sure about this
      # do not really know how to index this field
      indexes :profile do |p|
        indexes :name, type: 'multi_field' do
          indexes :name, analyzer: 'snowball'
          indexes :tokenized, analyzer: 'keyword'
        end
      end
    end
 end

我想在profile.name上提出建议,我添加了as_indexed_json

def as_indexed_json(options={})
    suggest= {
     suggest: {
      :input => profile.name,
      :output => profile.name,
      :payload => {
        name: profile.name
      }
     }
    }
    self.as_json(
      :only => [:profile_type, :slug],
      :include => {
        :profile => {}
      }
    ).merge(suggest)
end

任何帮助将不胜感激,任何建议。

1 个答案:

答案 0 :(得分:1)

我想出了如何使用elasticsearch-rails gem

来映射数据
settings index: { number_of_shards: 3 } do
    mappings dynamic: 'false'  do
      indexes :profile_type, analyzer: 'keyword'
      indexes :suggest, type: 'completion', index_analyzer: 'simple', search_analyzer: 'simple', payloads: true
      # will do the trick
      indexes :profile do |p|
        indexes :name, type: 'multi_field' do
          indexes :name, analyzer: 'snowball'
          indexes :tokenized, analyzer: 'keyword'
        end
      end
    end
 end

然后创建索引

def as_indexed_json(options={})
    suggest= {
     suggest: {
      :input => profile.name,
      :output => profile.name,
      :payload => {
        name: profile.name
      }
     }
    }
    self.as_json(
      :only => [:profile_type, :slug],
      :include => {
        :profile => {}
      }
    ).merge(suggest)
end

然后不要使用search方法,而是使用suggest方法

  def self.suggest query
    __elasticsearch__.client.suggest(:index => index_name, :body => {
      :suggestions => {
        :text => query,
        :completion => {
          :field => 'suggest',
          :size => 20
        }
      }
    })
  end

这样您就可以获得complete suggestion