Reputation: 5002
I am running thinking-sphinx 2.0.10 on my Rails 3.1 environemt and indexing and searching works pretty well. When im searching on my User model, I want to do a wildcard search on the name of the user but not on the email so a user should only be returned if the given search string exactly matches the email of a user. I did some research and found out that this could be done by enabling the wildcard search within the define_index block with
set_property :enable_star => true
set_property :min_infix_len => 1
and adding :infixes => true
to the indexes which should support wildcard search
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
This is from the 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
}
The infix_fields
are declared correctly I guess.
The problem is that if I search for ".com" I still get all the Users with .com email address. What can be the reason for that?
Thanks for your help!
Upvotes: 0
Views: 966
Reputation: 21091
Sphinx indexes words in the input. Usually whole words only, but can enable part words with infix/prefix.
Anyway, anything not defined in charset_table (you dont have one so taking the default), is a seperator.
So "." is a separator. So your email will be indexed as words. "com" is a word in itself.
So searching for ".com" is just searching for "com" - ie still a whole-word match.
You could just add "." to your charset table to solve this. (but beware if it is used as a seperator in your data. if just indexing name and email, might not be an issue). Might want to add @ too, so that the whole email can be indexed as one 'word'.
I dont know how to put it your ruby config, I just know it needs to end up in the sphinx conf file.
Upvotes: 3