我有一个模型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
最佳答案
您所面临的情况仅当您的模型中有继承列(默认情况下名为 type
)时才会发生(无论您是否将其用于 STI -认为斯芬克斯无法弄清楚这一点)。
为了允许跨 STI 层次结构的某些子类进行查询,Thinking Sphinx 添加了一个名为 sphinx_internal_class_name
的字段,用于将搜索结果限制为某些模型。在您的情况下,它将包含 'PracticeTestResult'
- 因此,ti
和 p
返回所有对象。
正如您所发现的,解决方法是将查询限制在特定字段。
还值得注意的是,在 TS v3.0.x 的早期版本中,此内部字段始终存在。鉴于它仅在 STI 发挥作用时才有用,因此除非必要,现在不会添加它。
关于mysql - Thinking-sphinx 返回不符合标准的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23792862/