根据elasticseach docs,如果我有一家拥有多个分支机构的公司,并且我想将员工与分支机构联系起来,我就这样做了
PUT /company
{
"mappings": {
"branch": {},
"employee"{
"_parent": {
"type": "branch"
}
}
}
}
同样可以实现,用户使用Ruby-on-Rail,如下
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
如何设置elasticsearch rails以提供以下映射?
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 :(得分:1)
这有效
用户强>
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 =&#39;博客&#39;
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