0

elasticseach docs에 따르면 대한 설정 매핑에, 나는이나는 많은 지점을 가지고 회사를 가지고 있고이 지점 직원을 연결하기를 원한다면 많은-to-many 연관하여 elasticsearch 레일

을 할 거라고 방법
PUT /company 
{ 
    "mappings": { 
     "branch": {}, 
     "employee"{ 
      "_parent": { 
       "type": "branch" 
      } 
     } 
    } 
} 

class Branch < ActiveRecord::Base 
    include Elasticsearch::Model 

    has_many :employees, dependent: :destroy 

    index_name 'company' 

    mapping do 
    indexes :name 
    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 

class Employee < ActiveRecord::Base 
    include Elasticsearch::Model 

    belongs_to :branch 

    index_name 'company' 

    mapping _parent: { type: 'branch' }, _routing: { required: true } do 
    indexes :name 
    indexes :email 
    end 

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

module Searchable 
    INDEX_NAME = 'company' 

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

    settings = Branch.settings.to_hash.merge Employee.settings.to_hash 
    mappings = Branch.mappings.to_hash.merge Employee.mappings.to_hash 

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

    extend self 
end 

을 다음과 같은이, 루비 온 레일을 사용하여, 사용자 accomplised 수 있습니다 어떻게 설정 elasticsearch 레일은 나에게 다음과 같은 매핑을 제공 할 수 있습니까?

PUT /my_index/_mapping/blogpost 
{ 
    "blogpost": { 
    "properties": { 
     "body": { 
     "type": "text", 
     "fields": { 
      "keyword": { 
      "ignore_above": 256, 
      "type": "keyword" 
      } 
     } 
     }, 
     "title": { 
     "type": "text", 
     "fields": { 
      "keyword": { 
      "ignore_above": 256, 
      "type": "keyword" 
      } 
     } 
     }, 
     "user": { 
     "properties": { 
      "name": { 
      "type": "text", 
      "fields": { 
       "raw": { 
       "type": "keyword" 
       } 
      } 
      }, 
      "id": { 
      "type": "long" 
      } 
     } 
     } 
    } 
    }, 
    "user": { 
    "properties": { 
     "dob": { 
     "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis", 
     "type": "date" 
     }, 
     "name": { 
     "type": "text", 
     "fields": { 
      "keyword": { 
      "ignore_above": 256, 
      "type": "keyword" 
      } 
     } 
     }, 
     "email": { 
     "type": "text", 
     "fields": { 
      "keyword": { 
      "ignore_above": 256, 
      "type": "keyword" 
      } 
     } 
     } 
    } 
    } 
} 

답변

0

이 작동

사용자

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 

블로그 게시물

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 = '블로그'

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