Ruby on rails 使用gem Tire和elasticsearch进行高级搜索
我正在尝试使用gem tire在我的应用程序中搜索。我有桌子、区域、城市、酒店、房间和房间信息 我需要的是通过查询和其他文本字段查找hotel,如date_from、date_to和房间数。 在这个模型中,我有一个计算酒店是否有免费房间并发送布尔值的方法。 如何使用此布尔方法过滤查询 多谢各位 in hotel.html.erbRuby on rails 使用gem Tire和elasticsearch进行高级搜索,ruby-on-rails,ruby,gem,elasticsearch,tire,Ruby On Rails,Ruby,Gem,elasticsearch,Tire,我正在尝试使用gem tire在我的应用程序中搜索。我有桌子、区域、城市、酒店、房间和房间信息 我需要的是通过查询和其他文本字段查找hotel,如date_from、date_to和房间数。 在这个模型中,我有一个计算酒店是否有免费房间并发送布尔值的方法。 如何使用此布尔方法过滤查询 多谢各位 in hotel.html.erb <%= form_tag search_hotels_path, :method => 'post' do %> <%= label_tag
<%= form_tag search_hotels_path, :method => 'post' do %>
<%= label_tag :query %>
<%= text_field_tag :query, params[:query] %>
<%= label_tag 'From' %>
<%= text_field_tag :date_f, params[:date_from] %>
<%= label_tag 'To' %>
<%= text_field_tag :date_to, params[:date_to] %>
<%= label_tag 'Rooms' %>
<%= text_field_tag :rooms, params[:rooms] %>
<%= submit_tag :search %>
<% end %>
“post”do%>
里恩酒店
class Hotel < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
belongs_to :city
belongs_to :area
has_one :area, :through => :city
has_many :rooms, :dependent => :delete_all
def search(params)
tire.search do
query do
boolean do
must { string params[:query] } if params[:query].present?
must { term rooms_available params, true}
end
end
end
end
self.include_root_in_json = false
def to_indexed_json
to_json(methods: [:area_name,:city_name])
end
def area_name
city.area.name
end
def city_name
city.name
end
def rooms_available params
exit
begin_date = params[:date_from].to_date
end_date = params[:date_to].to_date
number_of_rooms = params[:rooms]
rooms.each do |room|
if room.available(begin_date, end_date, number_of_rooms)
return true
end
end
return false
end
end
class酒店:城市
有多个:房间,:dependent=>:delete\u all
def搜索(参数)
轮胎。搜索吗
询问
布尔do
如果params[:query].存在,则必须{string params[:query]}?
必须{term rooms\u available params,true}
终止
终止
终止
终止
self.include\u root\u in\u json=false
def to_index_json
to_json(方法:[:区域名称,:城市名称])
终止
def区域名称
城市、地区、名称
终止
城市名称
城市名称
终止
def房间\u可用参数
出口
开始日期=参数[:日期从].到日期
结束日期=参数[:日期到].到日期
房间数量=参数[:房间]
房间。每个房间|
如果房间可用(开始日期、结束日期、房间数量)
返回真值
终止
终止
返回错误
终止
终止
将其放入json方法中:
def to_json
{
:area_name => self.area_name,
:city_name => self.city_name,
:rooms_available => self.rooms_available
}.to_json
end
然后:
不过,在这种情况下,最好将可用的房间放在过滤器中,因为这是必须的,并且您不关心该条款的得分
def search(params)
tire.search do
query do
boolean do
must { string params[:query] } if params[:query].present?
end
end
filter do
boolean do
must { term rooms_available, true}
end
end
end
end
希望这有帮助:)把它放在json方法中:
def to_json
{
:area_name => self.area_name,
:city_name => self.city_name,
:rooms_available => self.rooms_available
}.to_json
end
然后:
不过,在这种情况下,最好将可用的房间放在过滤器中,因为这是必须的,并且您不关心该条款的得分
def search(params)
tire.search do
query do
boolean do
must { string params[:query] } if params[:query].present?
end
end
filter do
boolean do
must { term rooms_available, true}
end
end
end
end
希望这有帮助:)Elasticsearch首先是一个搜索引擎。它的表连接机制非常差。要实现您想要的功能,您必须将数据库反规范化为最多两个表:(区域、城市、酒店)->酒店和(房间和房间信息)->房间,然后使用Has子查询()。不过,我认为最好还是改用关系数据库。Elasticsearch首先是一个搜索引擎。它的表连接机制非常差。要实现您想要的功能,您必须将数据库反规范化为最多两个表:(区域、城市、酒店)->酒店和(房间和房间信息)->房间,然后使用Has子查询()。但是,我认为切换到关系数据库可能会更好。