Hi Pat,
I actually got that far, my issue was with having different attributes
ORed.
The problems I was having when I tried to run the search were as follows:
1. A bar has multiple profiles and each profile has a budget, experiece and
tags. I needed the search to be able to give me back bars only if it had a
profile for the current day that matched the budget and experience
specified. If I made indexes for day, experience and budget as I said in
email 1, then put them as conditions in the search. What it would return is
bars that had profiles that combined contained that budget and experience,
so if I wanted budget penniless and experience ravin on monday it would
return the bar if it had a profile for monday and one of its profiles
contained ravin and any other contained penniless.
Then I tried using the 'with' clause and created a day_id to filter on. But
then when I did this it only checked the first profile for that bar, if it
wasn't the right day it wouldn't return anything. So basically if I had a
bar and I saved the profiles to the DB in this order tuesday, monday,
thursday and wanted to check against thursday profiles it would never check
the thursday profile for this bar. It would only check if the order the
bar_profiles were added to the db started with that day. So it would have
to be thursday, monday, wednesday.
This led me to believe I probably just didn't understand how this was
supposed to be working. It seems like it works like this, conditions happen
first to populate a collection to be filtered using the with clause. So if
I wanted to find a day with the specific budget experience tags I have to
have id numbers for each of those and put them in the with clause and the
day as the condition.
(I know I am leaving off stuff in the search_options hash I am just showing
the relevant info)
So I was doing:
search_options = { conditions=>{:budget=>budget, :experience=>},
with=>{:day=>day_id}, ...}
When I think I need to do:
search_options = { conditions=>{:day=>today},
with=>{:budget=>budget(number val), :experience=>experience(number val)},
...}
The problems is how the tables were set up to use thinking sphinx weren't
configured to run the right search because they didn't understand how to do
it either.
The problem with ORing was like I said between condition values (not just
within one condition)
So if I wanted all users that were 23 OR white I can't just run
search_options = {conditions={:age=>23, race=>"white"}, ...}
Because this only returns users that are 23 AND white, since there is only
1 profile associated with each user. That was the problem I had, I ended up
just coding up additional functions and had to run multiple queries. I
wanted to try to figure out how to do all this with the correct
implementation of sphinx. But I also had to ensure I didn't break any of
the functionality based the current db set up. Either way I did figure it
out. But if you could explain either of these I know it would help others.
I couldn't find any specific examples explaining solutions to these issues.
Your thinking_sphinx documentation is very thorough but there weren't any
implementation examples, just 1 line code snippets. Implementation examples
are extremely helpful in explaining the correct implementation of this
query engine. I am only so curious because I do want to know how to use
this correctly because it seems like something I should be using on future
projects. Thanks again for getting back to me. My project is done using
this, but if you could give some insight on these issues it would still be
really helpful.
Thanks,
Alan
On Thursday, February 7, 2013 5:30:56 PM UTC-8, Pat Allan wrote:
>
> Hi Alan
>
> It's not so much that Thinking Sphinx ANDs conditions, but rather Sphinx
> just treats that as the default. You can't change this default, but you can
> have multiple values for a condition handled in an OR manner like so:
>
> tags = ['foo', 'bar', 'baz']
> Model.search :conditions => {:tags => "(#{tags.join(' | ')})"}
>
> In Sphinx's syntax, that becomes "@tags (foo | bar | baz)"
>
> Is that what you're after?
>
> Cheers
>
> --
> Pat
>
> On 07/02/2013, at 7:18 AM, Alan DeLonga wrote:
>
> > Hey Pat,
> >
> > Thanks for responding. I had to build up a simple app to test thinking
> sphinx to understand how it actually worked in my specific application. It
> was really difficult trying to jump into a project assuming their
> implementation was correct when nothing was set up right. Basically what I
> began to understand was the following.
> >
> > For the 'with' to work it HAS to be a number. Converting with CRC32
> wasn't working for me because the numbers created for day names like
> monday, tuesday, etc. were being converted to numbers larger then what an
> int could hold (so it was always depricated to the int cap which is like
> 2147483647). So for the constraining factors I had to create additional
> fields like day_id, in the DB, so it was only a number 1-7. Then I would
> check against it with the current day by creating an array and do an
> indexOf with the current day value.
> >
> > The next thing I had to do was understand how the conditions worked. It
> seems like all the (value/condition) strings had to be present in the db
> row for a match to be made. So what I had to do was then only add the
> tag/string that should always match. So I had to run the search with budget
> as the only condition. Then go through the list of tags (add it as a
> condition) and run the search and remove that condition, for each tag. If I
> tried to run the search using all tags, it would only return a bar if ALL
> the tags matched not 1.
> >
> > But I also read that is because the default of thinking sphinx is to AND
> the conditions. To OR them you have to add something else, but I didn't
> figure that out. If you have the time to maybe shed some light on how to OR
> the values put into conditions that would be helpful. Again I appreciate
> the response.
> >
> > Thanks,
> >
> > Alan
> >
> > On Friday, February 1, 2013 4:27:14 PM UTC-8, Pat Allan wrote:
> > Hi Alan
> > There's a lot to take in there, but I think the core of the issue you're
> currently facing comes down to the fact that you're using a string
> attribute, and Sphinx doesn't let you filter by attributes (:conditions is
> for fields, :with is for attributes). There's a note buried in the docs
> about this:
> > http://pat.github.com/ts/en/common_issues.html#string_filters
> >
> > I would probably recommend switching days to be field instead, and just
> use conditions.
> >
> > Let me know how it goes and whether there's further questions.
> >
> > Cheers
> >
> > --
> > Pat
> >
> >
> > On 01/02/2013, at 12:49 PM, Alan DeLonga wrote:
> >
> > > Hey Pat,
> > >
> > > I have been wrestling with an outsourced project that they brought
> back in house. They used Thinking Sphinx, without giving any documentation
> or comments in their code about how they set things up or what they were
> trying to achieve. After months of hacking away at this app, its 95%
> finished. The last part I am having difficulty fixing is getting the search
> to constrain the results correctly. I am super new to this and would
> appreciate any insight you could give me. So here is my issue on
> stackoverflow, and I will elaborate below as well.
> > >
> > > So basically the issue is between 3 models/tables users, bars and
> bar_profiles. There are bar_profiles for each bar, that contains the
> criteria we are matching against the users criteria. There is a bar_profile
> for each day, containing the criteria to match against for the users
> selections.
> > >
> > > Inside bar is where the search is happening so they set up indexes for
> bar_profiles as follows:
> > >
> > > has_many :bar_profiles
> > >
> > > define_index do
> > >
> > > has bar_profiles
> > > (:day), :as => :
> > > days
> > > indexes bar_profiles
> > > .budget, :as => :budget_tags
> > > indexes bar_profiles.day, :as => :
> > > day
> > > indexes bar_profiles
> > > .tags, :as => :daily_tags
> > > .
> > >
> > >
> > > .
> > >
> > >
> > > end
> > >
> > > and in the method that runs the search I have:
> > >
> > > today = ((Time.now +
> Time.zone_offset('EST')).strftime("%A")).downcase
> > > search_options = {:conditions => {}, :with => {:days=>today},
> :page => 1, :per_page => algorithm.results_per_page}
> > >
> > > search_options[:conditions][:experience_tags] =
> options[:experience] unless options[:experience].blank?
> > > budget = combine_budgets(options[:budget])
> > > search_options[:conditions][:budget_tags] = budget unless
> budget.blank?
> > >
> > > What I am trying to do is match the options[...] that the user selects
> against the bar_profile that matches up with the current day. The current
> set up allows the search to run without errors using:
> > >
> > > bars = Bar.search(search_options)
> > >
> > > But when I added in the :with=> {:days=>today}, I stopped getting any
> results back from the search. So I am guessing I just don't fully
> understand how to use 'with' in Thinking Sphinx for my exact
> implementation. What I am trying to do is make the search constrain the
> results based on the current day.
> > >
> > > Where my goal would be if I don't pass in any conditions, it would
> return all the bars with a profile for today. If I have a condition for
> budget_tag = low budget, I only want to get back bars that have a
> bar_profile for today that contains that budget_tag.
> > >
> > > Currently without the 'with' option it will return any bar that has
> ANY bar_profile that has one of the match criteria. So I am getting a bar
> that has the criteria, but for the wrong day.
> > >
> > > If you could help guide me to some examples or give some insight I
> would really appreciate it. I have been wrestling with this issue for a
> week now and I have gotten to this point but still can't seem to get the
> functionality I need. I know I am doing something wrong, I just don't
> really understand how to correct it. Either way I appreciate you taking the
> time to read this.
> > >
> > > Thanks,
> > >
> > > Alan
> > >
> > >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups "Thinking Sphinx" group.
> > > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> > > To post to this group, send email to [email protected].
> > > Visit this group at
> http://groups.google.com/group/thinking-sphinx?hl=en.
> > > For more options, visit https://groups.google.com/groups/opt_out.
> > >
> > >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "Thinking Sphinx" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected] <javascript:>.
> > To post to this group, send email to
> > [email protected]<javascript:>
> .
> > Visit this group at http://groups.google.com/group/thinking-sphinx?hl=en
> .
> > For more options, visit https://groups.google.com/groups/opt_out.
> >
> >
>
>
>
>
--
You received this message because you are subscribed to the Google Groups
"Thinking Sphinx" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.