思考 - 斯芬克斯返回的结果不符合标准

时间:2014-05-21 20:10:48

标签: mysql ruby-on-rails search thinking-sphinx

我有一个模型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

1 个答案:

答案 0 :(得分:2)

您所面临的情况仅在您的模型中具有继承列(默认情况下名为type)时才会发生(无论您是否将其用于STI - Thinking Sphinx can can不知道了。

为了允许查询STI层次结构的某些子类,Thinking Sphinx添加了一个名为sphinx_internal_class_name的字段,用于将搜索结果限制为某些模型。在您的情况下,它将包含'PracticeTestResult' - 因此,tip将返回所有对象。

正如您所发现的,解决方法是将查询限制在特定字段。

值得注意的是,在早期版本的TS v3.0.x中,此内部字段始终存在。鉴于它只在STI发挥作用时才有用,除非必要,否则它现在不会被添加。