思考Sphinx - 仅对特定索引进行通配符搜索

时间:2011-12-06 16:29:22

标签: ruby-on-rails sphinx wildcard thinking-sphinx rails-3.1

我在我的Rails 3.1 environemt上运行思考-sphinx 2.0.10,索引和搜索效果非常好。 当我在我的用户模型上搜索时,我想对用户的名字进行通配符搜索 但不在电子邮件上,因此只有在给定的搜索字符串与用户的电子邮件完全匹配时才应返回用户。 我做了一些研究,发现可以通过在

中启用define_index块中的通配符搜索来完成
set_property :enable_star => true
set_property :min_infix_len => 1

并将:infixes => true添加到应支持通配符搜索的索引

define_index do

  indexes "CONCAT(first_name, ' ', last_name)", :as => :user_name,  :infixes => true
  indexes email

    has :id, :as => :user_id
    
    set_property :enable_star => true
    set_property :min_infix_len => 1
end

这来自autogenerated development.sphinx.conf

index user_core
{
  source = user_core_0
  path = /../../../../db/sphinx/development/user_core
  charset_type = utf-8
  min_infix_len = 1
  infix_fields = user_name
  enable_star = 1
}

我猜错了infix_fields

问题是,如果我搜索“.com”,我仍然会收到所有带有.com电子邮件地址的用户。 可能是什么原因?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

Sphinx对输入中的单词进行索引。通常只有整个单词,但可以启用带有中缀/前缀的部分单词。

无论如何,在charset_table中没有定义的任何东西(你没有这样的默认值),是一个分隔符。

所以“。”是一个分隔符。因此,您的电子邮件将被编入索引。 “com”本身就是一个词。

所以搜索“.com”只是搜索“com” - 即仍然是一个完整的单词匹配。

你可以添加“。”到你的charset表来解决这个问题。 (但要注意它是否用作数据中的分隔符。如果只是索引名称和电子邮件,可能不是问题)。可能也想添加@,以便整个电子邮件可以被索引为一个'单词'。


我不知道如何把它作为你的ruby配置,我只知道它需要最终在sphinx conf文件中。