Ho una tabella SQLite che è stata generata utilizzando il modulo FTS4. Ogni voce è elencata almeno due volte con lingue diverse, ma continua a condividere un ID univoco (colonna int, non indicizzata). Ecco cosa voglio fare: Voglio cercare un termine in una lingua preferita. Voglio unire il risultato con una ricerca per lo stesso termine usando un'altra lingua. Per la seconda ricerca, però, voglio ignorare tutte le voci (identificate dal loro ID) che ho già trovato durante la prima ricerca. Quindi in pratica voglio fare questo:SQLite FTS4 con lingua preferita
WITH term_search1 AS (
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 1)
SELECT *
FROM term_search1
UNION
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 2
AND id NOT IN (SELECT id FROM term_search1)
Il problema qui è che la query term_seach1 verrebbe eseguita due volte. C'è un modo per materializzare i miei risultati, forse? Qualsiasi soluzione per limitarla a 2 query (anziché 3) sarebbe ottima.
Ho anche provato ad utilizzare query ricorsive, qualcosa di simile:
WITH RECURSIVE term_search1 AS (
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 1
UNION ALL
SELECT m.*
FROM myFts m LEFT OUTER JOIN term_search1 t ON (m.id = t.id)
WHERE myFts MATCH 'term'
AND m.languageId = 2
AND t.id IS NULL
)
SELECT * FROM term_search1
Ciò non ha funzionato né. Apparentemente ha appena eseguito due ricerche per languageId = 2 (è forse un errore?).
Grazie in anticipo :)
Ciao, bene fino ad oggi la creazione di una tabella temporanea è apparentemente l'unica soluzione che in qualche modo affronta il problema (sembra ancora un killer delle prestazioni quando viene eseguito spesso). Informazioni sulle cose relative allo schema .. languageId non è in realtà la mia colonna "propria". Fa parte della funzionalità FTS (una colonna nascosta). Secondo la documentazione FTS "Non è possibile per una singola query FTS restituire righe con valori languageid diversi":/Ecco perché ho sempre bisogno di almeno 2 query per questo. – Peach
La creazione di una tabella temporanea è sicuramente un sovraccarico, ma potrebbe comunque essere performante. Sfortunatamente, il mio SQLite non è in grado di creare un FTS4 con estensione languageid, quindi non posso profilare le query.Qualche ragione particolare per cui hai bisogno di diversi tokenizer e non usi l'unicode61 predefinito? – Paras