Questa è la soluzione che ha funzionato meglio (dal linked question). Fondamentalmente, è possibile rimuovere un pezzo della query principale sql_query
e definirlo separatamente come sql_joined_field
nel file sphinx.conf
.
È importante aggiungere tutte le condizioni sql pertinenti a ogni sql_joined_field
(come gli indici di sharding per modulo sull'ID). Ecco la nuova definizione:
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: false,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: true,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND incidents.delta = 1 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
La magia che definisce il campo site
come una query separata è l'opzione source: :query
alla fine della linea.
Si noti che la definizione dell'indice di base ha il parametro delta?: false
, mentre la definizione dell'indice delta ha il parametro delta?: true
. È così che potrei usare la condizione WHERE incidents.delta = 1
nell'indice delta e filtrare i record non pertinenti.
Ho trovato che lo sharding non ha funzionato meglio, quindi sono tornato a un indice unificato.
Vedere l'intera definizione dell'indice qui: https://gist.github.com/jonsgold/05e2aea640320ee9d8b2.
Importante da ricordare!
L'offset ID documento Sfinge deve essere gestito manualmente. Cioè, ogni volta che viene aggiunto o rimosso un indice per un altro modello, il mio ID documento calcolato cambierà. Questo deve essere aggiornato.
Così, nel mio esempio, se ho aggiunto un indice per un modello diverso (non :incident
), avrei dovuto correre rake ts:configure
per scoprire il mio nuovo offset e modificare incidents.id * 51 + 7
conseguenza.
Grazie, sembra un buon punto di partenza. – Jonathan
Sembra che i campi uniti possano risolvere meglio il mio problema di indicizzazione delle prestazioni: http://sphinxsearch.com/docs/current.html#conf-sql-joined-field. Qualche idea su come implementarlo in TS? – Jonathan
Guardando più da vicino l'avviso di stato ora ha già raggiunto la query, hai modificato l'essenza? Se non dispiace, non l'ho notato. Anche i campi uniti sono utili, scusa non so se TS può abilitarne l'uso. – barryhunter