A little update:
I'm currently running the latest development version of thinking-sphinx from
github, riddle 2.2.0, and told sphinx to treat the uuid keys as strings.
Configuration generates now, but I'm getting the same error I was when I
locally patched my gem version before I reached out -- whenever I try to
save a new instance of my indexed model it fails with this stack trace:
TypeError:
no implicit conversion of Fixnum into String
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/core/index.rb:29:in
`+'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/core/index.rb:29:in
`document_id_for_key'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/deltas/default_delta.rb:16:in
`delete'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb:14:in
`block in after_commit'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb:13:in
`each'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb:13:in
`after_commit'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/thinking-sphinx-9860c9452279/lib/thinking_sphinx/callbacks.rb:7:in
`block (2 levels) in callbacks'
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.8/lib/active_support/callbacks.rb:455:in
`public_send'
Taking a cursory glance at the delete method in DefaultDelta I'm wondering
if this is perhaps possibly the culprit?
def delete(index, instance)
ThinkingSphinx::Deltas::DeleteJob.new(
index.name, index.document_id_for_key(instance.id)
).perform
end
I don't know much about how the pieces of this fit together, but I wouldn't
expect instance.id to be the correct key to fetch on when an alternative
primary key has been defined. I can continue to try to chase this down and
perhaps submit a PR if you think this is likely a bug, or try to find a
minimally reproducing example that I can share so that we can rule out
configuration or environment issues? I'm open to suggestions on how best to
proceed.
~ Melody
On Wednesday, July 19, 2017 at 3:22:37 AM UTC-4, Pat Allan wrote:
>
> It doesn’t look like you have MVAs - the example you shared is a field
> (via the `indexes` method), and your right, the joins using UUID columns to
> get to that data should be fine. The attributes (via the `has` method) you
> have listed, as you’ve noted, are UUIDs and strings should do the trick
> there.
>
> So, maybe Sphinx and TS can actually do what’s needed? Do you want to talk
> about what’s now not working?
>
> Cheers,
>
> —
> Pat
>
> On 19 Jul 2017, at 12:49 pm, Melody B <[email protected] <javascript:>>
> wrote:
>
> I'm not sure whether I need multi-value attributes or not, the only line I
> have in here that's particularly similar to the one you quoted is this:
>
> indexes choices.option.canonical_name, as: :option_names
>
>
> In order to get that data, you would need to join choices and option on
> uuid columns, as all of these models have uuid primary & foreign keys. I
> don't think I have any that do this specifically for ids, I defined these
> to get it to stop crashing on configure:
>
> has response_id, type: :string
> has response.mission_id, type: :string
> has questioning.question_id, type: :string
>
>
> But it still doesn't seem to be working -- this may have more to do with
> my app code than thinking sphinx/sphinx though, I haven't gotten deep into
> sorting it out now that it's no longer completely broken. I'll try updating
> to develop, a newer riddle, and making sure I'm on a good version of sphinx
> (I'm on 2.2.11 locally, and could hopefully update production instances if
> necessary)
>
> I've been getting slowly resigned to the fact that I may need to switch
> search solutions (and actually already tried switching to pg_search because
> in terms of the actual search features we're taking advantage of our needs
> are really very mild and removing an external dependeny seemed like a net
> benefit in terms of future maintenance) but it can't do
> highlighting/excerpting on searches against associations (weird bug) and
> hasn't updated to expose an interface for postgres 9.6's exact phrase
> matching yet. I've been trying to evaluate other solutions, but finding
> info about which ones support the exact weird combination of constraints
> I'm dealing with when they support each thing I want to do separately is a
> bit of a challenge.
>
> In any case, thanks so much for your help!
>
> ~ Melody
>
> On Tuesday, July 18, 2017 at 10:09:35 PM UTC-4, Pat Allan wrote:
>>
>> Hmm. The recent versions of Sphinx do support filtering on string
>> attributes, so you could possibly set the explicit `:type => :string` for
>> attributes based on UUID columns. However, that’ll only work for
>> single-value attributes (and additionally, you’ll want to use the latest in
>> the `develop` branch for TS and ensure the bundled version of the Riddle
>> gem is v2.2.0, as there are some changes around properly quoting string
>> attributes in search queries).
>>
>> If you’re not across the Sphinx terminology, a multi-value attribute
>> (MVA) is essentially an attribute with a data type of array, but the arrays
>> can only hold integers. So, in practice it might look something like the
>> following in a TS index definition:
>>
>> has users.id, :as => :user_ids
>>
>> I’d expect, however, that TS is fine with generating SQL joins across
>> UUID keys - it’s just the actual attribute values being the issue. If you
>> need multi-value UUID attributes, then it feels like your paths are either
>> adding fake foreign keys, or switching to a different search tool - and I’m
>> sure neither of those options are particularly simple. Fingers crossed that
>> you only need single-value attributes for the UUID columns?
>>
>> Feel free to ask any further questions :)
>>
>> —
>> Pat
>>
>> On 19 Jul 2017, at 11:36 am, Melody B <[email protected]> wrote:
>>
>> Thanks, I forgot that I had locked my version to 3.1.x in my gemfile when
>> I tried to update the gem, so I hadn't noticed that I wasn't on the latest.
>> I feel a bit silly now. I'm now getting a different error relating to my
>> foreign keys (which are also uuid) not mapping to a valid sphinx type.
>>
>> Is there a way around this besides adding additional fake foreign keys to
>> go with my fake primary keys and putting those on every model I need sphinx
>> to be aware of? Would there even be a way to configure thinking sphinx so
>> that it tried to find the associated records through those instead?
>> Unfortunately I genuinely do need UUID keys for this app.
>>
>> ~ Melody
>>
>> On Tuesday, July 18, 2017 at 9:11:04 PM UTC-4, Pat Allan wrote:
>>>
>>> Hi Melody,
>>>
>>> There was a couple of commits related to fixing alternative primary keys
>>> that are part of v3.3.0 - I realise if you’re not familiar with this gem or
>>> Sphinx it could be daunting, but I’d recommend upgrading if at all possible.
>>>
>>> The release notes for v3.2.0 and v3.3.0 (the only releases since v3.1.4)
>>> cover off notable changes - I’d say there’s a good chance you won’t hit any
>>> issues though:
>>> https://github.com/pat/thinking-sphinx/releases/tag/v3.2.0
>>> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fpat%2Fthinking-sphinx%2Freleases%2Ftag%2Fv3.2.0&sa=D&sntz=1&usg=AFQjCNHh69DuVoiXcTHiNlQYsZTDWlq_TA>
>>> https://github.com/pat/thinking-sphinx/releases/tag/v3.3.0
>>> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fpat%2Fthinking-sphinx%2Freleases%2Ftag%2Fv3.3.0&sa=D&sntz=1&usg=AFQjCNGTQohrWlNsNkBgQ_IFFcGiTo8UzQ>
>>>
>>> If the error (or something like it) is still happening on v3.3.0, do let
>>> me know!
>>>
>>> Cheers,
>>>
>>> —
>>> Pat
>>>
>>> On 19 Jul 2017, at 8:10 am, Melody B <[email protected]> wrote:
>>>
>>> I'm getting an error on configure:
>>>
>>> Generating configuration to ~/myapp/config/development.sphinx.conf
>>> rake aborted!
>>> NoMethodError: undefined method `<<' for nil:NilClass
>>> ~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:96:in
>>>
>>> `block in append_presenter_to_attribute_array'
>>> ~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:93:in
>>>
>>> `each'
>>> ~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:93:in
>>>
>>> `append_presenter_to_attribute_array'
>>> ~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:131:in
>>>
>>> `prepare_for_render'
>>> ~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:65:in
>>>
>>> `render'
>>>
>>>
>>> I have a few weird things going on in my setup that are (probably?)
>>> having an impact.
>>>
>>> 1. My database is postgres has uuid primary keys
>>> 2. I defined a custom field that generates a bigint in a
>>> before_create callback called secondary_id -- this seemed like the
>>> best way to provide sphinx with something it could index on but if this
>>> is
>>> the wrong way to go about keeping my uuid primary keys i'm open to
>>> alternative suggestions
>>> 3. I set secondary_id as the primary key for sphinx in the index
>>> definition with the following code:
>>> 1. ThinkingSphinx::Index.define :answer, with: :active_record,
>>> primary_key: :proxy_id do ... end
>>>
>>> I'm honestly not sure what's going on here -- I tried poking around in
>>> the code to sort out why this was happening and I tried guarding for nil on
>>> that line allows configuring to finish, but it predictably continues to
>>> explode during actual operation when I create a new instance of :answer --
>>> I knew that was a longshot, but any help would be appreciated. I'm not
>>> particularly experienced with sphinx or thinking-sphinx, I inherited
>>> this project after it was already in place (the move to uuid primary keys
>>> is fairly recent, and this is the last major blocker) so just let me know
>>> if you need any additional info or context.
>>>
>>> --
>>> 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 thinkin...@googlegroups.
>>> <http://googlegroups.com/>com <http://googlegroups.com/>.
>>> Visit this group at https://groups.google.com/group/thinking-sphinx.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>>>
>> --
>> 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 thinking-sphinx+ <javascript:>[email protected]
>> <javascript:>.
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/thinking-sphinx.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>>
> --
> 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 https://groups.google.com/group/thinking-sphinx.
> For more options, visit https://groups.google.com/d/optout.
>
>
>
--
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 https://groups.google.com/group/thinking-sphinx.
For more options, visit https://groups.google.com/d/optout.