mysql - Thinking-sphinx 返回不符合标准的结果

标签 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

最佳答案

您所面临的情况仅当您的模型中有继承列(默认情况下名为 type)时才会发生(无论您是否将其用于 STI -认为斯芬克斯无法弄清楚这一点)。

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

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

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

关于mysql - Thinking-sphinx 返回不符合标准的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23792862/

相关文章:

sql - 优化 SQL 距离查询

ruby-on-rails - Rails - html block 的条件显示

ruby-on-rails - Rails 4 Eager Load has_many 单个对象的关联

ruby-on-rails - 重用 named_scope 来定义另一个 named_scope

perl - 如何确定两个字符串是否大部分相等(在 perl 中)?

php - 如何在 PHP - MySQL 中连接两个表,它们与第二个表中的 ID 匹配,并且仍然在表 1 中显示特定记录?

c# - mysql选择具有一定条件的值

c# - 在 word 文档中搜索/突出显示特定单词

java - 实体/行仅有时使用 Spring/Hibernate 更新?

linq - Sitecore 搜索 : Get results term by term