我的Rails应用程序中的Thinking Sphinx存在严重问题。我的应用程序规范如下:
在我的应用程序中,我有一个Page
模型和一个Offer
模型,pages
有很多offers
。 Page
模型中定义的索引如下所示:
define_index do
#other indexes defined here
#...
has offers.width, as: :offers_width
has offers.height, as: :offers_height
has offers.price, as: :offers_price
set_property delta: true
end
然后我在Page
模型上进行搜索,根据搜索查询和条件选择pages
。但是,当我尝试使用:with
过滤器时,Sphinx给了我错误的结果。
当我只使用一个过滤器时,例如price
或width
,结果就可以了,但是当我尝试组合过滤器时,例如price and width
,我得到了包含给定price
或width
,而非price
和width
的优惠的结果。
当我使用范围搜索时,大多数时间:with
参数是范围而不是整数值。
编辑1
使用以下方式查询:
Page.search Riddle.escape(query), conditions: conditions, with: has_cond, star: true, per_page: Page.per_page, page: page
其中 has_cond 是:
{:offers_height=>[175..200], :offers_width=>[175..200], :offers_price=>[10..80]}
它仍然为我提供了 ANY 商品在该范围内的高度或 ANY 商品的宽度为价格范围或相同的东西。
答案 0 :(得分:1)
好的,我找到了解决方案。 sphinx给我错误结果的原因是因为他在单页内汇总了所有优惠。我不得不将索引从页面移动到商品,现在查询按预期工作。我提供的索引如下:
define_index do
indexes page(:description), as: :page_description
indexes page(:address), as: :page_address
indexes page(:title), as: :page_title
indexes page(:status), as: :page_status
indexes page.tags(:name), as: :page_tags_name
indexes page.category(:id), as: :page_category_id
indexes page.country(:id), as: :page_country_id
indexes page(:verified), as: :page_verified
has page(:id), as: :page_id
has :width
has :height
has :price
end
我需要先查询sphinx,然后再进行活动记录查询。
@sphinx_query = Offer.search Riddle.escape(query), with: has_cond,
conditions: conditions, group_function: :attr, group_by: 'page_id',
star: true, per_page: Page.per_page, page: page
@pages = Page.find(@sphinx_query.map(&:page_id))
答案 1 :(得分:0)
我相信错误将出现在您的搜索查询中。我只是运行了一些测试,一切都按预期工作......范围和没有。
控制器中的搜索代码:
@titles = Title.search(params[:q],
:rank_mode => :bm25,
:match_mode => :any,
:star => true,
:limit => 35,
:with_all => {
:runtime => [75..100],
:year => 1976
})
索引代码:
class Title < ActiveRecord::Base
...
define_index do
# fields
indexes clean_name, :sortable => true
# attributes
has id, year, runtime, created_at, updated_at
end
...
end
搜索结果(JSON)
{
resultList: [
{
director: "Allan Arkush, Joe Dante",
id: 34089,
name: "Hollywood Boulevard",
rating: "R",
runtime: 83,
year: 1976,
text: "Hollywood Boulevard (1976)",
identify: "title"
},
{
director: "Patrick M. Wright",
id: 40875,
name: "Hollywood High",
rating: "R",
runtime: 81,
year: 1976,
text: "Hollywood High (1976)",
identify: "title"
}
],
resultCount: 2
}
对于我正在进行的项目,它不使用连接表 - 但这不重要。除了正在执行的连接之外,索引仍然相同。