首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置elasticsearch-rails非正态映射

如何设置elasticsearch-rails非正态映射
EN

Stack Overflow用户
提问于 2017-05-17 13:28:25
回答 1查看 1.8K关注 0票数 0

我正在尝试为elasticsearch去正规化设置映射,就像在此链接中那样

我有以下几种型号:

品牌

代码语言:javascript
复制
class Brand < ApplicationRecord
  include Elasticsearch::Model

  # title

  has_and_belongs_to_many :products

  index_name Rails.application.engine_name.split('_').first

  mapping do
    indexes :title, type: 'keyword'
  end
end

范畴

代码语言:javascript
复制
class Category < ApplicationRecord
  include Elasticsearch::Model

  # title

  has_many :categorizations
  has_many :products, through: :categorizations

  index_name Rails.application.engine_name.split('_').first

  mapping do
    indexes :title, type: 'keyword'
  end
end

产品

代码语言:javascript
复制
class Product < ApplicationRecord
  include Elasticsearch::Model

  # title
  # description

  has_many :categorizations
  has_many :categories, through: :categorizations
  has_many :variations
  has_and_belongs_to_many :brands

  index_name Rails.application.engine_name.split('_').first

  mapping do
    indexes :id
    indexes :title
    indexes :description

    indexes :brands, type: 'keyword'
    indexes :categories, type: 'keyword'

    indexes :variations  do
      indexes :price, index: :not_analyzed
      indexes :color, index: :not_analyzed
      indexes :size, index: :not_analyzed
    end
  end


  after_commit lambda { __elasticsearch__.index_document },  on: :create
  after_commit lambda { __elasticsearch__.update_document },  on: :update
  after_commit lambda { __elasticsearch__.delete_document },  on: :destroy
end

变异

代码语言:javascript
复制
class Variation < ApplicationRecord
  include Elasticsearch::Model

  # price
  # color
  # size

  belongs_to :product

  index_name Rails.application.engine_name.split('_').first

  mapping do
    indexes :price, index: :not_analyzed
    indexes :color, index: :not_analyzed
    indexes :size, index: :not_analyzed
  end
end

可搜索模块

代码语言:javascript
复制
module Searchable
  INDEX_NAME = Rails.application.engine_name.split('_').first

  def create_index!(options={})
    client = Product.__elasticsearch__.client
    client.indices.delete index: INDEX_NAME rescue nil if options[:force]

    settings = Product.settings.to_hash.merge Variation.settings.to_hash.merge Brand.settings.to_hash.merge Category.settings.to_hash
    mappings = Product.settings.to_hash.merge Variation.mappings.to_hash.merge Brand.mappings.to_hash.merge Category.mappings.to_hash

    client.indices.create index: INDEX_NAME,
        body: {
            settings: settings.to_hash,
            mappings: mappings.to_hash
        }
  end

  def setup
    Searchable.create_index! force: true
    Product.__elasticsearch__.refresh_index!
  end

  extend self
end

当我运行它时,30,000种产品中有200种没有分类。我哪里出问题了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-20 03:36:30

这样啊,原来是这么回事

用户

代码语言:javascript
复制
class User < ApplicationRecord
  include Elasticsearch::Model
  has_and_belongs_to_many :blogposts, touch: true

  index_name 'blog'

  mapping do
    indexes :name
    indexes :email
  end

  after_commit lambda { __elasticsearch__.index_document  },  on: :create
  after_touch  lambda { __elasticsearch__.index_document  },  on: :touch
  after_commit lambda { __elasticsearch__.update_document },  on: :update
  after_commit lambda { __elasticsearch__.delete_document },  on: :destroy
end

博客

代码语言:javascript
复制
class Blogpost < ApplicationRecord
  include Elasticsearch::Model
  has_and_belongs_to_many :user, touch: true

  index_name 'blog'

  mapping do
    indexes :title
    indexes :body

    indexes :user do
      indexes :id, type: 'long'
      indexes :name, type: 'string' do
        indexes :raw, type: 'keyword', index: 'not_analyzed'
      end
    end
  end

  def as_indexed_json(options={})
    hash = self.as_json()
    hash['user.id'] = self.user.first.id
    hash['user.name'] = self.user.first.name
    hash
  end


  after_commit lambda { __elasticsearch__.index_document  },  on: :create
  after_touch  lambda { __elasticsearch__.index_document  },  on: :touch
  after_commit lambda { __elasticsearch__.update_document },  on: :update
  after_commit lambda { __elasticsearch__.delete_document },  on: :destroy
end

可搜索模块模块可搜索INDEX_NAME = 'blog‘

代码语言:javascript
复制
  def create_index!(options={})
    client = User.__elasticsearch__.client
    client.indices.delete index: INDEX_NAME rescue nil if options[:force]

    settings = User.settings.to_hash.merge Blogpost.settings.to_hash
    mappings = User.mappings.to_hash.merge Blogpost.mappings.to_hash

    client.indices.create index: INDEX_NAME,
                          body: {
                              settings: settings.to_hash,
                              mappings: mappings.to_hash }
  end

  def setup
    Searchable.create_index! force: true

    10.times do
      n = Faker::Name.name
      u = User.create name: n,
                      email: Faker::Internet.free_email(n.split(' ').last)

      rand(1..10).times do
        s = Faker::Lorem.sentence
        u.blogposts.create title: s.split(' ').first, body: s
      end
    end

    User.__elasticsearch__.refresh_index!
  end

  extend self
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44026294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档