我有一个模型practice_test_result
,我为其定义了索引如下:
ThinkingSphinx::Index.define :practice_test_result, with: :active_record, delta: true do
indexes [student.first_name, student.last_name], :as => :student_name
set_property :min_infix_len => 1
end
在下面列出的某些情况下,搜索测试结果会返回意外结果:
> PracticeTestResult.search('x').map{|x| x.student.name }
=> []
这是符合预期的,因为没有一个学生名字中有'x'。
> PracticeTestResult.search('p').map{|x| x.student.name }
=> ["Jane Doe", "Jane Doe", "David Doe", "Timothy Doe", "Jane Doe"]
这是不可取的,因为没有一个学生名字中有'p'。
> PracticeTestResult.search('ti').map{|x| x.student.name }
=> ["Jane Doe", "Jane Doe", "David Doe", "Timothy Doe", "Jane Doe"]
再次不如期望;应该只返回一个值Timothy Doe
。
> PracticeTestResult.search('tim').map{|x| x.student.name }
=> ["Timothy Doe"]
按预期工作。
有关如何调试此问题的任何建议?这可能是因为min_infix_len设置得太低而不是1?
Sphinx版本:Sphinx 2.1.7-release (rel21-r4638)
Thinking-Sphinx版本:3.1.1
数据库:MySql
Rails版本:3.2.13
答案 0 :(得分:2)
您所面临的情况仅在您的模型中具有继承列(默认情况下名为type
)时才会发生(无论您是否将其用于STI - Thinking Sphinx can can不知道了。
为了允许查询STI层次结构的某些子类,Thinking Sphinx添加了一个名为sphinx_internal_class_name
的字段,用于将搜索结果限制为某些模型。在您的情况下,它将包含'PracticeTestResult'
- 因此,ti
和p
将返回所有对象。
正如您所发现的,解决方法是将查询限制在特定字段。
值得注意的是,在早期版本的TS v3.0.x中,此内部字段始终存在。鉴于它只在STI发挥作用时才有用,除非必要,否则它现在不会被添加。