0

我在我的 Rails 3.1 环境中运行thinking-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

这是来自自动生成的 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 电子邮件地址的用户。 这可能是什么原因?

谢谢你的帮助!

4

1 回答 1

3

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

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

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

所以搜索“.com”只是搜索“com”——即仍然是全字匹配。

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


我不知道如何把它放在你的 ruby​​ 配置中,我只知道它需要在 sphinx conf 文件中结束。

于 2011-12-06T18:16:11.653 回答